什么是Tab?

优质
小牛编辑
127浏览
2023-12-01

1.3. 什么是Tab?

1.3.1. 看一下小灰灰的tab v1

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
    *{
        margin: 0; 
        padding: 0;
        list-style: none;
    }
    #tab {
        width: 600px;
        height: 300px;
        border: 1px solid #ccc;
    }
    #tab > div{
        display: none;
    }
    #tab_btn {
        height: 50px;
        line-height: 50px;
        border-bottom: 1px solid #ccc;
    }
    #tab_btn li {
        float: left;
        width: 200px;
        text-align: center;;
    }
    #tab_btn li.on{
        background: #ccc;
    }
    </style>
</head>
<body>
    <div id="tab">
        <ul id="tab_btn">
            <li class="on">选项卡一</li>
            <li>选项卡二</li>
            <li>选项卡三</li>
        </ul>

        <div style="display:block">我是第一个内容</div>
        <div>我是第二个内容</div>
        <div>我是第三个内容</div>
    </div>
    <script src="../lib/jquery-1.10.2.min.js"></script>
    <script>
    $('#tab_btn li').on('mouseover', function (){
        $('#tab_btn li').removeClass('on');
        $(this).addClass('on');

        $('#tab div').hide();
        $('#tab div').eq($(this).index()).show();
    })
    </script>
</body>
</html>

1.3.2. 它有几个明显问题

  • 样式与js代码没有和html分离
  • tab功能实现里,但无法复用,因为他用的是id方式
  • tab的骨架html模板也不合理

1.3.3. 狮子的故事

曾经有一个小伙伴,写下来这样的代码

<ul id="tab_btn">
    <li class="lion">选项卡一</li>
    <li>选项卡二</li>
    <li>选项卡三</li>
</ul>

然后我在读css代码的时候,发现

.lion {
    ...
}

我看了很久,lion是狮子的意思,那这里呢?

后来才明白,原来是li on的意思,也就是选中的tab的状态是on。

命名是非常容易闹笑话的,其实,这里用active更合适

1.3.4. 看一下小灰灰的tab v2

提取css和js的部分不是本章重点,下面比较一下重构后的tab骨架结构

之前的tab骨架

<div id="tab">
    <ul id="tab_btn">
        <li class="on">选项卡一</li>
        <li>选项卡二</li>
        <li>选项卡三</li>
    </ul>

    <div style="display:block">我是第一个内容</div>
    <div>我是第二个内容</div>
    <div>我是第三个内容</div>
</div>

重构后的代码

<div id="tab">
    <div class="tab_header">
        <ul>
            <li class="active">选项卡一</li>
            <li>选项卡二</li>
            <li>选项卡三</li>
        </ul>
    </div>
    <div class="tab_content">
        <div class='tab_content_item'  style="display:block">
            我是第一个内容
        </div>
        <div class='tab_content_item'>
            我是第二个内容
        </div>
        <div class='tab_content_item'>
            我是第三个内容
        </div>
    </div>
</div>

这样的代码结构是不是更为清晰呢?

1.3.5. 重构行内样式

还有点小瑕疵,下面代码用了行内样式

<div class='tab_content_item'  style="display:block">
    我是第一个内容
</div>

修改如下

// html
<div class='tab_content_item active'>
    我是第一个内容
</div>

// css
.tab_content .active{
    display:block;
}

把行内样式抽象成状态,继而让代码更具可读性

1.3.6. v2的js

结构改了,js也一定做了修改,tab.js具体内容如下:

;$(function(){
    $('.tab_header li').on('mouseover', function (){
        $('.tab_header li').removeClass('active');
        $(this).addClass('active');

        $('.tab_content div').hide();
        $('.tab_content div').eq($(this).index()).show();
    })
});

1.3.7. 点评

v2的js只是根据tab的骨架接口修改而进行了简单修改,主要是dom selector的修改

没有什么特别值得说明的。

1.3.8. 让我们看看一个页面多个tab,它如何?

详见 jQuery.tab_more.html

出现的问题是在第二个tab上滑动的时候,更新的是第一个tab content,这是为什么呢?

答:js代码写的太随意,没有注意控制组件自身管控范围

不严谨是写代码的大忌