JavaScript实现仿QQ折叠菜单的完整代码与调用方法

作者:窗边听雨

时间:2026-10-26

浏览:296

本文介绍如何使用JavaScript实现仿QQ界面的折叠菜单特效。通过动态创建DOM元素并控制CSS样式,利用setInterval实现展开与收起的平滑动画。文章提供了完整的JS类定义代码及HTML调用示例,适合需要实现侧边栏或导航栏折叠效果的开发者参考。

文章目录

JavaScript实现仿QQ折叠菜单的完整代码与调用方法

近期专注于网页特效开发,受QQ界面折叠菜单的启发,尝试独立编写一个类似效果的组件。经检索发现已有不少同类实现,但为了深入理解其原理,仍决定亲自编写并记录实现过程。



以下是html结构:

<div id="a"><div id="h1">sdfds</div><div id="b1">dsfdsfsdfsd</div><div id="h2">dsf</div><div id="b2">dsfdsfsdf</div>.......................</div>


上述HTML结构中,id为a的容器内包含了菜单标题(如h1、h2)与对应的内容区域(如b1、b2)。



下面是javascript代码:

具体实现代码如下:

 
sx.activex.packmenu={
create:function(t){
var a=document.createElement("div");
var _t=t;
a.style.height="300px";
a.style.width="150px";
a.style.border="1px red solid";
a.style.overflow="hidden";
for(var i=0;i<t.length;i++){
var h=document.createElement("div");
var b=document.createElement("div");;
h.style.backgroundColor="blue";
h.style.height="10%";
b.style.padding="5px";
b.style.textAlign="center";
b.style.border="1px green solid";
h.innerHTML=t[i][0];
b.innerHTML=t[i][1];
b.style.overflow="hidden";
b.style.height="0px";
b.style.display="none";
h.onclick=function(){
if(this.nextSibling.style.display=="none"){
this.nextSibling.style.height="1px";
this.nextSibling.style.display="block";
this.h=window.setInterval(function(t,t1){
return function(){
if(!t1) return;
//alert(t.nextSibling.offsetHeight);
if(parseInt(t.nextSibling.style.height)<100-_t.length*parseInt(a.all[0].style.height)-3){
t.nextSibling.style.height=parseInt(t.nextSibling.style.height)+3+"%";
t1.style.height=parseInt(t1.style.height)-3+"%";
} 
else{
t.nextSibling.style.height=100-_t.length*parseInt(a.all[0].style.height)+"%";;
t1.style.display="none";
t1.style.height="0px";
window.clearInterval(t.h);
} 
} 
}(this,(function(){
for(var ii=0;ii<a.all.length;ii++){
if(parseInt(a.all[ii].style.height)>10)
return a.all[ii];
} 
})()),10);
} 
else{
if(this!=this.parentNode.firstChild){
this.previousSibling.style.height="1px";
this.previousSibling.style.display="block";
} 
else{
this.parentNode.lastChild.style.display="block";
this.parentNode.lastChild.style.height="1px";
} 
this.h=window.setInterval(function(t,t1){
return function(){
if(!t1) return;
if(parseInt(t.nextSibling.style.height)>3){
if(t!=t.parentNode.firstChild)
t.previousSibling.style.height=parseInt(t.previousSibling.style.height)+3+"%";
else
t.parentNode.lastChild.style.height=parseInt(t.parentNode.lastChild.style.height)+3+"%";
t1.style.height=parseInt(t1.style.height)-3+"%";
} 
else{
if(t!=t.parentNode.firstChild)
t.previousSibling.style.height=100-_t.length*parseInt(a.all[0].style.height)+"%";
else
t.parentNode.lastChild.style.height=100-_t.length*parseInt(a.all[0].style.height)+"%";
t.nextSibling.style.display="none";
t.nextSibling.style.height="0px";
window.clearInterval(t.h);
} 
} 
}(this,(function(){
for(var ii=0;ii<a.all.length;ii++){
if(parseInt(a.all[ii].style.height)>10)
return a.all[ii];
} 
})()),1);
} 
} 
a.appendChild(h);
a.appendChild(b);
a.all[1].style.display="block";
a.all[1].style.height=100-t.length*parseInt(a.all[0].style.height)+"%";
} 
return a;
} 
} 

入口参数t是你要传递的二维数组,以一个标题加内容为一个数组项的形式:


下面是调用代码:


<html>


<head>


<title>Untitled Document</title>


</head>


<body>


<script src="kongjian.js" ></script>


<script>


var a=sx.activex.packmenu.create([["asd","sadsadas"],["sd","sadsaas"],["w","waedqwdq"],["e","efwefw"]]);


//a.contentEditable=true;


document.body.appendChild(a);


</script>


</body>


</html>


完成上述代码即可实现效果,有兴趣的开发者可测试查看实际表现。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章