原生js写tab栏切换

2,819 阅读1分钟

经典tab栏切换案例

基础样式html模块:

    <div class="tab">
        <div class="tab_list">
            <ul>
                <li class="current">商品介绍</li>
                <li>规格与包装</li>
                <li>售后保障</li>
                <li>商品评价</li>
                <li>手机社区</li>
            </ul>
        </div>
        <div class="tab_con">
            <div class="item" style="display: block;">
                商品介绍模块内容
            </div>
            <div class="item">
                规格与包装模块内容
            </div>
            <div class="item">
                售后保障模块内容
            </div>
            <div class="item">
                商品评价模块内容
            </div>
            <div class="item">
                手机社区模块内容
            </div>

        </div>
    </div>

基础样式css模块:

    <style>
        * {
            margin: 0;
            padding: 0;
        }

        li {
            list-style-type: none;
        }

        .tab {
            width: 978px;
            margin: 100px auto;
        }

        .tab_list {
            height: 39px;
            border: 1px solid #ccc;
            background-color: #f1f1f1;
        }

        .tab_list li {
            float: left;
            height: 39px;
            line-height: 39px;
            padding: 0 20px;
            text-align: center;
            cursor: pointer;
        }

        .tab_list .current {
            background-color: #c81623;
            color: #fff;
        }

        .item_info {
            padding: 20px 0 0 20px;
        }

        .item {
            display: none;
        }
    </style>

结构图片:

tab栏.png

要求:通过点击小li切换li的样式和对应div内容的显示与隐藏

难点:需要用到两次排他思想,先移除所有类再添加需要的类

js代码:

var lis = document.querySelectorAll('li');
var items = document.querySelectorAll('.item')
for (var i = 0; i < lis.length; i++) {
 lis[i].setAttribute('data-index', i)
 lis[i].onclick = function () {
 for (var i = 0; i < lis.length; i++) {
       lis[i].className = ''
       }
       this.className = 'current'

        var index = this.getAttribute('data-index')
        for (var j = 0; j < items.length; j++) 
          {
            items[j].style.display = 'none'
          }
           items[index].style.display = 'block'
        }
        }

以上的js代码更容易看懂,基于以上代码可做一次优化,代码如下:

    <script>
        var lis = document.querySelectorAll('li');
        var items = document.querySelectorAll('.item')
        for (var i = 0; i < lis.length; i++) {
            // 1.给每一个标题li添加自定义属性
            lis[i].index = i
            // 2.绑定事件
            lis[i].onclick = function () {
                for (var i = 0; i < lis.length; i++) {
                    lis[i].classList.remove('current')
                    items[i].style.display = 'none'
                }
                this.classList.add('current')
                var index = this.index
                items[index].style.display = 'block'
            }
        }
    </script>

总结:本题难点主要是围绕元素排它、删除与添加、div对应的显示与隐藏; 如何通过li的下标找到对应div块,对其进行操作,就是精华所在。