js实现tab栏切换

目录

1、排他思想实现

2、事件委托实现


1、排他思想实现

思路:

        需要点击谁,就先获取谁,获得的是一个伪数组

        遍历数组,并给数组里的每个元素添加点击事件,写一个active类用于显示边框样式

        每一个元素对应一张图片,先将所有图片隐藏,并写一个active类用于显示对应图片

        点击时,先清除active类,点击谁,谁就添加active类,对应的图片显示,其他隐藏

        在那之前要先清除active类,那个需要显示就添加active类

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>tab栏切换</title>
    <style>
      * {
        margin: 0;
        padding: 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 {
        margin: 0 20px;
        font-size: 14px;
      }

      .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>
          <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/tab00.png" alt="" /></div>
        <div class="item"><img src="./images/tab01.png" alt="" /></div>
        <div class="item"><img src="./images/tab02.png" alt="" /></div>
        <div class="item"><img src="./images/tab03.png" alt="" /></div>
        <div class="item"><img src="./images/tab04.png" alt="" /></div>
      </div>
    </div>
    <script>
      // 需求 点击tab栏进行对应内容切换
      // 1 获取相关元素
      const lis = document.querySelectorAll('.tab-nav li')
      const divs = document.querySelectorAll('.tab-content  div')
      // 2 循环绑定事件
      for (let i = 0; i < lis.length; i++) {
        lis[i].addEventListener('mouseenter', function () {
          // 2-1 让点击的菜单加active 其他移除
          document.querySelector('.tab-nav a.active').classList.remove('active')
          this.querySelector('a').classList.add('active')

          // 2-2 对应的内容显示 其他内容隐藏
          document
            .querySelector('.tab-content div.active')
            .classList.remove('active')
          divs[i].classList.add('active')
        })
      }
    </script>
  </body>
</html>

2、事件委托实现

思路:

        由于要添加点击事件的元素有很多,这样需要给每个元素都添加点击事件,比较麻烦。

        我们可以利用事件委托来实现,就是给他们共同的祖先元素绑定事件,其子元素触发的事件就会冒泡到祖先元素,可以提高代码的执行效率,对于其对应内容的显示,在其添加active类时,给每张图片所在的块添加data-id 的属性,在添加类时用e.target.dataset.id作为索引值来添加。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>tab栏切换</title>
    <style>
      * {
        margin: 0;
        padding: 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 {
        margin: 0 20px;
        font-size: 14px;
      }

      .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>
          <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/tab00.png" alt="" /></div>
        <div class="item"><img src="./images/tab01.png" alt="" /></div>
        <div class="item"><img src="./images/tab02.png" alt="" /></div>
        <div class="item"><img src="./images/tab03.png" alt="" /></div>
        <div class="item"><img src="./images/tab04.png" alt="" /></div>
      </div>
    </div>
    <script>
      // 需求 点击tab栏进行对应内容切换
      // 1 获取相关元素
      const tab_nav = document.querySelector('.tab-nav')
      const divs = document.querySelectorAll('.tab-content  div')
      // 2 绑定事件
      tab_nav.addEventListener('click', function (e) {
        if (e.target.tagName === 'A') {
          // 2-1 让点击的菜单加active 其他移除
          document.querySelector('.tab-nav a.active').classList.remove('active')
          //  console.log(this) // this 永远绑定的事件源 e.target -> 真正触发的元素
          e.target.classList.add('active')
          // 2-2 对应的内容显示 其他内容隐藏
          document
            .querySelector('.tab-content div.active')
            .classList.remove('active')
          divs[e.target.dataset.id].classList.add('active')
        }
      })
    </script>
  </body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/156196.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

频谱优势:电子战与未来冲突

源自&#xff1a;电波之矛 作者&#xff1a;Dr. Ash Rossiter 频谱优越性 地面和机载电子战 乌克兰的猫鼠游戏 地缘政治竞争与电子战 面向未来的电子战 声明:公众号转载的文章及图片出于非商业性的教育和科研目的供大家参考和探讨&#xff0c;并不意味着支持其观点或证实其内…

电压跟随器

电压跟随器即输入多大电压就输出多大的电压&#xff0c;那其起什么作用呢&#xff0c;直接用导线不行吗&#xff1f; 下图为Multisim软件仿真结果&#xff0c;很明显输入电压6.5V输出电压使用万用表测得同为6.5V&#xff0c;验证了电压跟随器的作用。 在同相放大电路的基础上&a…

基于STM32的温室自主灌溉系统(论文+源码)

1.系统设计 本课题为基于STM32的温室自主灌溉系统&#xff0c;通过查阅多种文献和的设计了如图2.1所示的温室自主灌溉系统总体架构&#xff0c;整个系统在器件上包括了主控制器STM32F103&#xff0c;温度传感器DS18B20&#xff0c;土壤湿度传感器YL-69,光敏电阻,显示器LCD1602…

轻松一刻|Walrus CLI与CI/CD工具集成,轻松部署2048游戏

Walrus 是一款开源的基于平台工程理念、以应用为中心、以完整应用系统自动化编排交付为目标进行设计开发的云原生应用平台&#xff0c;简化和自动化应用部署与发布流程并与现有的 CI/CD 流水线无缝集成。今天我们来点有趣的&#xff0c;跟随本教程&#xff0c;一起将 Walrus CL…

抖音自动评论助手,其开发流程与需要的技术和代码分享

先来看实操成果&#xff0c;↑↑需要的同学可看我名字↖↖↖↖↖&#xff0c;或评论888无偿分享 在当今这个信息爆炸的时代&#xff0c;我们不难发现&#xff0c;无论是在线上还是线下&#xff0c;我们都无法忽视一个重要的信息传播工具——抖音。这款短视频平台以其强大的传播…

C/C++高频面经-秋招篇

自己在秋招找工作过程中遇到的一些C/C面试题&#xff0c;大中小厂都有&#xff0c;分享出来&#xff0c;希望能帮到有缘人。 C语言 snprintf()的使用 函数原型为int snprintf(char *str, size_t size, const char *format, …) 两点注意&#xff1a; (1) 如果格式化后的字符…

软件安全学习课程实践3:软件漏洞利用实验

1 逆向分析 1.1.1 和 1.1.2 直接 F5 看 flag 就可以了,故略。 1.1.3 对输入用了算法变换,能看到flag,比如输入x,经过f处理成f(x)然后判断f(x)=y,现在要破解f的算法然后写个逆预算g(y)=x 这个代码看起来很抽象,因为 IDA 没有正确的恢复这里的变量结构。选中变量按“N”重…

出行类app如何提升广告变现收益?

出行类APP已经成为越来越多人们出行的首选&#xff0c;出行类app在变现方式上存在以下痛点&#xff1a;APP功能单一、使用场景单一&#xff1b;用户使用时间集中&#xff0c;粘性低...这些痛点使得开发者获取收益的提升面临极大的挑战。 https://www.shenshiads.com 如何让出…

物料堆垛无线测温解决方案

近年来物质电厂越来越多&#xff0c;生物质燃料垛的安全贮存对于整个生物质行业来说都是一个严峻的问题&#xff0c;测温工作在燃料垛防护中十分重要&#xff0c;测温工作到不到位对安全隐患的排除有直接关系&#xff0c;因此一个适合生物质燃料垛的测温仪器是必须的。现阶段生…

开源与闭源软件的辩论:对大模型技术发展的影响

目录 前言1 开源软件的优缺点1.1 开源软件的优点1.2 开源软件的缺点和挑战 2 闭源软件的优缺点2.1 闭源软件的优点2.2 闭源软件的缺点和挑战 3 大模型发展会走向哪一边结语 前言 近期&#xff0c;特斯拉CEO马斯克公开表示&#xff1a;OpenAI不该闭源&#xff0c;自家首款聊天机…

还能这样操作?勒索软件团伙向监管部门举报受害者!

ALPHV/BlackCat 勒索软件团伙将敲诈勒索提升到了一个新高度&#xff0c;该组织向美国证券交易委员会提交了一份投诉&#xff0c;指控其一名受害者未遵守“一旦遭遇网络攻击&#xff0c;需要在四天内披露”的有关规定。 早些时候&#xff0c;ALPHV/BlackCat 勒索软件团伙将软件公…

cocos2dx中,将png图片打包plist图集,使用什么工具呢?

cocos2dx中&#xff0c;将png图片打包plist图集&#xff0c;使用什么工具呢&#xff1f;小编这里推荐一款免费的图集打包工具&#xff0c;pngPackerGUI_V2.0&#xff0c;此软件是在pngpacker_V1.1软件基础之后&#xff0c;开发的界面化操作软件&#xff0c;方便不太懂命令行的小…

医疗项目的需求分析以及开发流程

一.项目的背景以及需求 1.项目背景 1.政策层面来看&#xff0c;近年来我国政府相关部门陆续颁发了支持数字医疗行业发展的相关政策&#xff0c;“互联网医疗”政策逐渐明确完善&#xff0c;为数字医疗行业发展提供支持&#xff0c;行业迎来政策福利期。 其次&#xff0c;从经济…

leetcode算法之前缀和

目录 1.DP34[模板]一维前缀和2.DP35[模板]二维前缀和3.寻找数组的中心下标4.除自身以外数组的乘积5.和为K的子数组6.和可被K整除的子数组7.连续数组8.矩阵区域和 1.DP34[模板]一维前缀和 一维前缀和 #include <iostream> #include <vector> using namespace std…

我对需求分析的理解

一、背景 最近做了一个项目&#xff0c;也算是踩坑过程&#xff0c;产品上线了&#xff0c;用户不怎么买单&#xff0c;使用者聊聊无几&#xff0c;前期一直不清楚为什么会这样&#xff0c;诚然新系统的开发设计上采用了更新的技术&#xff0c;设计上采用了更好的理念&#xf…

计算两个图形遮盖率

读取图像 首先&#xff0c;加载待处理的图像&#xff0c;可以使用图像处理库&#xff08;例如OpenCV&#xff09;来实现这一步。确保已加载正确的图像。 定义特定颜色范围 确定所需的特定颜色范围。这将是要检测的马赛克填充的颜色。需要指定颜色的下限值和上限值&#xff0c;通…

单片机语音芯片在工业控制中的应用优势

单片机语音芯片&#xff0c;这一智能化的代表产品&#xff0c;不仅在家庭和消费电子领域发挥着重要的作用&#xff0c;更为工业控制领域注入了新的活力。将单片机语音芯片与语音交互技术相结合&#xff0c;为工业设备的控制和监测提供了前所未有的解决方案。 首先&#xff0c;…

宏集干货 | 手把手教你通过CODESYS V3进行PLC编程(三)

来源&#xff1a;宏集科技 工业物联网 宏集干货 | 手把手教你通过CODESYS V3进行PLC编程&#xff08;三&#xff09; 教程背景 通过之前的教程&#xff0c;我们已经为大家演示了宏集MC-Prime控制器的连接、试运行和CODESYS的安装&#xff0c;并创建了一个计数器项目。在本期教…

法与智融合,拓世科技集团子公司教授加拓世团队培训大会圆满成功

2023年11月15日&#xff0c;拓世科技集团子公司北京教授加拓世团队抵达拓世集团总部&#xff0c;展开为期两天的参观学习活动&#xff0c;旨在深度挖掘人工智能技术在法律领域的潜力&#xff0c;为法学研究、法律服务行业快速实践数字化提供更加智能高效的支持。 拓世科技集团…