1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>选项卡</title>
    6. <!-- IMPORT CSS -->
    7. <style>
    8. * {
    9. margin: 0;
    10. padding: 0;
    11. }
    12. ul {
    13. list-style: none;
    14. }
    15. .tabBox {
    16. box-sizing: border-box;
    17. margin: 20px auto;
    18. width: 500px;
    19. }
    20. .navBox {
    21. display: flex;
    22. position: relative;
    23. top: 1px;
    24. }
    25. .navBox li {
    26. box-sizing: border-box;
    27. margin-right: 10px;
    28. padding: 0 10px;
    29. line-height: 35px;
    30. border: 1px solid #999;
    31. }
    32. .navBox li.active {
    33. border-bottom-color: #FFF;
    34. }
    35. .tabBox>div {
    36. display: none;
    37. box-sizing: border-box;
    38. padding: 10px;
    39. height: 150px;
    40. border: 1px solid #999;
    41. }
    42. .tabBox>div.active {
    43. display: block;
    44. }
    45. </style>
    46. <script>
    47. // 在结构加载之前获取元素肯定获取不到,所以我们一般把 JS 放到 BODY 末尾(就是为了等待结构加载完再去获取元素)
    48. // let tabBox = document.getElementById('tabBox');
    49. // console.log(tabBox); // null
    50. // 1.如果不需要获取页面中的元素,放到哪都可以
    51. // 2.就是想放到开头,还想获取元素,可以基于 window.onload 或者 JQ 中的 $(document).ready() 来处理
    52. </script>
    53. </head>
    54. <body>
    55. <div class="tabBox">
    56. <ul class="navBox">
    57. <li class="active">编程</li>
    58. <li>读书</li>
    59. <li>运动</li>
    60. </ul>
    61. <div class="active">编程使我快乐</div>
    62. <div>读书使我幸福</div>
    63. <div>运动使我健康</div>
    64. </div>
    65. <!-- IMPORT JS -->
    66. <script>
    67. // 链式调用方式,有点浪费性能
    68. $('.tabBox>.navBox>li').click(function () {
    69. let n = $(this).index();
    70. $(this).addClass('active')
    71. .siblings().removeClass('active')
    72. .parent()
    73. .nextAll('div').eq(n).addClass('active')
    74. .siblings().removeClass('active');
    75. });
    76. </script>
    77. <script>
    78. /*
    79. * $([function]):等待页面中所有的 DOM 结构加载完成才会执行这个方法
    80. * => $(document).ready([function])
    81. *
    82. * window.onload=function () {} :等待页面中所有的资源(DOM 结构、内容、其它的富媒体资源等)
    83. 都加载完成才会执行函数
    84. */
    85. /* $(function () {
    86. // 选项卡正常思路:给所有的 LI 绑定点击事件 ,当点击某一个 LI 的时候,让其有选中样式,而其余的LI 都移除选中样式,同时对应索引的 DIV 有选中样式,其余的 DIV 移除选中样式即可,这样就可以实现选项卡切换效果
    87. let $tabBox = $('#tabBox'),
    88. $navList = $tabBox.find('#navBox>li'),
    89. $divList = $tabBox.children('div');
    90. // JQ 特性:内置循环处理机制(基于一个 JQ 集合去操作某个方法,我们无需循环每一项单独操作,JQ 内部帮我们循环处理了,例如:$navList.css('color','#000')集合中有100项,JQ 会把100项都设置了这个样式,无需自己循环处理 )
    91. $navList.on('click', function () {
    92. // THIS:当前点击操作的元素 => $(this)此能调取 JQ 方法
    93. // JQ特性:链式写法
    94. let n = $(this).index();
    95. $(this).addClass('active').siblings().removeClass('active');
    96. // 根据点击 LI 的索引,在 DIV 集合中找到对应的那一项,然后这一项选中,它的兄弟项都移除选中即可
    97. $divList.eq(n).addClass('active').siblings().removeClass('active');
    98. });
    99. 基于 JQ 中的 EACH 遍历集合中的每一项,绑定点击事件
    100. $navList.each(function (index, $item) {
    101. // 参数顺序和内置的 FOR-EACH 是反着的
    102. // index:当前循环这一项的索引
    103. // $item:当前循环的这一项
    104. // this === $item:当前方法中的 THIS 也是循环的这一项
    105. $item.on('click', function () {
    106. ...
    107. });
    108. });
    109. $navList.each((index, $item) => {
    110. // THIS 不再是循环的这一项(箭头函数中没有 THIS)
    111. });
    112. }); */
    113. </script>
    114. </body>
    115. </html>