这几天比较空闲所以研究了一下封装的方法,对于我们这些小白来说,封装往往显得高大上,下面我就来讲解下我的封装之路。
原生js封装最简单的tab插件:
html 部分:写了两个包含框一个id为wrap一个为wraps
<div id="wrap">
<ul id="diya">
<li class="on">第一项</li>
<li>第二项</li>
<li>第三项</li>
</ul>
<br clear="all" />
<div class="block">第一部分</div>
<div class="none">第二部分</div>
<div class="none">第三部分</div>
</div>
<div id="wraps">
<ul id="diyas">
<li class="on">第一项</li>
<li>第二项</li>
<li>第三项</li>
</ul>
<br clear="all" />
<div class="block">第一部分</div>
<div class="none">第二部分</div>
<div class="none">第三部分</div>
</div>
css样式部分:
*{ padding:0; margin:0;}
.block{ display:block;}
.none{ display:none;}
#wrap,#wraps{ width:500px; height:230px; overflow:hidden; margin:50px auto;}
#diya,#diyas{ list-style:none;}
#diya li,#diyas li{ width:66px; height:28px; border:1px solid #09C; text-align:center; line-height:28px; float:left; cursor:pointer; margin-right:3px;}
#diyas li:hover{ background:#CCC;}
#diya li.on,#diyas li.on{ background:#9C3;}
#wrap div,#wraps div{ width:498px; height:198px; border:1px solid #000;}
js部分:
首先定义一个插件函数
function tab (id,navul,eve){
}
获取id值下对应的导航元素,和显示元素(此处的id对应的是包含框的id,navul对应的是nav的id,eve对应的事件类型)
function tab(id,navul,eve){
var divs = document.getElementById(id).getElementsByTagName('div');
var lis = document.getElementById(navul).getElementsByTagName('li');
}
事件函数判断(目前只判断点击click和mouseover事件)
// 两个for循环的解释:列如去超市买面包,有多个超市多个面包种类,想要将所有的面包都看一遍
// 第一次循环表示进入到超市中,第二个循环表示查看超市中每个种类的面包
for(var i=0;i<lis.length;i++){
//确定下标
lis[i].indx=i;
// 判断eve的状态并且设置默认的变换方式
if(eve=="click" || eve==null){
// 当前li的点击事件函数
lis[i].οnclick=function(){
for(i=0;i<lis.length;i++){
// 清除所有的nav的li的className
lis[i].className="";
// 将所有的显示内容的div隐藏
divs[i].className="none"
// 当前的li的className赋值为on
this.className="on";
// 当前的div的className赋值为Block
divs[this.indx].className="block";
}
}
}else if(eve=="mouseover"){
lis[i].οnmοuseοver=function(){
for(i=0;i<lis.length;i++){
lis[i].className="";
divs[i].className="none";
this.className="on";
divs[this.indx].className="block";
}
}
}
}
完整代码:可以复制代码去测试一下效果
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>JS封装的选项卡TAB代码</title>
<style type="text/css">
*{ padding:0; margin:0;}
.block{ display:block;}
.none{ display:none;}
#wrap,#wraps{ width:500px; height:230px; overflow:hidden; margin:50px auto;}
#diya,#diyas{ list-style:none;}
#diya li,#diyas li{ width:66px; height:28px; border:1px solid #09C; text-align:center; line-height:28px; float:left; cursor:pointer; margin-right:3px;}
#diyas li:hover{ background:#CCC;}
#diya li.on,#diyas li.on{ background:#9C3;}
#wrap div,#wraps div{ width:498px; height:198px; border:1px solid #000;}
</style>
</head>
<body>
<div id="wrap">
<ul id="diya">
<li class="on">第一项</li>
<li>第二项</li>
<li>第三项</li>
</ul>
<br clear="all" />
<div class="block">第一部分</div>
<div class="none">第二部分</div>
<div class="none">第三部分</div>
</div>
<div id="wraps">
<ul id="diyas">
<li class="on">第一项</li>
<li>第二项</li>
<li>第三项</li>
</ul>
<br clear="all" />
<div class="block">第一部分</div>
<div class="none">第二部分</div>
<div class="none">第三部分</div>
</div>
</body>
</html>
<script type="text/javascript">
tab("wrap","diya","mouseover") //对应的参数为包含框的id以及tab选项卡的id
tab("wraps","diyas")
function tab(id,navul,eve){
//tab效果封装,目前只有两种变换方式,一种为点击事件click(也是默认事件),另外一种为鼠标移过事件mouseover
var divs=document.getElementById(id).getElementsByTagName("div");
var lis=document.getElementById(navul).getElementsByTagName("li");
// 两个for循环的解释:列如去超市买面包,有多个超市多个面包种类,想要将所有的面包都看一遍
// 第一次循环表示进入到超市中,第二个循环表示查看超市中每个种类的面包
for(var i=0;i<lis.length;i++){
//确定下标
lis[i].indx=i;
// 判断eve的状态并且设置默认的变换方式
if(eve=="click" || eve==null){
// 当前li的点击事件函数
lis[i].οnclick=function(){
for(i=0;i<lis.length;i++){
// 清除所有的nav的li的className
lis[i].className="";
// 将所有的显示内容的div隐藏
divs[i].className="none"
// 当前的li的className赋值为on
this.className="on";
// 当前的div的className赋值为Block
divs[this.indx].className="block";
}
}
}else if(eve=="mouseover"){
lis[i].οnmοuseοver=function(){
for(i=0;i<lis.length;i++){
lis[i].className="";
divs[i].className="none";
this.className="on";
divs[this.indx].className="block";
}
}
}
}
}
</script>
此处再添加上jq的tab组件的封装方法
html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>tab组件的封装</title> <script src="jquery-1.11.3.min.js"></script> <script src="tab.js"></script> <style> *{margin:0;padding:0;} ul{list-style:none;} .con{ position:relative; width:600px; height:600px; background:#f00; } .title{ position:absolute; top:0; left:0; background:#f00; color:#fff; } .title ul li{ float:left; width:50px; height:50px; line-height:50px; border:1px solid #f00; } .detail{ width:600px; height:550px; position:absolute; top:50px; left:0; background:#ddd; } .con1,.con2,.con3{ position:absolute; top:0; left:0; width:600px; height:550px; color:#fff; } .con1{ background:#f00; } .con2{ background:yellow; } .con3{ background:blue; } .active{ background:#ddd; display:block; } .tab_item{ display:none; } </style> </head> <body>
<!--data-config传的配置参数--> <div class="con" id="tab" data-config='{ "type":"click", "effect":"fade", "show":1, "auto":1000}'> <div class="title"> <ul class="nav"> <li class="active">tab1</li> <li>tab2</li> <li>tab3</li> </ul> </div> <div class="detail"> <div class="con1 tab_item">第一页</div> <div class="con2 tab_item">第二页</div> <div class="con3 tab_item">第三页</div> </div> </div> <script> $('#tab').Tab(tab); </script> </body> </html>
js部分(可以直接外部引用)(function($){ function Tab(tab){ this.tab = tab; var me = this; //留住this this.config={ type:'click', effect:'default' }; console.log(this.config.type); //将自己设置的参数和默认的config合并保留最新的 this.getConfig()&&$.fn.extend(this.config,this.getConfig()); this.tabNav = this.tab.find('.nav li'); this.tabItem= this.tab.find('.tab_item'); if(this.config.type == 'click'){ this.tabNav.bind(this.config.type,function(e){ me.currentChange($(this)); }) }else{ this.tabNav.bind('mouseover',function(){ me.currentChange($(this)); }) } } Tab.prototype={ // 获得配置参数 getConfig:function(){ var config = this.tab.attr('data-config'); if(config&&config!=null){ return($.parseJSON(config)); }else{ return null; } }, currentChange:function(cur){ var index = cur.index(); cur.addClass('active').siblings().removeClass('active'); if(this.config.effect==="default"){ this.tabItem.eq(index).addClass("active").siblings().removeClass("active");//为当前元素添加active,移除兄弟元素的active }else if(this.config.effect==="fade"){ this.tabItem.eq(index).stop().fadeIn().siblings().stop().fadeOut(); } } } // 扩展参数到jQuery方法上,实现链式调用,如$('xx').Tab().css() $.fn.extend({ Tab:function(){ this.each(function(){ new Tab($(this)); }); return this; //jQuery链式调用 } }); // 注册全局变量 window.Tab=Tab; })(jQuery)