JQuery制作的选项卡改进版
记得去年刚开始在博客园写日志第一篇文章就是关于选项卡的,题目叫《JQuery制作的选项卡,重点体现在JS与HTML的分离》。最近做项目的时候,再回头看这段代码感觉写得太零散,所有方法函数都是全局函数,没用整合成一个完整的方法。这样的后果就是不便于管理,代码拷贝的时候容易遗漏,而且方法写得太死,扩展性不好。所以趁着这次做新项目,把这个效果改进下封装成一个完整的方法。
演示地址:http://www.myliwu.com/xzwBlog/tab/Tab.html
老规矩,首先分析Html(我一直认为良好的html结构是实现好程序的基石)
1 <!-- 包裹选项卡的父级层 -->
2 <div class="">
3 <!-- 选项卡列表,ul外用一个宽度足够长的div包裹,做为遮罩层,让里面的ul列表在一行显示而不会折行 -->
4 <div style="">
5 <ul class="">
6 <li><span>选项卡标签 1</span></li>
7 <li><span>选项卡标签 2</span></li>
8 <li><span>选项卡标签 3</span></li>
9 </ul>
10 </div>
11 <!-- 包裹内容层的父级层 -->
12 <div class="">
13 <!-- 具体的内容层 -->
14 <div class="">1.1</div>
15 <div class="">1.2</div>
16 <div class="">1.3</div>
17 </div>
18 </div>
19
2 <div class="">
3 <!-- 选项卡列表,ul外用一个宽度足够长的div包裹,做为遮罩层,让里面的ul列表在一行显示而不会折行 -->
4 <div style="">
5 <ul class="">
6 <li><span>选项卡标签 1</span></li>
7 <li><span>选项卡标签 2</span></li>
8 <li><span>选项卡标签 3</span></li>
9 </ul>
10 </div>
11 <!-- 包裹内容层的父级层 -->
12 <div class="">
13 <!-- 具体的内容层 -->
14 <div class="">1.1</div>
15 <div class="">1.2</div>
16 <div class="">1.3</div>
17 </div>
18 </div>
19
样式代码就不放上来了,大家用firebug看效果更好。
接着是程序代码:
1 j.fn.tabs = function(tabList,tabTxt,options){
2 var _tabList = j(this).find(tabList);
3 var _tabTxt = j(this).find(tabTxt);
4
5 //为了简化操作,强制规定选项卡必须用li标签实现
6 var tabListLi = _tabList.find("li");
7 var defaults = {currentTab:0,defaultClass:"Current"};
8 var o = j.extend({},defaults,options);
9 _tabList.find("li:eq("+o.currentTab+")").addClass(o.defaultClass);
10
11 //强制规定内容层必须以div来实现
12 _tabTxt.children("div").each(function(i){
13 j(this).attr("id","div"+i);
14 }).eq(o.currentTab).css({"display":"block"});
15
16 tabListLi.each(
17 function(i){
18 j(tabListLi[i]).click(
19 function(){
20 if(j(this).className != o.defaultClass)
21 {
22 j(this).addClass(o.defaultClass).siblings().removeClass(o.defaultClass);
23 }
24 _tabTxt.children("div").eq(i).css({"display":"block"}).siblings().css({"display":"none"});
25 }
26 )
27 }
28 );
29 return this;
30 };
2 var _tabList = j(this).find(tabList);
3 var _tabTxt = j(this).find(tabTxt);
4
5 //为了简化操作,强制规定选项卡必须用li标签实现
6 var tabListLi = _tabList.find("li");
7 var defaults = {currentTab:0,defaultClass:"Current"};
8 var o = j.extend({},defaults,options);
9 _tabList.find("li:eq("+o.currentTab+")").addClass(o.defaultClass);
10
11 //强制规定内容层必须以div来实现
12 _tabTxt.children("div").each(function(i){
13 j(this).attr("id","div"+i);
14 }).eq(o.currentTab).css({"display":"block"});
15
16 tabListLi.each(
17 function(i){
18 j(tabListLi[i]).click(
19 function(){
20 if(j(this).className != o.defaultClass)
21 {
22 j(this).addClass(o.defaultClass).siblings().removeClass(o.defaultClass);
23 }
24 _tabTxt.children("div").eq(i).css({"display":"block"}).siblings().css({"display":"none"});
25 }
26 )
27 }
28 );
29 return this;
30 };
最后是调用:
1 j(document).ready(function(){
2 j("#ex01").tabs(".ContactMenu",".ContactBox",{currentTab:0});
3 j("#ex01").find(".exContent2").tabs(".ContactMenu2",".ContactBox2",{currentTab:0});
4
5 j("#ex02").tabs(".ContactMenu",".ContactBox",{currentTab:1});
6 j("#ex02").find(".exContent2").tabs(".ContactMenu2",".ContactBox2",{currentTab:1});
7 });
2 j("#ex01").tabs(".ContactMenu",".ContactBox",{currentTab:0});
3 j("#ex01").find(".exContent2").tabs(".ContactMenu2",".ContactBox2",{currentTab:0});
4
5 j("#ex02").tabs(".ContactMenu",".ContactBox",{currentTab:1});
6 j("#ex02").find(".exContent2").tabs(".ContactMenu2",".ContactBox2",{currentTab:1});
7 });
OK,搞定。代码实现方式都不难,有点jquery基础的一看就明白了。关键是如果没有业务需求,可能就不会促使我们去发现旧问题的不足,以及想新思路新方法来改进它。一句话:业务需求促进技术更新。