结构/表现/行为完全分离的选项卡(jQ版和原生JS版)

日常项目中常用到的,用jQuery和原生JS分别写了一个. 两种写法均实现了结构/表现/行为的完全分离.当然,稍作修改,可以在同一个页面中应用于多个选项卡.
关于思路,和常规选项卡思路一样.点击选项菜单,突出显示,并显示对应的选项.本文实例中主要是通过判断点击菜单在菜单列表中的索引位置来显示或隐藏选项区.原生js还有很多种实现方法(蓝色理想中搜索),为了与jQ版思路保持一致,本文实例用的是循环判断. 详见注释.
另有几点说明:
1. 通过本文DEMO演示,可以很明显的看到原生JS的window.onload=function(){…}与jQuery的$(document).ready(function(){…});的区别,这也是我为什么不用样式定义初始状态下隐藏第二三个显示区的原因;
2. 本文只是选项卡一个原型实现,若要用于同一页面多个选项卡,变量已集中到函数头部,可自行封装成函数;
3. 请不要问如何实现更酷很炫的效果,请自已思考添加效果;
4. 不希望大家用这个效果时只是机械的复制粘贴,思考加实践,然后消化成自己的.
查看演示: 点此查看DEMO
核心代码:

//jQ版本
$(function(){
    var _tab = $('ul.tabnav>li');//获取选项卡导航
    var _box = $('.tabbox>div');//获取内容切换区
    var _hover = 'hover';//当前点击显示的样式
    var _index;//索引值
    _tab.click(function(){
        _index = _tab.index(this);//获取当前点击的索引值
        $(this).addClass(_hover).siblings().removeClass(_hover);//当前点击高亮显示
        _box.eq(_index).show().siblings().hide();//通过索引值让对应的选项内容区显示
    }).eq(0).click();//为第一个导航添加当前状态样式
});
//原生JS版本
window.onload = function(){
    var tabnav = document.getElementById('tabnav');
    var list = tabnav.getElementsByTagName('li');
    var tabbox = document.getElementById('tabbox');
    var divs = tabbox.getElementsByTagName('div');
    var hover = 'hover';//当前点击显示的样式
    var indexValue = function(self, obj){//获取索引值的函数,通过它获取当前点击在导航中的索引位置
        for (var i = 0; i < obj.length; i++) {
            if (obj[i] == self)
                return i;
        }
    };
    var index;
    list[0].className = hover;//第一个默认高亮,建议在页面中直接定义
    for (var k = 1; k < divs.length; k++) {//我为了省事,用一个for循环定义默认显示第一个切换区块,其他隐藏.这个最好用CSS定义,能避免页面加载时它全部显示出来.
        divs[k].style.display = 'none';
    }
    for (var l = 0; l < list.length; l++) {//点击事件
        list[l].onclick = function(){
            index = indexValue(this, list);//利用前面定义的indexValue函数取当前点击在选项导航中的索引值,
            for (var m = 0; m < list.length; m++) {
                list[m].className = (m == index) ? hover : '';//高亮显示点击项并移除其他项高亮
            }
            for (var n = 0; n < divs.length; n++) {
                divs[n].style.display = (n == index) ? 'block' : 'none';//显示点击对应的选项区,隐藏其他
            }
        }
    }
}
共有 25 条评论.

发表评论4,276 Views

  1. 毛毛熊

    很有帮助的一帖,刚刚偷的运用了,呵呵,偷师了

    [回复]

  2. JQ版这个多个TAB组好像重用不了

    [回复]

    Mr.Think 回复:

    @八宝, 封装

    [回复]

  3. 根据您这个我页面上有很多组TAB 需要重用以下是代码,因为各组TAB间的样式是不一样的,您这个的样式怎么改呀???

    //Tab选项卡
    var _tab=$(“#tab_li ul li,#tab_li_2 ul li”); //导航
    var _box=$(“#tab_li_cont > div,#tab_li_cont_2 > div”); //内容显示
    var _hover=”tab_hover” //高亮的样式
    _tab.mouseover(function(){
    var _index=_tab.index(this);
    $(this).addClass(_hover).siblings().removeClass(_hover);
    _box.eq(_index).show().siblings().hide();
    }).eq(0).mouseover();

    var _hover=”tab_hover” 这里我还有其它一堆样式要加应该如何写???

    [回复]

    Mr.Think 回复:

    @八宝, 很多个重复的,你把代码封装起来不就可以了么 JQ封装成插件,JS封装成函数

    [回复]

  4. 好好活着

    为什么每次刷新页面那一瞬间,会把所有选项卡里的内容显示出来?一闪就没了

    [回复]

    Mr.Think 回复:

    @好好活着, 请看说明第一点: 1. 通过本文DEMO演示,可以很明显的看到原生JS的window.onload=function(){…}与jQuery的$(document).ready(function(){…});的区别,这也是我为什么不用样式定义初始状态下隐藏第二三个显示区的原因;

    [回复]

  5. 好好活着

    。。。原来把click改成mouseover就可以了。。。

    [回复]

  6. 好好活着

    请问JQ版本怎么设置成触发切换的?

    [回复]

    Mr.Think 回复:

    @好好活着, mouserover即可.建议买本 锋利的jQuery 好好看看. 任何一门技术基础是最重要的.

    [回复]

  7. 你的mrthink.net真不错,我也挺喜欢鼓捣这个,可惜现实中没有认识几个谈网站的,我的网站从来没人说过好:(

    [回复]

    Mr.Think 回复:

    @happy kids karaoke, 感谢关注.博客可以自我一点, 不一定要很多人去关注. 写自己喜欢的东西就好. 呵呵

    [回复]

  8. _tab.eq(0).addClass(_hover);
    这句和
    .eq(0).click();

    前者显得多余了?

    [回复]

    Mr.Think 回复:

    @大宝, 感谢提醒, 多写了一句. 哈~

    [回复]

  9. window.onload换做DOM Ready更好

    [回复]

    Mr.Think 回复:

    @kevin,
    1. 依实际情况而定, 本文只是为加载一个DEMO;
    2. 请看文章中’另看几点说明’第一点.

    [回复]

  10. DEMO中,有个XHTML技术,那里面的图片是什么游戏啊?

    [回复]

    Mr.Think 回复:

    @aries, 汗..对游戏真敏感~ 我也不知道.FFFFOUND中看到的.

    [回复]

  11. _box=$(‘.tabbox div’) 换成 _box=$(‘.tabbox > div’) 会不会好点,因为也许里面还有 div 。

    [回复]

    Mr.Think 回复:

    @青色, 嗯. 理论上能更快的找到div.

    [回复]

  12. 在jq版里最后一行.eq(0).click();是什么意思,为什么要加这上这一句呢

    [回复]

    Mr.Think 回复:

    @洛成, 为第一个导航选项添加点击事件,以使其高亮显示.

    [回复]

  13. 外闻网

    顶一下,欢迎回访并加友链。

    [回复]

    Mr.Think 回复:

    @外闻网,本站不接受非技术类网站链接,抱歉~

    [回复]

发表评论[无需注册]