博客列表 >选项卡案例的实现

选项卡案例的实现

手机用户1580651468
手机用户1580651468原创
2022年11月14日 15:16:41287浏览

选项卡案例的实现

一、选项卡案例的实现

一)html的关键代码块

  1. <head>
  2. <meta charset="UTF-8" />
  3. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  5. <title>经典选项卡</title>
  6. <style>
  7. .hidden {
  8. display: none;
  9. }
  10. .active {
  11. display: block;
  12. }
  13. .type > *.active {
  14. height: 30px;
  15. border-radius: 6px;
  16. color: red;
  17. background-color: lightgreen;
  18. }
  19. .content > *.active {
  20. height: auto;
  21. width: 350px;
  22. background-color: lightgreen;
  23. }
  24. .content > ul > li {
  25. list-style: none;
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <!-- 选项卡的功能
  31. 1.栏目:
  32. 2.内容:
  33. -->
  34. <div class="box">
  35. <div class="type" style="display: flex"></div>
  36. <div class="content"></div>
  37. </div>

二)js的代码块

1.js文件块代码

  1. // todo 选项卡的数据以及方法
  2. // * 栏目数据
  3. const cates = [
  4. { cid: 1, cname: '国际新闻' },
  5. { cid: 2, cname: '中国新闻' },
  6. { cid: 3, cname: '安徽新闻' },
  7. ];
  8. // * 列表数据
  9. // 列表数据,必须与指定的栏目,一一对应
  10. const details = [
  11. {
  12. key: 1,
  13. cid: 1,
  14. content: [
  15. {
  16. title: '俄罗斯宣布从赫尔松部分地区撤军',
  17. url: 'https://news.ifeng.com/c/8KoK54urn1k',
  18. },
  19. {
  20. title: '俄罗斯宣布从赫尔松部分地区撤军',
  21. url: 'https://news.ifeng.com/c/8KoK54urn1k',
  22. },
  23. {
  24. title: '俄罗斯宣布从赫尔松部分地区撤军',
  25. url: 'https://news.ifeng.com/c/8KoK54urn1k',
  26. },
  27. ],
  28. },
  29. {
  30. key: 2,
  31. cid: 2,
  32. content: [
  33. {
  34. title: '空战隐身无人僚机亮相!',
  35. url: 'https://news.ifeng.com/c/8KoeDFJXF1b',
  36. },
  37. {
  38. title: '空战隐身无人僚机亮相!',
  39. url: 'https://news.ifeng.com/c/8KoeDFJXF1b',
  40. },
  41. {
  42. title: '空战隐身无人僚机亮相!',
  43. url: 'https://news.ifeng.com/c/8KoeDFJXF1b',
  44. },
  45. ],
  46. },
  47. {
  48. key: 3,
  49. cid: 3,
  50. content: [
  51. {
  52. title: '安康码”上新!家庭成员核酸情况查询更便捷',
  53. url: 'https://ah.ifeng.com/c/8KkGUDhAZNZ',
  54. },
  55. {
  56. title: '安康码”上新!家庭成员核酸情况查询更便捷',
  57. url: 'https://ah.ifeng.com/c/8KkGUDhAZNZ',
  58. },
  59. {
  60. title: '安康码”上新!家庭成员核酸情况查询更便捷',
  61. url: 'https://ah.ifeng.com/c/8KkGUDhAZNZ',
  62. },
  63. ],
  64. },
  65. ];
  66. // 创建样目和对应的内容区
  67. function createTab(type, content) {
  68. // 1. 生成样目
  69. for (let i = 0; i < cates.length; i++) {
  70. // (1) 创建一个按钮
  71. const btn = document.createElement('button');
  72. // (2) 设置按钮的文本
  73. btn.textContent = cates[i].cname;
  74. // (3) 给按钮添加一个自定义 data-key, 主要是为了一内容id绑定
  75. btn.dataset.key = cates[i].cid;
  76. // (4) 默认高亮第1个,所以第一个加上class="active"
  77. if (i === 0) btn.classList.add('active');
  78. // (5) 将新按钮, 添加到栏目容器元素中 type
  79. type.append(btn);
  80. }
  81. // 2. 生成内容
  82. for (let i = 0; i < details.length; i++) {
  83. // (1) 创建列表 <ul>
  84. const ul = document.createElement('ul');
  85. // (2) 添加列表索引<ul data-key>
  86. ul.dataset.key = details[i].cid;
  87. // (3) 默认显示第1个,其它隐藏
  88. ul.classList.add(i === 0 ? 'active' : 'hidden');
  89. // (4) 生成子元素<li><a>用于显示每一条数据
  90. for (let k = 0; k < details[i].content.length; k++) {
  91. // 1. 生成 <li>
  92. const li = document.createElement('li');
  93. // 2. 生成 <a>
  94. const a = document.createElement('a');
  95. // 3. a.href
  96. a.href = details[i].content[k].url;
  97. // 4. a.textContent
  98. a.textContent = details[i].content[k].title;
  99. // 5. 将<a>添加到<li>
  100. li.append(a);
  101. // 6. <li>添加到<ul>
  102. ul.append(li);
  103. // 7. <ul>添加到内容容器中.content
  104. content.append(ul);
  105. }
  106. }
  107. }
  108. // 设置按钮高亮
  109. function setBtnStatus(ev) {
  110. // 1. 当前按钮
  111. const currentBtn = ev.target;
  112. // 2. 去掉所有按钮的active, 遍历
  113. // ev.currentTarget: 事件绑定主体 , 父元素
  114. [...ev.currentTarget.children].forEach(btn => btn.classList.remove('active'));
  115. // 3. 设置当前按钮高亮
  116. currentBtn.classList.add('active');
  117. }
  118. // 设置内容状态: 与按钮对应的内容显示出来
  119. function setContentStatus(ev, currentBtn) {
  120. // 1. 获取所有列表
  121. const lists = document.querySelectorAll('.content > ul');
  122. // 2. 去掉所有列表active,换成hidden
  123. lists.forEach(list => list.classList.replace('active', 'hidden'));
  124. // 3. 找到与栏目key对应的列表
  125. // lists: NodeList对象, 不是数组
  126. const currentList = [...lists].find(list => list.dataset.key == currentBtn.dataset.key);
  127. // 返回当前应该高亮显示的列表
  128. // 4. 将要显示的列表,加上active,显示出来
  129. currentList.classList.replace('hidden', 'active');
  130. }
  131. export { createTab, setBtnStatus, setContentStatus };

1.js文件块代码2

  1. <script type="module">
  2. // 导入模块
  3. import {
  4. createTab,
  5. setBtnStatus,
  6. setContentStatus,
  7. } from "./modules/tabs.js";
  8. const type = document.querySelector(".type");
  9. const content = document.querySelector(".content");
  10. window.onload = () => createTab(type, content);
  11. // 3.点击栏目时,设置按钮的状态,与按钮对应的内容
  12. // 事件委托(事件冒泡)
  13. type.onclick = (ev) => {
  14. // ev.currentTarget
  15. // ev.target
  16. //1. 设置按钮高亮
  17. setBtnStatus(ev);
  18. // 2与按钮对应的内容显示出来
  19. setContentStatus(ev, ev.target);
  20. };
  21. </script>

二、实现的效果图

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