JS - APIs 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>
    <style>
      * {
        padding: 0;
        margin: 0;
      }

      .tab {
        width: 590px;
        height: 340px;
        margin: 20px;
        border: 1px solid #e4e4e4;
      }

      .tab-nav {
        width: 100%;
        height: 60px;
        line-height: 60px;
        display: flex;
        justify-content: space-between;
      }

      .tab-nav h3 {
        font-size: 24px;
        font-weight: normal;
        margin-left: 20px;
      }

      .tab-nav ul {
        list-style: none;
        display: flex;
        justify-content: flex-end;
      }

      .tab-nav ul li {
        font-size: 14px;
        margin: 0 20px;
      }

      .tab-nav ul li a {
        text-decoration: none;
        border-bottom: 2px solid transparent;
        color: #333;
      }

      .tab-nav ul li a.active {
        border-color: #e1251b;
        color: #e1251b;
      }

      .tab-content {
        padding: 0 16px;
      }

      .tab-content .item {
        display: none;
      }

      .tab-content .item.active {
        display: block;
      }
    </style>
  </head>

  <body>
    <div class="tab">
      <div class="tab-nav">
        <h3>色系美照</h3>
        <ul>
          <!-- href="javascript:;确保点击链接时不会跳转页面 -->
          <li><a class="active" href="javascript:;">黑色</a></li>
          <li><a href="javascript:;">黄色</a></li>
          <li><a href="javascript:;">白色</a></li>
          <li><a href="javascript:;">蓝色</a></li>
          <li><a href="javascript:;">桂色</a></li>
        </ul>
      </div>
      <div class="tab-content">
        <div class="item active"><img src="images/zly01.png" alt="" /></div>
        <div class="item"><img src="images/zly02.png" alt="" /></div>
        <div class="item"><img src="images/zly03.png" alt="" /></div>
        <div class="item"><img src="images/zly04.png" alt="" /></div>
        <div class="item"><img src="images/zly05.png" alt="" /></div>
      </div>
    </div>
    <script>
      // tab-nav模块
      const aS = document.querySelectorAll(".tab-nav a");
      const itemS = document.querySelectorAll(".tab-content .item");
      console.log(aS);
      for (let i = 0; i < aS.length; i++) {
        aS[i].addEventListener("mouseenter", function () {
          // 移除其他的active
          document.querySelector(".tab-nav .active").classList.remove("active");
          // 添加当前的
          this.classList.add("active");

          // tab-content模块
          document
            .querySelector(".tab-content .active")
            .classList.remove("active");
          // 对应序号的item添加
          // itemS[i].classList.add("active");
          document
            .querySelector(`.tab-content .item:nth-child(${i + 1})`)
            .classList.add("active");
        });
      }
    </script>
  </body>
</html>

使用事件委托,优化代码,减少注册次数

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>tab栏切换</title>
    <style>
      * {
        padding: 0;
        margin: 0;
      }

      .tab {
        width: 590px;
        height: 340px;
        margin: 20px;
        border: 1px solid #e4e4e4;
      }

      .tab-nav {
        width: 100%;
        height: 60px;
        line-height: 60px;
        display: flex;
        justify-content: space-between;
      }

      .tab-nav h3 {
        font-size: 24px;
        font-weight: normal;
        margin-left: 20px;
      }

      .tab-nav ul {
        list-style: none;
        display: flex;
        justify-content: flex-end;
      }

      .tab-nav ul li {
        font-size: 14px;
        margin: 0 20px;
      }

      .tab-nav ul li a {
        text-decoration: none;
        border-bottom: 2px solid transparent;
        color: #333;
      }

      .tab-nav ul li a.active {
        border-color: #e1251b;
        color: #e1251b;
      }

      .tab-content {
        padding: 0 16px;
      }

      .tab-content .item {
        display: none;
      }

      .tab-content .item.active {
        display: block;
      }
    </style>
  </head>

  <body>
    <div class="tab">
      <div class="tab-nav">
        <h3>色系美照</h3>
        <ul>
          <!-- href="javascript:;确保点击链接时不会跳转页面 -->
          <!-- data-自定义属性 ,对象.dataset.id可以得到数字 -->
          <li><a class="active" href="javascript:;" data-id="0">黑色</a></li>
          <li><a href="javascript:;" data-id="1">黄色</a></li>
          <li><a href="javascript:;" data-id="2">白色</a></li>
          <li><a href="javascript:;" data-id="3">蓝色</a></li>
          <li><a href="javascript:;" data-id="4">桂色</a></li>
        </ul>
      </div>
      <div class="tab-content">
        <div class="item active"><img src="images/zly01.png" alt="" /></div>
        <div class="item"><img src="images/zly02.png" alt="" /></div>
        <div class="item"><img src="images/zly03.png" alt="" /></div>
        <div class="item"><img src="images/zly04.png" alt="" /></div>
        <div class="item"><img src="images/zly05.png" alt="" /></div>
      </div>
    </div>
    <script>
      // 2.使用事件委托
      const ul = document.querySelector(".tab-nav ul");
      const content = document.querySelector(".tab-content");
      ul.addEventListener("click", function (e) {
        if (e.target.tagName === "A") {
          // 移除所有导航的active
          document.querySelector(".tab-nav .active").classList.remove("active");
          // 为被点击的导航添加active
          e.target.classList.add("active");
          // 移除大盒子所有的active
          document
            .querySelector(`.tab-content .active`)
            .classList.remove("active");
          // 得到被点击的自定义属性的id
          // !!!!自定义属性id为字符串型,'1'+1=11,需要转为数字型
          const i = +e.target.dataset.id;
          // 为被点击的导航对应大盒子添加active
          document
            .querySelector(`.tab-content .item:nth-child(${i + 1})`)
            .classList.add("active");
        }
      });
    </script>
  </body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值