前端学习-tab栏切换改造项目(三十一)

目录

前言

监听代码

思路

代码

事件委托代码

思路

代码

总结


前言

星垂平野阔,月涌大江流


监听代码

思路

等待DOM加载完成

获取所有标签

为每个标签添加鼠标悬停事件监听器

定义showTab函数:

接收一个索引参数index,用于标识当前悬停的标签

获取所有的标签和内容项

移除所有active类

为当前悬停的标签&&对应的内容添加active类

代码

javascript 复制代码
<!DOCTYPE html>
<html lang="en">
​
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .tab {
      width: 100%;
      height: 100%;
    }
​
    .tab-nav {
      width: 490px;
      height: 40px;
      background-color: #fff;
      border: 1px solid #020202;
      display: flex;
      align-items: center;
    }
​
    .tab-nav ul {
      list-style-type: none;
      padding-left: 0;
      margin: 0;
      display: flex;
    }
​
    .tab-nav ul li {
      margin-right: 20px;
      height: 40px;
      display: flex;
      align-items: center;
    }
​
    .tab-nav ul li a {
      text-decoration: none;
      color: inherit;
      padding: 0 10px;
    }
​
    .tab-nav ul li a:hover {
      color: red;
    }
​
    .tab-nav ul li:hover {
      background-color: gray;
    }
​
    .tab-nav h3 {
      margin-right: 20px;
      margin-left: 20px;
    }
​
    .tab-content {
      width: 450px;
      padding: 20px;
      border: 1px solid #020202;
      border-top: none;
      height: 300px;
      /* 增加高度以容纳更多内容 */
      overflow-y: auto;
      /* 添加滚动条 */
    }
​
    .tab-content .item {
      display: none;
      margin-bottom: 20px;
    }
​
    .tab-content .item.active {
      display: block;
    }
​
    .item h2 {
      color: #333;
    }
​
    .item p {
      color: #666;
    }
​
    .item img {
      max-width: 100%;
      height: auto;
      margin-top: 10px;
    }
  </style>
</head>
​
<body>
  <div class="tab">
    <div class="tab-nav">
      <h3>每日特价</h3>
      <ul>
        <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">
        <h2>精选内容</h2>
        <p>这里是精选内容的描述。</p>
        <img src="https://via.placeholder.com/150" alt="精选图片">
      </div>
      <div class="item">
        <h2>美食内容</h2>
        <p>这里是美食内容的描述。</p>
        <img src="https://via.placeholder.com/150" alt="美食图片">
      </div>
      <div class="item">
        <h2>百货内容</h2>
        <p>这里是百货内容的描述。</p>
        <img src="https://via.placeholder.com/150" alt="百货图片">
      </div>
      <div class="item">
        <h2>母婴内容</h2>
        <p>这里是母婴内容的描述。</p>
        <img src="https://via.placeholder.com/150" alt="母婴图片">
      </div>
      <div class="item">
        <h2>图书内容</h2>
        <p>这里是图书内容的描述。</p>
        <img src="https://via.placeholder.com/150" alt="图书图片">
      </div>
    </div>
  </div>
​
  <script>
    document.addEventListener('DOMContentLoaded', function () {
      const tabs = document.querySelectorAll('.tab-nav ul li a');
      tabs.forEach((tab, index) => {
        tab.addEventListener('mouseenter', function () {
          showTab(index);
        });
      });
​
      function showTab(index) {
        const tabs = document.querySelectorAll('.tab-nav ul li a');
        const contents = document.querySelectorAll('.tab-content .item');
​
        tabs.forEach(tab => tab.classList.remove('active'));
        contents.forEach(content => content.classList.remove('active'));
​
        tabs[index].classList.add('active');
        contents[index].classList.add('active');
      }
    });
  </script>
</body>
​
</html>

事件委托代码

思路

等待DOM加载完成

获取父元素

添加点击事件监听器

获取所有标签和内容项

移除所有active类

获取当前点击的标签的索引

添加active类

代码

javascript 复制代码
<!DOCTYPE html>
<html lang="en">
​
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .tab {
      width: 100%;
      height: 100%;
    }
​
    .tab-nav {
      width: 490px;
      height: 40px;
      background-color: #fff;
      border: 1px solid #020202;
      display: flex;
      align-items: center;
    }
​
    .tab-nav ul {
      list-style-type: none;
      padding-left: 0;
      margin: 0;
      display: flex;
    }
​
    .tab-nav ul li {
      margin-right: 20px;
      height: 40px;
      display: flex;
      align-items: center;
    }
​
    .tab-nav ul li a {
      text-decoration: none;
      color: inherit;
      padding: 0 10px;
    }
​
    .tab-nav ul li a:hover {
      color: red;
    }
​
    .tab-nav ul li:hover {
      background-color: gray;
    }
​
    .tab-nav h3 {
      margin-right: 20px;
      margin-left: 20px;
    }
​
    .tab-content {
      width: 450px;
      padding: 20px;
      border: 1px solid #020202;
      border-top: none;
      height: 300px;
      /* 增加高度以容纳更多内容 */
      overflow-y: auto;
      /* 添加滚动条 */
    }
​
    .tab-content .item {
      display: none;
      margin-bottom: 20px;
    }
​
    .tab-content .item.active {
      display: block;
    }
​
    .item h2 {
      color: #333;
    }
​
    .item p {
      color: #666;
    }
​
    .item img {
      max-width: 100%;
      height: auto;
      margin-top: 10px;
    }
  </style>
</head>
​
<body>
  <div class="tab">
    <div class="tab-nav">
      <h3>每日特价</h3>
      <ul>
        <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">
        <h2>精选内容</h2>
        <p>这里是精选内容的描述。</p>
        <img src="https://via.placeholder.com/150" alt="精选图片">
      </div>
      <div class="item">
        <h2>美食内容</h2>
        <p>这里是美食内容的描述。</p>
        <img src="https://via.placeholder.com/150" alt="美食图片">
      </div>
      <div class="item">
        <h2>百货内容</h2>
        <p>这里是百货内容的描述。</p>
        <img src="https://via.placeholder.com/150" alt="百货图片">
      </div>
      <div class="item">
        <h2>母婴内容</h2>
        <p>这里是母婴内容的描述。</p>
        <img src="https://via.placeholder.com/150" alt="母婴图片">
      </div>
      <div class="item">
        <h2>图书内容</h2>
        <p>这里是图书内容的描述。</p>
        <img src="https://via.placeholder.com/150" alt="图书图片">
      </div>
    </div>
  </div>
​
  <script>
    document.addEventListener('DOMContentLoaded', function () {
      const tabNav = document.querySelector('.tab-nav ul');
​
      tabNav.addEventListener('click', function (e) {
        if (e.target.tagName === 'A') {
          // 获取所有标签
          const tabs = document.querySelectorAll('.tab-nav ul li a');
          // 获取所有内容项
          const contents = document.querySelectorAll('.tab-content .item');
​
          // 移除所有标签的 active 类
          tabs.forEach(tab => tab.classList.remove('active'));
          // 移除所有内容项的 active 类
          contents.forEach(content => content.classList.remove('active'));
​
          // 获取当前点击的标签的索引
          const index = Array.from(tabs).indexOf(e.target);
​
          // 为当前点击的标签添加 active 类
          tabs[index].classList.add('active');
          // 为对应的内容项添加 active 类
          contents[index].classList.add('active');
        }
      });
    });
  </script>
</body>
​
</html>

总结

明月出天山,苍茫云海间

相关推荐
录大大i1 小时前
HTML之form表单学习
前端·学习·html
虾球xz1 小时前
游戏引擎学习第89天
linux·学习·游戏引擎
Allen_LVyingbo1 小时前
院校联合以项目驱动联合培养医工计算机AI人才路径探析
人工智能·python·学习·健康医疗
种花生的图图1 小时前
MSPFN 代码复现
人工智能·笔记·深度学习·学习·机器学习
egoist20232 小时前
链式结构二叉树(递归暴力美学)
c语言·开发语言·数据结构·学习·链表·二叉树·前中后序遍历
明月清了个风2 小时前
数据结构与算法学习笔记----博弈论
笔记·学习·算法
F——5 小时前
云计算行业分析
运维·学习·云计算·边缘计算
程序员yt5 小时前
‌双非硕士的抉择:自学嵌入式硬件开发还是深入Linux C/C++走软开?
c++·嵌入式硬件·学习·计算机网络
Sean_summer6 小时前
2.5学习
学习