• JS——利用JS实现 tab 切换详解


     

    文章目录


    一、示例图


    二、实现过程

    1.需求解析

    • 当用户点击切换tab栏时,相应的样式以及对应的文字都应做相应改变
    • 且当用户点击某元素时,其他元素的样式以及内容应该是无效果状态

    2.HTML结构

    1. <div class="tab">
    2. <div class="nav">
    3. <a href="javascript:;" class="hover">公司新闻a>
    4. <a href="javascript:;">公司动态a>
    5. <a href="javascript:;">行业新闻a>
    6. div>
    7. <div class="nav_con">
    8. <div>公司新闻-showdiv>
    9. <div>公司动态-showdiv>
    10. <div>行业新闻-showdiv>
    11. div>
    12. div>
    13. <br /><br /><br />
    14. <div class="tab">
    15. <div class="nav">
    16. <a href="javascript:;" class="hover">大学a>
    17. <a href="javascript:;">中学a>
    18. <a href="javascript:;">小学a>
    19. div>
    20. <div class="nav_con">
    21. <div>大学内容div>
    22. <div>中学内容div>
    23. <div>小学内容div>
    24. div>
    25. div>
    26. <div class="tab">
    27. <div class="nav">
    28. <a href="javascript:;" class="hover">大学a>
    29. <a href="javascript:;">中学a>
    30. <a href="javascript:;">小学a>
    31. div>
    32. <div class="nav_con">
    33. <div>大学内容div>
    34. <div>中学内容div>
    35. <div>小学内容div>
    36. div>
    37. div>

    3.CSS样式

    4.JS行为

    这一部分的实现过程比较重要,主要利用了事件委派以及事件对象等相关知识点实现,

    实现思路——

    1. 首先要做到的是当每个 tab 有自己独立的事件,也就是说在单击当前 tab 栏时不应影响到其他 tab,那么如何做到呢?
    2. 可以先获取每个tab栏的父元素也就是 nav ,随后通过给当前 nav 设置单击监听事件,虽然单击事件最后应该是 nav 下的具体子元素完成,但使用事件委派的方法只要给其父元素的方法设置单击事件可减少事件绑定次数。
    3. 随后获取当前 nav 下的所有子元素并进行遍历,在遍历的过程中利用排他思想设置所有子元素的样式,记得设置当前子元素的自定义属性(setAttribute), 因为还要实现当前子元素下对应的兄弟元素列表(也就是本案例中的内容描述区域 nav_con)
    4. 获取自定义属性(getAttribute),并获取当前子元素下对应的兄弟元素列表(e.target.parentNode.nextElementSibling.children;)并获取该列表随即进行遍历该列表并与排他思想结合设置相应样式。
    1. <script type="text/javascript">
    2. var navNodes = document.querySelectorAll(".nav");
    3. for (var i = 0; i < navNodes.length; i++) {
    4. //通过委派给父亲添加单击事件
    5. navNodes[i].addEventListener('click', function (e) {
    6. //获得当前节点的父节点,通过父节点获得所有的所有nav a下面的子节点
    7. var navs = e.target.parentNode.children;
    8. for (var j = 0; j < navs.length; j++) {
    9. navs[j].className = "";
    10. //给每一个子节点加上自定义属性:index
    11. navs[j].setAttribute("index", j);
    12. }
    13. //获取当前被点击的nav as上面的属性index
    14. var thisIndex = e.target.getAttribute("index");
    15. //当前元素的父级元素(nav),然后再获得下一个兄弟元素(nav_con),找他所有的子元素(nav_con div)
    16. var nav_cons = e.target.parentNode.nextElementSibling.children;
    17. //让所有nav_con div影藏
    18. for (var j = 0; j < nav_cons.length; j++) {
    19. nav_cons[j].style.display = "none";
    20. }
    21. //当前的nav_con div显示
    22. nav_cons[thisIndex].style.display = "block";
    23. //当前的节点 加上hover样式
    24. e.target.className = "hover";
    25. })
    26. }
    27. script>

  • 相关阅读:
    SpringCloud LoadBalancer 新一代负载均衡器
    【大数据开发技术】实验03-Hadoop读取文件
    HCIP第十五天笔记
    基于FDB方法的供给需求优化算法改进——基于工程设计问题的综合研究
    IB文学:戏剧作品中的对比手法
    excel表格损坏如何修复?
    深入了解前端开发规范的区别《Commonjs、AMD、CMD、ES6模块化》
    探索电子元器件商城:从原型到批量生产的选择
    java IO流【常用流对象一】
    什么是https(详细),http和https
  • 原文地址:https://blog.csdn.net/Bonsoir777/article/details/126555193