基于jQuery实现Accordion手风琴自定义插件
目前网上有很多各种各样的手风琴插件,但是没有一个完整实现了的侧菜单,今天写了一个可以无限子节点的手风琴侧菜单,有需要的可以参考一下,有什么好的想法可以留言。(没有经过彻底测试,不过问题应该不大)
下面老规矩,直接贴代码:
(function($){
'usestrict';
vardefaults={
url:null,
param:{},
data:{},
fill:true,
level_space:15,
onitemclick:null,
style:{
header:"accordion-header",
header_title:"accordion-header-title",
content:"accordion-content",
selected:"selected",
icon_base:"fa",
icon_collapse:"fa-angle-up",
icon_expand:"fa-angle-down"
}
}
varmethods={
init:function(options){
returnthis.each(function(){
var$this=$(this);
if(!$this.hasClass("accordion")){
$this.addClass("accordion");
}
varsettings=$this.data('tw.accordion');
if(typeof(settings)=='undefined'){
settings=$.extend({},defaults,options);
$this.data('tw.accordion',settings);
}else{
settings=$.extend({},settings,options);
$this.data('tw.accordion',settings);
}
if(settings.url){
$.ajax({
type:"post",
async:false,
url:settings.url,
data:settings.param,
success:function(data){
settings.data=data;
}
});
}
if(settings.fill){
$this.height("100%");
}
if(settings.data.length>0){
$this.data("count",settings.data.length);
$.each(settings.data,function(){
this.level=1;
varitem=$this.accordion("add",this);
$this.append(item);
});
if($this.find("."+settings.style.selected).length==0){
vardata=$this.find(">li:first-child").data("data");
$this.accordion("select",data);
}
}
});
},
add:function(data){
var$this=$(this);
varsettings=$this.data("tw.accordion");
varitem=$("<liclass='"+settings.style.header+"'></li>");
item.data("data",data);
varheader=$("<divclass='"+settings.style.header_title+"'data-accordion='"+data.id+"'>"+
"<iclass='"+settings.style.icon_base+""+data.icon+"'></i>"+
"<span>"+data.name+"</span></div>");
header.css("padding-left",settings.level_space*data.level);
item.append(header);
if(data.childrens){
vartoggle=$("<iclass='"+settings.style.icon_base+""+settings.style.icon_collapse+"'></i>");
toggle.css({"font-size":"1.4em","position":"absolute","top":"7px","right":"7px"});
header.append(toggle);
varcontent=$("<ulclass='"+settings.style.content+"'></ul>");
content.data("count",data.childrens.length);
$.each(data.childrens,function(){
this.level=data.level+1;
varchild=$this.accordion("add",this);
content.append(child);
});
item.append(content);
}
header.click(function(){
$this.accordion("select",data);
});
if(data.selected){
$this.accordion("select",data);
}
returnitem;
},
select:function(data){
var$this=$(this);
varsettings=$this.data("tw.accordion");
varheader=$this.find("[data-accordion='"+data.id+"']");
varitem=header.parent();
if(!header.hasClass(settings.style.selected)&&!item.hasClass(settings.style.selected)){
varsibling=item.siblings();
sibling.removeClass(settings.style.selected).children("."+settings.style.selected).removeClass(settings.style.selected);
sibling.children("."+settings.style.icon_expand).removeClass(settings.style.icon_expand).addClass(settings.style.icon_collapse);
if(data.childrens){
item.addClass(settings.style.selected);
header.find("."+settings.style.icon_collapse).removeClass(settings.style.icon_collapse).addClass(settings.style.icon_expand);
if(settings.fill){
varcount=item.parent().data("count")-1;
item.css("height","calc(100%-"+(item.height()*count)+"px)");
}
}else{
header.addClass(settings.style.selected);
}
}
if(settings.onitemclick){
settings.onitemclick(data);
}
},
update:function(url,param){
var$this=$(this);
varsettings=$this.data("tw.accordion");
if(typeofurl=="object"){
settings.param=url;
}else{
settings.url=url;
settings.param=param;
}
$this.accordion("init",settings);
},
destroy:function(options){
return$(this).each(function(){
var$this=$(this);
$this.removeData('accordion');
});
}
}
$.fn.accordion=function(){
varmethod=arguments[0];
varargs=arguments;
if(typeof(method)=='object'||!method){
method=methods.init;
}elseif(methods[method]){
method=methods[method];
args=$.makeArray(arguments).slice(1);
}else{
$.error('Method'+method+'doesnotexistontw.accordion');
returnthis;
}
returnmethod.apply(this,args);
}
})(jQuery);
.accordion{
margin:0;
padding:0;
font-size:14px;
}
.accordion>.accordion-header{
list-style:none;
margin:0;
padding:0;
border-bottom:1pxsolid#ddd;
}
.accordion>.accordion-header.selected>.accordion-header-title{
color:#0094ff;
}
.accordion>.accordion-header>.accordion-header-title{
position:relative;
width:100%;
height:35px;
line-height:35px;
background:#eee;
border-bottom:1pxsolid#ccc;
cursor:pointer;
}
.accordion>.accordion-header>.accordion-header-title>i:first-child{
font-size:1.3em;
}
.accordion>.accordion-header>.accordion-header-title>span{
position:relative;
top:-1px;
left:5px;
}
.accordion>.accordion-header>.accordion-content{
display:none;
width:100%;
height:calc(100%-35px);
margin:0;
padding:0;
}
.accordion>.accordion-header.selected>.accordion-content{
display:block;
}
.accordion-content>.accordion-header{
list-style:none;
margin:0;
padding:0;
}
.accordion-content>.accordion-header.selected{
color:#0094ff;
}
.accordion-content>.accordion-header>.accordion-header-title{
position:relative;
width:100%;
height:32px;
line-height:32px;
cursor:pointer;
border-bottom:1pxsolid#ccc;
}
.accordion-content>.accordion-header>.accordion-header-title:hover{
background:#eee;
}
.accordion-content>.accordion-header>.accordion-header-title.selected{
color:#fff;
background:#0094ff;
border-left:3pxsolid#ff6a00;
border-bottom:0px;
}
.accordion-content>.accordion-header>.accordion-header-title>i:first-child{
font-size:1.2em;
}
.accordion-content>.accordion-header>.accordion-header-title>span{
position:relative;
top:-1px;
left:5px;
}
.accordion-content>.accordion-header>.accordion-header-title.selected>i:first-child{
position:relative;
left:-3px;
}
.accordion-content>.accordion-header>.accordion-header-title.selected>span{
position:relative;
top:-1px;
left:2px;
}
.accordion-content>.accordion-header>.accordion-content{
display:none;
width:100%;
height:calc(100%-32px);
margin:0;
padding:0;
}
.accordion-content>.accordion-header.selected>.accordion-content{
display:block;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。