• js实现tab栏切换


    目录

    1、排他思想实现

    2、事件委托实现


    1、排他思想实现

    思路:

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

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

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

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

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

    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>tab栏切换title>
    8. <style>
    9. * {
    10. margin: 0;
    11. padding: 0;
    12. }
    13. .tab {
    14. width: 590px;
    15. height: 340px;
    16. margin: 20px;
    17. border: 1px solid #e4e4e4;
    18. }
    19. .tab-nav {
    20. width: 100%;
    21. height: 60px;
    22. line-height: 60px;
    23. display: flex;
    24. justify-content: space-between;
    25. }
    26. .tab-nav h3 {
    27. font-size: 24px;
    28. font-weight: normal;
    29. margin-left: 20px;
    30. }
    31. .tab-nav ul {
    32. list-style: none;
    33. display: flex;
    34. justify-content: flex-end;
    35. }
    36. .tab-nav ul li {
    37. margin: 0 20px;
    38. font-size: 14px;
    39. }
    40. .tab-nav ul li a {
    41. text-decoration: none;
    42. border-bottom: 2px solid transparent;
    43. color: #333;
    44. }
    45. .tab-nav ul li a.active {
    46. border-color: #e1251b;
    47. color: #e1251b;
    48. }
    49. .tab-content {
    50. padding: 0 16px;
    51. }
    52. .tab-content .item {
    53. display: none;
    54. }
    55. .tab-content .item.active {
    56. display: block;
    57. }
    58. style>
    59. head>
    60. <body>
    61. <div class="tab">
    62. <div class="tab-nav">
    63. <h3>每日特价h3>
    64. <ul>
    65. <li><a class="active" href="javascript:;">精选a>li>
    66. <li><a href="javascript:;">美食a>li>
    67. <li><a href="javascript:;">百货a>li>
    68. <li><a href="javascript:;">个护a>li>
    69. <li><a href="javascript:;">预告a>li>
    70. ul>
    71. div>
    72. <div class="tab-content">
    73. <div class="item active"><img src="./images/tab00.png" alt="" />div>
    74. <div class="item"><img src="./images/tab01.png" alt="" />div>
    75. <div class="item"><img src="./images/tab02.png" alt="" />div>
    76. <div class="item"><img src="./images/tab03.png" alt="" />div>
    77. <div class="item"><img src="./images/tab04.png" alt="" />div>
    78. div>
    79. div>
    80. <script>
    81. // 需求 点击tab栏进行对应内容切换
    82. // 1 获取相关元素
    83. const lis = document.querySelectorAll('.tab-nav li')
    84. const divs = document.querySelectorAll('.tab-content div')
    85. // 2 循环绑定事件
    86. for (let i = 0; i < lis.length; i++) {
    87. lis[i].addEventListener('mouseenter', function () {
    88. // 2-1 让点击的菜单加active 其他移除
    89. document.querySelector('.tab-nav a.active').classList.remove('active')
    90. this.querySelector('a').classList.add('active')
    91. // 2-2 对应的内容显示 其他内容隐藏
    92. document
    93. .querySelector('.tab-content div.active')
    94. .classList.remove('active')
    95. divs[i].classList.add('active')
    96. })
    97. }
    98. script>
    99. body>
    100. html>

    2、事件委托实现

    思路:

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

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

    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>tab栏切换title>
    8. <style>
    9. * {
    10. margin: 0;
    11. padding: 0;
    12. }
    13. .tab {
    14. width: 590px;
    15. height: 340px;
    16. margin: 20px;
    17. border: 1px solid #e4e4e4;
    18. }
    19. .tab-nav {
    20. width: 100%;
    21. height: 60px;
    22. line-height: 60px;
    23. display: flex;
    24. justify-content: space-between;
    25. }
    26. .tab-nav h3 {
    27. font-size: 24px;
    28. font-weight: normal;
    29. margin-left: 20px;
    30. }
    31. .tab-nav ul {
    32. list-style: none;
    33. display: flex;
    34. justify-content: flex-end;
    35. }
    36. .tab-nav ul li {
    37. margin: 0 20px;
    38. font-size: 14px;
    39. }
    40. .tab-nav ul li a {
    41. text-decoration: none;
    42. border-bottom: 2px solid transparent;
    43. color: #333;
    44. }
    45. .tab-nav ul li a.active {
    46. border-color: #e1251b;
    47. color: #e1251b;
    48. }
    49. .tab-content {
    50. padding: 0 16px;
    51. }
    52. .tab-content .item {
    53. display: none;
    54. }
    55. .tab-content .item.active {
    56. display: block;
    57. }
    58. style>
    59. head>
    60. <body>
    61. <div class="tab">
    62. <div class="tab-nav">
    63. <h3>每日特价h3>
    64. <ul>
    65. <li><a class="active" href="javascript:;" data-id="0">精选a>li>
    66. <li><a href="javascript:;" data-id="1">美食a>li>
    67. <li><a href="javascript:;" data-id="2">百货a>li>
    68. <li><a href="javascript:;" data-id="3">个护a>li>
    69. <li><a href="javascript:;" data-id="4">预告a>li>
    70. ul>
    71. div>
    72. <div class="tab-content">
    73. <div class="item active"><img src="./images/tab00.png" alt="" />div>
    74. <div class="item"><img src="./images/tab01.png" alt="" />div>
    75. <div class="item"><img src="./images/tab02.png" alt="" />div>
    76. <div class="item"><img src="./images/tab03.png" alt="" />div>
    77. <div class="item"><img src="./images/tab04.png" alt="" />div>
    78. div>
    79. div>
    80. <script>
    81. // 需求 点击tab栏进行对应内容切换
    82. // 1 获取相关元素
    83. const tab_nav = document.querySelector('.tab-nav')
    84. const divs = document.querySelectorAll('.tab-content div')
    85. // 2 绑定事件
    86. tab_nav.addEventListener('click', function (e) {
    87. if (e.target.tagName === 'A') {
    88. // 2-1 让点击的菜单加active 其他移除
    89. document.querySelector('.tab-nav a.active').classList.remove('active')
    90. // console.log(this) // this 永远绑定的事件源 e.target -> 真正触发的元素
    91. e.target.classList.add('active')
    92. // 2-2 对应的内容显示 其他内容隐藏
    93. document
    94. .querySelector('.tab-content div.active')
    95. .classList.remove('active')
    96. divs[e.target.dataset.id].classList.add('active')
    97. }
    98. })
    99. script>
    100. body>
    101. html>

  • 相关阅读:
    Flink SQL Over 聚合详解
    Mysql底层数据结构为什么选择B+树
    温故而知新:IIR滤波器设计的方法,幅频计算和参数理解
    【C++ 操作符重载:定制自己的运算符行为】
    UE4 WebUI插件使用指南
    winform 获取指定的form
    Java8新特性:stream流应用,丢掉for循环实现复杂遍历功能
    Vue路由与nodejs环境搭建
    R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化...
    牛客刷题<32~34>非整数倍数和整数倍数数据位宽转换
  • 原文地址:https://blog.csdn.net/m0_56713342/article/details/134428091