欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

tab切换效果

程序员文章站 2024-03-21 11:48:52
...
<style>
        *{
            margin: 0;
            padding:0;
        }

        ul,ol,li{
            list-style: none;
        }

        .cont{
            width: 800px;
            height: 600px;
            border: 5px solid hotpink;
            margin: 0 auto;
            display: flex;
            flex-direction: column;
        }

        .cont ul{
            width: 100%;
            height: 60px;
            display: flex;
        }

        .cont ul li{
            flex:1;
            font-size: 35px;
            color: #fff;
            background: lightskyblue;
            display: flex;
            justify-content: center;
            align-items: center;

        }
        .cont ul li:nth-of-type(2){
            border-left: 2px solid blue;
            border-right: 2px solid blue;
        }
        .cont ol{
            flex:1;
            position: relative;
        }

        .cont ol li{
            width: 100%;
            height: 100%;
            font-size: 150px;
            display: flex;
            justify-content: center;
            align-items: center;
            position: absolute;
            top:0;
            left:0;
            background: gold;
            display: none;
        }

        /* 按钮标签 哪个标签有这个属性,哪个就显示特殊背景颜色 */
        .cont ul li.active{
            background: honeydew;
            color: black;
        }

        /* 内容标签 哪个标签有这个属性,哪个就显示 */
        .cont ol li.active{
            display: flex;
        }

    </style>
<div class="cont">
        <ul>
            <li class="active">按钮1</li>
            <li>按钮2</li>
            <li>按钮3</li>
        </ul>
        <ol>
            <li class="active">内容1</li>
            <li >内容2</li>
            <li>内容3</li>
        </ol>
    </div>
<script>
        // tab切换 / 选项卡 效果

        // 实现思路:
        // 1, ul中的li标签个数  和 ol中li标签个数是相同的
        //    按钮和内容是一一对应的

        // 2, 点击按钮标签,也就是ul中的li标签
        //    给当前这个li标签,添加class样式,给其他的li标签,去除class样式
        //    实现思路: 先给所有的li标签,去除class样式
        //             再给当前的li标签,添加class样式

        // 3, 点击按钮标签,也就是ul中的li标签
        //    给 ol 中所有的 li标签,去除class样式
        //    给 与 当前 ul>li 索引相同的 ol>li标签,添加样式


        var oUllis = document.querySelectorAll('ul li');
        var oOllis = document.querySelectorAll('ol li');

        // 循环 ul中的所有li,添加点击事件
        oUllis.forEach(function(item , key){
            // ul中的li标签 , item就是ul中的li标签
            item.onclick = function(){
                // 1,清除所有的ul,ol,中li的class样式属性
                // 循环遍历所有的ul和ol中的标签
                oUllis.forEach(function(v , k){
                    // v是ul中的li标签
                    v.className = '';
                    // ul>li和ol>li索引是相同的
                    // 通过ul中li的索引也可以获取ol中的li标签
                    // oOllis[k] 就是 ol中的li标签
                    oOllis[k].className = '';
                })
                // 循环结束,所有的ul,ol中,li都没有active


                // 给当前点击的item标签,也就是ul,li标签,添加样式
                item.className = 'active';

                // 给ol中,对应的这个标签的索引的li标签,添加样式
                oOllis[key].className = 'active';
            }
        })

        // 不想用forEach,也可以试试事件委托


        // 总结
        // 核心思路:
        //   利用 ul 和 ol 中 li标签个数相同的 特点,优化程序,简化代码
        // 1,获取标签对象
        // 2,给所有的ul中的li标签,添加点击事件
        // 3,点击事件执行的内容
        //   (1),给所有的ul和ol中的li标签,清除样式
        //   (2),给当前点击的ul中的li标签,添加样式
        //   (3),给索引相同的ol中的li标签,添加样式

        // 可以用自己的方式实现,比如多写几个循环,分别操作ul和ol中的标签
        // 不过我的方法比较简单

        // 也可以尝试事件委托的方式,给div标签,添加点击事件
        // 判断点击的li标签,定义程序
        // 不过这样的话,要给ul中li标签,添加不少的设定,以区别ul>li和ol>li

    </script>

效果如下:
tab切换效果