miqi2214.cnblogs.com
Close Menu

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 

样式代码就不放上来了,大家用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 };

最后是调用:

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 });

OK,搞定。代码实现方式都不难,有点jquery基础的一看就明白了。关键是如果没有业务需求,可能就不会促使我们去发现旧问题的不足,以及想新思路新方法来改进它。一句话:业务需求促进技术更新。

演示地址:http://www.myliwu.com/xzwBlog/tab/Tab.html


posted @ 2009-04-14 16:29 徐秀才 阅读(2800) 评论(12) 编辑 收藏

 回复 引用   
#1楼2009-04-22 23:59 | Shawphy
我不太确定ul外面加上个div是不是有意义,是否可以省去?
 回复 引用 查看   
#2楼[楼主]2009-04-23 09:21 | 徐秀才      
@Shawphy
先前我解释错了,我删掉回复了。这里重新解释:
恩,这个层从语义上说的确没多大意思。但在实际操作中,如果要让一排浮动菜单不换行,就靠它了。这里一两句怕说不清楚,等我这两天有空了发个日志把这个问题说明清楚:)

 回复 引用 查看   
#3楼[楼主]2009-04-23 11:47 | 徐秀才      
关于这个div,请看这里有解释:http://www.cnblogs.com/miqi2214/archive/2009/04/23/1441912.html
 回复 引用 查看   
#4楼2009-04-30 15:19 | java_jesse      
能不能把这个源文发给我,让我学习学习,谢谢
 回复 引用 查看   
#5楼[楼主]2009-04-30 16:03 | 徐秀才      
@java_jesse
就是考虑的为了便于大家交流,所以我每个demo都做的很干净,除了最下面的三个图片签名外,其余的代码都是源码。你照着css、js文件的路径把两个文件下载,结合demo.html就能看到效果。多动手拼拼代码,提升会更快的:)

 回复 引用 查看   
#6楼2009-04-30 17:24 | java_jesse      
最上面的两个选项卡的背景没有.是为什么?CSS问题?我加个了个背景就是整行出现.不是像你那样点中一个是变为别的颜色.是为什么?
 回复 引用 查看   
#7楼[楼主]2009-04-30 19:10 | 徐秀才      
--引用--------------------------------------------------
java_jesse: 最上面的两个选项卡的背景没有.是为什么?CSS问题?我加个了个背景就是整行出现.不是像你那样点中一个是变为别的颜色.是为什么?
--------------------------------------------------------
1.是有个背景图片,这个背景图片是将整个项目所用的按钮图片整合在一起的,通过background-position属性来定位不同具体按钮图片的坐标;2.整行出现可能是因为你css没调用完整吧;3.点击换色,是通过js控制li的样式变化lai达到变色。默认时,li没样式;点击后,li的class="Current"即高亮的样式:)

 回复 引用 查看   
#8楼2009-12-25 15:01 | to be or not      
@java_jesse
建议使用firefox结合firebug查看

 回复 引用 查看   
#9楼2009-12-25 15:49 | to be or not      
_tabTxt.children("div").eq(i).css({"display":"block"}).siblings().css({"display":"none"});
这句我在看你以前那个版本也是这么改写 同感!

 回复 引用 查看   
#10楼2009-12-27 10:39 | to be or not      
11 //强制规定内容层必须以div来实现
12 _tabTxt.children("div").each(function(i){
13 j(this).attr("id","div"+i);
14 }).eq(o.currentTab).css({"display":"block"});
今天再看这个帖子,感觉这些代码似乎可以省略掉,请博主指导!

 回复 引用 查看   
#11楼[楼主]2009-12-27 21:40 | 徐秀才      
@to be or not
这部分代码有2个作用:1、页面加载后给每个内容div动态生成一个ID,这样如果有其他功能需要的话,以备后用。2、使选项卡在初始状态下能根据用户传进来的o.currentTab自定义当前默认显示哪个选项卡。
这个简单的tab插件写很久了,总体来说适用于大部分情况,如有高级需求,你可以试试jQuery官方的tab插件:)

 回复 引用 查看   
#12楼2010-03-29 11:41 | 10010101      
感谢楼主提供这么好的材料
我要啦免费统计