由于项目中子页面需要一个小菜单,找一个菜单插件太大材小用,又怕和当前项目中的菜单不兼容,所以动手自己写了一个,我取名为MINIMenu,因为只有几十行代码。。。
HTML代码
<div id="menu">
<div class="menu-item">
<div class="item-title">
<a class="active" href="#">菜单一</a></div>
<ul class="item-ul">
<li><span>|--</span><a href="#">模块1</a></li>
<li><span>|--</span><a href="#">模块2</a></li>
<li><span>|--</span><a href="#">模块3</a></li>
<li><span>|--</span><a href="#">模块4</a></li>
</ul>
</div>
<div class="menu-item">
<div class="item-title"><a href="#">菜单二</a></div>
<ul class="item-ul">
<li><span>|--</span><a href="#">模块1</a></li>
<li><span>|--</span><a href="#">模块2</a></li>
</ul>
</div>
<div class="menu-item">
<div class="item-title">
<a href="#">菜单三</a>
</div>
</div>
</div>
Javascript代码
依赖jquery : <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
/*
* 初始化菜单状态,将所有class包含open的项目显示出来
*/
function MINIMenus(settings){
//默认参数
var defaultSetting = {
animation:"slide", // 设置折叠动画:none 无动画;slide 滑动; fade 淡入淡出
mutex:true, // true(互斥,菜单只能有一个展开),false(不互斥,每个菜单都能展开)
meunId:"#menu",
} ;
$.extend(defaultSetting,settings);
initMenus(defaultSetting.meunId);
bindMenus(defaultSetting.meunId,defaultSetting.mutex,defaultSetting.animation);
}
/**
* [initMenus 初始化菜单,展开所有open的项目]
*
*/
function initMenus(menuID){
$(menuID).find(".item-ul").each(function(){
if($(this).parent().hasClass("open")){
$(this).find("li").show();
}else{
$(this).find("li").hide();
}
});
}
/*
* 绑定点击事件
*/
function bindMenus(menuID,mutex,animation){
$(menuID).find(".item-title").bind("click",function(){
var item=$(this).parent();
listSize = (item.find(".item-ul li")).length;
//判断是否有展开项
if(listSize>0){
if(item.hasClass("open")){
hideItem($(this).next(),animation);
hideAllItems(menuID,mutex,animation);
if(!mutex){
item.removeClass("open");
}
}else{
hideAllItems(menuID,mutex,animation);
showItem($(this).next(),animation);
item.addClass("open");
}
}
});
}
/*
* 折叠所有已展开菜单项
*/
function hideAllItems(menuID,mutex,animation){
if(mutex){
$(menuID).find(".menu-item").each(function(){
if($(this).hasClass("open")){
hideItem($(this).find(".item-ul"),animation);
$(this).removeClass("open");
}
});
}
}
/*
* 折叠指定.item-ul下的li元素
*/
function hideItem(item,animation){
item.find("li").each(function(){
switch(animation){
case "slide":
$(this).slideUp();
break;
case "fade":
$(this).fadeOut();
break;
default:
$(this).hide();
break;
}
})
}
/*
* 展开指定.item-ul下的li元素
*/
function showItem(item,animation){
item.find("li").each(function(){
switch(animation){
case "slide":
$(this).slideDown();
break;
case "fade":
$(this).fadeIn();
break;
default:
$(this).show();
break;
}
})
}
CSS样式
ul{
list-style: none;
padding:0;
margin: 0;
}
#menu{
max-width:14%;
min-height: 500px;
color:#333;
background: #fff;
margin-right:8px;
}
#menu .active{
background: #5eb95e;
color: #fff;
}
.menu-item{
text-align: center;
width: 100%;
cursor: pointer;
margin-bottom:8px;
}
.menu-item a{
padding: 6px 0;
border-top: 1px solid #eee;
background:#e8e8e8;
border-radius: 6px;
display: block;
color:#333;
text-decoration: none;
}
.menu-item a:hover,.menu-item .item-ul a:hover{
background: #5eb95e;
color: #fff;
}
.menu-item .item-ul{
margin-top: 8px;
}
.menu-item .item-ul li{
margin: 5px 0;
}
.menu-item .item-ul span{
display: inline-block;
width: 20%;
}
.menu-item .item-ul a{
display: inline-block;
padding: 5px 0;
background: #e8e8e8;
text-decoration: none;
color: #333;
width: 80%;
border-radius: 5px;
}
.item{
margin-bottom:8px;
}
使用
使用 new MINIMenus({}); 初始化即可
默认参数:
var defaultSetting = {
animation:"slide", // 设置折叠动画:none 无动画;slide 滑动; fade 淡入淡出
mutex:true, // true(互斥,菜单只能有一个展开),false(不互斥,每个菜单都能展开)
meunId:"#menu", //菜单所在的ID
} ;
在.menu-item 加上class='open' 将展开该菜单下的所有子菜单
在 a标签加上class='active' 显示被选中的效果
$(document).ready(function(){
new MINIMenus({
mutex:false,
});
});
效 果
demo演示:
转载请注明:左手代码右手诗 » 基于Jquery写的一个手风琴效果的折叠菜单



