Tab选项卡案例

403 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天

image.png

写一个tab选项卡的样式,先做一个这样的框架出来,我们的目标就是点击头部(热卖、精品、推荐)以后其背景颜色会进行改变,并且底下的内容显示框会显示不同的内容

此为css样式

.container {
        width: 600px;
        height: 400px;
        border: 10px solid #333;
        margin: 30px auto;
        display: flex;
        flex-direction: column;
    }

    .header {
        height: 40px;
        display: flex;
        line-height: 40px;
    }

    .header div {
        flex: 1;
        background-color: hotpink;
        text-align: center;
        font-size: 36px;
        color: white;
    }

    .header .active {
        background-color: orange;
    }

    .content {
        display: none;
    }

此为body代码

    <body>
        <div class="container">
            <div class="header">
                <div class="active">热卖</div>
                <div>精品</div>
                <div>推荐</div>
            </div>
            <div class="body">
                <div class="content" style="display: block;">1</div>
                <div class="content">2</div>
                <div class="content">3</div>
            </div>
        </div>
    </body>
    

代码分析

一、先让每一个导航栏都设置一个点击事件

二、事件相关

1、点击到导航栏时,导航栏的背景颜色会进行改变(也就是样式发生改变)所以我们只需要给所点击到的导航栏添加一个特殊的样式就行了(这里我在写css样式时已经有了一个active的标签,所以我们直接在所点击的导航栏上创建一个active标签即可),这里我们利用排他思想,不管active在谁身上,我们直接将所有active标签移出,然后再在当前所点击的导航栏上添加样式。

2、改变内容改变,同样也用排他思想,先将所有的内容写入内容框(三个内容存在于不同的div)不管谁先显示,直接将所有的正文div全部隐藏,再通过导航将对应的正文解除隐藏

三、代码实现

1、获取到导航栏和内容栏的dom对象

 var headers = document.querySelectorAll('.header>div');
 var bodys = document.querySelectorAll('.body>.content');

2、用一个for循环给所有的导航栏内容加一个自定义标签

for (var i = 0; i < headers.length; i++) {
        headers[i].setAttribute('data-index', i);
}

3、给每一个元素绑定一个点击事件(用监听事件)

    headers[i].onclick = function () {
            // 移除导航上所有的active样式
            for (var j = 0; j < headers.length; j++) {
                headers[j].removeAttribute('class');
            }
            // 给当前点击的导航添加样式
            this.setAttribute('class', 'active');
            // 获取到当前点击的导航的序号
            var index = this.getAttribute('data-index');
            // 将所有的正文隐藏
            for (var k = 0; k < bodys.length; k++) {
                bodys[k].style.display = 'none';
            }
            // 将当前点击对应的正文显示
            bodys[index].style.display = 'block';
        }

四、完整的js代码

<script>
    var headers = document.querySelectorAll('.header>div');
    var bodys = document.querySelectorAll('.body>.content');
    for (var i = 0; i < headers.length; i++) {
        // 增加自定义的属性记录序号
        headers[i].setAttribute('data-index', i);
        // 每一个元素绑定事件
        headers[i].onclick = function () {
            // 移除导航上所有的active样式
            for (var j = 0; j < headers.length; j++) {
                headers[j].removeAttribute('class');
            }
            // 当前点击的导航添加样式
            this.setAttribute('class', 'active');
            // 获取到当前点击的导航的序号
            var index = this.getAttribute('data-index');
            // 将所有的正文隐藏
            for (var k = 0; k < bodys.length; k++) {
                bodys[k].style.display = 'none';
            }
            // 将当前点击对应的正文显示
            bodys[index].style.display = 'block';
        }
    }
</script>