博客列表 >只用JS写选项卡

只用JS写选项卡

          
          原创
2022年11月12日 15:56:39597浏览
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport"
  6. content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  7. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  8. <title>选项卡</title>
  9. <style>
  10. .box >.nav{
  11. display: grid;
  12. grid-template-columns: repeat(10,1fr);
  13. }
  14. /*隐藏*/
  15. .hidden{display: none}
  16. /*显示*/
  17. .show{ background-color: lightgreen; }
  18. </style>
  19. </head>
  20. <body>
  21. <div class="box">
  22. <!-- 栏目-->
  23. <div class="nav"></div>
  24. <!-- 内容部分-->
  25. <div class="content"></div>
  26. </div>
  27. <script type="module">
  28. // 1. 导入模块
  29. import {createTab,setBtnStatus, setContentStatus} from "./ceshimodules/mymodules.js";
  30. // 获取导航栏
  31. let navs = document.querySelector('.nav');
  32. // 获取内容区
  33. let content = document.querySelector('.content')
  34. // console.log(content)
  35. // 2. 页面加载完成,创建栏目和对应的内容
  36. // 游览器加载完毕执行js ,传入导航栏和内容
  37. window.onload = function (){
  38. createTab(navs,content)
  39. }
  40. // 3. 点击栏目时,设置按钮的状态,与按钮对应的内容的状态
  41. // 事件委托(事件冒泡)
  42. navs.onclick = function (ev){
  43. // console.log(ev.currentTarget)
  44. // console.log(ev.target)
  45. // 1.当前的按钮设置高亮
  46. setBtnStatus(ev)
  47. // 2.与按钮对应的内容显示出来
  48. setContentStatus(ev,ev.target)
  49. }
  50. </script>
  51. </body>
  52. </html>

JS部分

  1. // 栏目数据
  2. const lanmu = [
  3. {'cid': 1, t1: '广东新闻'},
  4. {'cid': 2, t1: '深圳新闻'},
  5. {'cid': 3, t1: '佛山新闻'},
  6. ]
  7. // 内容数据
  8. const contentLists = [
  9. {
  10. id: 1,
  11. cid: 1,
  12. title: '标题1',
  13. content: [
  14. {
  15. title: '内容1',
  16. url: 'http://baidu.com'
  17. },
  18. {
  19. title: '内容1',
  20. url: 'http://baidu.com'
  21. },
  22. {
  23. title: '内容1',
  24. url: 'http://baidu.com'
  25. }
  26. ]
  27. },
  28. {
  29. id: 2,
  30. cid: 2,
  31. title: '标题2',
  32. content: [
  33. {
  34. title: '内容2',
  35. url: 'http://baidu.com'
  36. },
  37. {
  38. title: '内容2',
  39. url: 'http://baidu.com'
  40. },
  41. {
  42. title: '内容2',
  43. url: 'http://baidu.com'
  44. }
  45. ]
  46. },
  47. {
  48. id: 3,
  49. cid: 3,
  50. title: '标题3',
  51. content: [
  52. {
  53. title: '内容3',
  54. url: 'http://baidu.com'
  55. },
  56. {
  57. title: '内容3',
  58. url: 'http://baidu.com'
  59. },
  60. {
  61. title: '内容3',
  62. url: 'http://baidu.com'
  63. }
  64. ]
  65. },
  66. ]
  67. function createTab(navs, content) {
  68. // 1. 生成样目
  69. for (let i = 0; i < lanmu.length; i++) {
  70. let but1 = document.createElement('button');
  71. // 生成每一个button
  72. // button 的文字
  73. but1.textContent = lanmu[i]['t1'];
  74. but1.dataset.key = lanmu[i].cid
  75. if (i === 0) but1.classList.add('show')
  76. navs.append(but1)
  77. }
  78. // 2. 生成内容
  79. for (let i = 0; i < contentLists.length; i++) {
  80. // (1) 创建列表 <ul>
  81. let ul = document.createElement('ul');
  82. // (2) 添加列表索引<ul data-key>
  83. ul.dataset.key = contentLists[i]['cid']
  84. // (3) 默认显示第1个,其它隐藏
  85. ul.classList.add(i === 0 ? 'show' : 'hidden')
  86. // (4) 生成子元素<li><a>用于显示每一条数据
  87. for (let l = 0; l < contentLists[i].content.length; l++) {
  88. // 1. 生成 <li>
  89. let li = document.createElement('li');
  90. // 2. 生成 <a>
  91. let a = document.createElement('a')
  92. // 3. a.href
  93. // console.log('111',contentLists[i].content[l].url)
  94. a.href = contentLists[i].content[l].url
  95. // 4. a.textContent
  96. a.textContent = contentLists[i].content[l].title
  97. // console.log(contentLists[i].content[l].title)
  98. // 5. 将<a>添加到<li>
  99. li.append(a)
  100. // 6. <li>添加到<ul>
  101. ul.append(li)
  102. // 7. <ul>添加到内容容器中.content
  103. content.append(ul)
  104. }
  105. }
  106. }
  107. function setBtnStatus(ev){
  108. // 1.当前的按钮
  109. let currentBtn = ev.target;
  110. // console.log('当前的按钮',currentBtn)
  111. // 2. 去掉所有按钮的show, 遍历
  112. // ev.currentTarget: 事件绑定主体 , 父元素
  113. // console.log(ev.currentTarget.children);
  114. // console.log(typeof [...ev.currentTarget.children]);
  115. // console.log([...ev.currentTarget.children]);
  116. [...ev.currentTarget.children].forEach(function (btn){btn.classList.remove('show')})
  117. // 3.设置当前按钮的亮度
  118. currentBtn.classList.add('show')
  119. }
  120. function setContentStatus(ev,currentBtn){
  121. // 1. 获取所有列表
  122. let lists = document.querySelectorAll('.content>ul')
  123. // 2. 去掉所有列表show,换成hidden
  124. lists.forEach( list=>list.classList.replace('show','hidden'))
  125. // 3. 找到与栏目key对应的列表
  126. const gongtongdain = [...lists].find(list => list.dataset.key == currentBtn.dataset.key);
  127. // console.log(gongtongdain)
  128. // 4. 将要显示的列表,加上active,显示出来
  129. // gongtongdain.classList.replace()
  130. gongtongdain.classList.replace('hidden','show')
  131. }
  132. export {createTab,setBtnStatus, setContentStatus}

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议