0


通过JavaScript、css、H5 实现简单的tab栏的交换和复用

一、效果展示

二、实现的大致原理

1.我们先通过css 和h5布局得到最基本的tab栏样式(有代码参考)

2.在获得样式,给我们所需要点击的目标设置监听事件,在获取节点,设置一个自定义的节点属性index,通过它在获取点击出现样式的节点,在经过寻找元素,设置全取消,点击相应的节点出现的效果。这里获取节点方式,都是通过点击元素获取父元素,在获得子元素,同级获得兄弟元素,在获取兄弟元素的子元素(笼统的解释,细节部分看代码段的解释)

三、H5的布局

没有特殊的地方,都是基本的写法,只要给定一定的选择器就可以了

  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>内容</div>
  9. <div>动态</div>
  10. <div>行业</div>
  11. </div>
  12. </div>
  13. <div class="tab">
  14. <div class="nav">
  15. <a href="javascript:;" class="hover">大学</a>
  16. <a href="javascript:;">中学</a>
  17. <a href="javascript:;">小学</a>
  18. </div>
  19. <div class="nav_con">
  20. <div>大学内容</div>
  21. <div>中学内容</div>
  22. <div>小学内容</div>
  23. </div>
  24. </div>

四、CSS样式

为了得到视屏中的样式,需要设置最基本的效果,通过浮动,是元素在同一行,浮动会脱离文档流,可以给a标签设置宽高,可以设置一些外边距,使得好看一些。注意设置出现内容的消失,我们默认只出现第一个。

  1. a{
  2. text-decoration: none;
  3. width: 180px;
  4. height: 30px;
  5. line-height: 30px;
  6. text-align: center;
  7. color: #666;
  8. float: left;
  9. margin-right: 15px;
  10. }
  11. .nav a{
  12. background-color: beige;
  13. }
  14. .nav a.hover{
  15. background-color: blue;
  16. }
  17. .nav_con div:first-child~div{
  18. display: none;
  19. }
  20. .nav::after{
  21. content: '';
  22. display: block;
  23. clear: both;
  24. }
  25. .nav_con{
  26. margin-bottom: 50px;
  27. }

五、JS代码内容

按照顺序来,流程如下

获取元素

通过委派给父亲添加监听事件

先获得当前的父节点,在通过父节点获得所有的子节点

设置排他思想

给每一个子节点加上一个自定义属性 index

获取当前被点击的nav a上面的属性index

获取当前元素的父级元素,在获得父级的兄弟,在找到子元素

当前nav_con 显示内容

当前节点获得hover样式

  1. let navNodes = document.querySelectorAll('.nav');
  2. for(let i=0;i<navNodes.length;i++){
  3. //通过委派给父亲添加监听事件
  4. navNodes[i].addEventListener('click',function(e){
  5. //先获得当前的父节点,在通过父节点获得所有的子节点
  6. let navs = e.target.parentNode.children;
  7. //设置排他思想
  8. for(let j=0;j<navs.length;j++){
  9. navs[j].className='';
  10. //给每一个子节点加上一个自定义属性 index
  11. navs[j].setAttribute("index",j)
  12. }
  13. //获取当前被点击的nav a上面的属性index
  14. let thisIndex = e.target.getAttribute("index");
  15. //获取当前元素的父级元素,在获得父级的兄弟,在找到子元素
  16. let nav_cons = e.target.parentNode.nextElementSibling.children;
  17. for(let j=0;j<nav_cons.length;j++){
  18. nav_cons[j].style.display = "none";
  19. }
  20. //当前nav_con 显示内容
  21. nav_cons[thisIndex].style.display="block"
  22. //当前节点获得hover样式
  23. e.target.className = "hover"
  24. })
  25. }

六、完整代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <style>
  9. a{
  10. text-decoration: none;
  11. width: 180px;
  12. height: 30px;
  13. line-height: 30px;
  14. text-align: center;
  15. color: #666;
  16. float: left;
  17. margin-right: 15px;
  18. }
  19. .nav a{
  20. background-color: beige;
  21. }
  22. .nav a.hover{
  23. background-color: blue;
  24. }
  25. .nav_con div:first-child~div{
  26. display: none;
  27. }
  28. .nav::after{
  29. content: '';
  30. display: block;
  31. clear: both;
  32. }
  33. .nav_con{
  34. margin-bottom: 50px;
  35. }
  36. </style>
  37. </head>
  38. <body>
  39. <div class="tab">
  40. <div class="nav">
  41. <a href="javascript:;" class="hover">公司新闻</a>
  42. <a href="javascript:;">公司动态</a>
  43. <a href="javascript:;">行业新闻</a>
  44. </div>
  45. <div class="nav_con">
  46. <div>内容</div>
  47. <div>动态</div>
  48. <div>行业</div>
  49. </div>
  50. </div>
  51. <div class="tab">
  52. <div class="nav">
  53. <a href="javascript:;" class="hover">大学</a>
  54. <a href="javascript:;">中学</a>
  55. <a href="javascript:;">小学</a>
  56. </div>
  57. <div class="nav_con">
  58. <div>大学内容</div>
  59. <div>中学内容</div>
  60. <div>小学内容</div>
  61. </div>
  62. </div>
  63. <script>
  64. let navNodes = document.querySelectorAll('.nav');
  65. for(let i=0;i<navNodes.length;i++){
  66. //通过委派给父亲添加监听事件
  67. navNodes[i].addEventListener('click',function(e){
  68. //先获得当前的父节点,在通过父节点获得所有的子节点
  69. let navs = e.target.parentNode.children;
  70. for(let j=0;j<navs.length;j++){
  71. navs[j].className='';
  72. //给每一个子节点加上一个自定义属性 index
  73. navs[j].setAttribute("index",j)
  74. }
  75. //获取当前被点击的nav a上面的属性index
  76. let thisIndex = e.target.getAttribute("index");
  77. //获取当前元素的父级元素,在获得父级的兄弟,在找到子元素
  78. let nav_cons = e.target.parentNode.nextElementSibling.children;
  79. for(let j=0;j<nav_cons.length;j++){
  80. nav_cons[j].style.display = "none";
  81. }
  82. //当前nav_con 显示内容
  83. nav_cons[thisIndex].style.display="block"
  84. //当前节点获得hover样式
  85. e.target.className = "hover"
  86. })
  87. }
  88. </script>
  89. </body>
  90. </html>
标签: javascript css 前端

本文转载自: https://blog.csdn.net/yzq0820/article/details/125899250
版权归原作者 小余努力搬砖 所有, 如有侵权,请联系我们删除。

“通过JavaScript、css、H5 实现简单的tab栏的交换和复用”的评论:

还没有评论