Blogger Information
Blog 50
fans 0
comment 0
visits 31520
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
选项卡案例的实现
手机用户1580651468
Original
288 people have browsed it

选项卡案例的实现

一、选项卡案例的实现

一)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>

二、实现的效果图

Correcting teacher:PHPzPHPz

Correction status:qualified

Teacher's comments:完成的很好, 继续加油
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments