每天一个JS小项目(一)tab选项卡

前言:为了督促自己学习js,挑战一天一个js常见的小项目。主js,所以css可能比较简单。学习前端的朋友可以一起~

成果展示

tab选项卡在线查看

tab选项卡

布局设计

大致分为选项块和对应的内容块

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>tab选项卡</title>
</head>
<body>
    <div class="tab_content">
        <ul class="tab_nav">
            <li class="tab_nav_active">
                选项一
            </li>
            <li>
                选项二
            </li>
            <li>
                选项三
            </li>
        </ul>
        <span class="tab_nav_anchor" style="transition-duration:300ms"></span>
        <ul class="tab_box">
            <li class="tab_box_active">
                内容一
            </li>
            <li>
                内容二
            </li>
            <li>
                内容三
            </li>
        </ul>

    </div>
</body>

CSS部分

*{
    margin:0px;
    padding: 0px;
}
html,body{
    width: 100%;
    height: 100vh;
    display: flex;
    justify-content: center;
    align-items: center;
}
.tab_content{
    width: 400px;
    height: 300px;
    background-color: #e1f5fe;
}
.tab_content .tab_nav{
    list-style: none;
    display: flex;
}
.tab_content .tab_nav li{
    width: 100px;
    height: 40px;
    line-height: 40px;
    text-align: center;    
}
.tab_nav_active{
    color: #00a1d6;
}

.tab_content .tab_box{
    list-style: none;
}
/*设置内容不可见*/
.tab_content .tab_box li{
    display: none;
}
/*选中的内容可见*/
.tab_content .tab_box .tab_box_active{
    display: block;
}
.tab_nav_anchor{
    display: block;
    border-bottom: 2px solid #00a1d6;
    width: 100px;
}

JS部分

<script>
  let tabNav = document.querySelectorAll('.tab_nav>li');
  let tabBox = document.querySelectorAll('.tab_box>li');
  let tabNavActive = document.querySelector('.tab_nav_active');
  let tabBoxActive = document.querySelector('.tab_box_active');
  let navAnchor = document.querySelector(".tab_nav_anchor");
  tabNav.forEach((item,index)=>{//遍历节点
      item.onmouseenter=function(){
          tabNavActive.classList.remove("tab_nav_active");//当前选中的清除选中样式
          tabNavActive=this;
          tabNavActive.classList.add("tab_nav_active");
          tabBoxActive.classList.remove("tab_box_active");
          tabBoxActive=tabBox[index];
          tabBoxActive.classList.add("tab_box_active");
          navAnchor.style.transform=`translateX(${index*100}px)`
      }
  })
</script>

querySelectorAll()可以获取查找的所有节点,返回节点数组。这里我们获取所有的选项节点数组tabNav 和内容节点数组tabBox 。获取当前选中的选项tabNavActive,和当前展示的内容tabBoxActive 。 运用arr.forEach遍历每个节点对其进行操作。步骤如下:

  1. 清除原来选中的选项tabNavActive的“选中样式”和显示的内容tabBoxActive的“显示样式”,tabNavActive.classList.remove("tab_nav_active"),tabBoxActive.classList.remove("tab_box_active");
  2. 将当前选项设为被选中的选项,当前内容设为可见内容。tabNavActive=this;tabBoxActive=tabBox[index];

  3. 选中的选项和内容增加“选中样式”。tabNavActive.classList.add("tab_nav_active");tabBoxActive.classList.add("tab_box_active");

当选项之间切换时,滑动条有个滑动效果。一般的transition不能做到这种效果。那么我们在选项块后面增加一个块元素。通过改变它的translateX来实现这种效果。

        <span class="tab_nav_anchor" style="transition-duration:300ms"></span>

当选中某个选项时,其translateX随之改变,translateX(${index*100}px)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值