Blogger Information
Blog 29
fans 0
comment 0
visits 11079
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
JavaScript 选项卡实例(模块方法)- 仿php中文网首页“手册教程”
尹辉
Original
248 people have browsed it

选项卡实例(模块方法)- 仿php中文网首页“手册教程”

页面效果

HTML 代码

  1. <div class="manualBox">
  2. <div class="manualTab">
  3. <h2>手册教程</h2>
  4. </div>
  5. <div class="manualContent"></div>
  6. </div>
  7. <script type="module">
  8. // 获取选项卡容器元素
  9. const tab = document.querySelector('.manualTab')
  10. // 获取内容区容器元素
  11. const content = document.querySelector('.manualContent')
  12. // 导入模块
  13. import * as tabs from './tabs.js'
  14. // 页面载入时自动生成选项卡和内容
  15. window.onload = tabs.createTab(tab,content);
  16. // 点击选项卡按钮切换
  17. tab.onclick = ev =>{
  18. tabs.setTabMenu(ev);
  19. tabs.setContent(ev,ev.target);
  20. }
  21. </script>

JavaScript 代码

  1. /**
  2. * @desc 创建选项卡区按钮组数组 tabMenu[]
  3. * @param {number} tabId - 选项卡ID
  4. * @param {string} tabName - 选项卡文本内容
  5. */
  6. const tabMenu = [
  7. {tabId: 1, tabName: '推荐'},
  8. {tabId: 2, tabName: '最新'},
  9. {tabId: 3, tabName: '热门'},
  10. ]
  11. /**
  12. * @desc 创建内容区数组 details[]
  13. * @param {number} key - 内容区key == tabId
  14. * @param {array} content - 内容区数组
  15. * @param {string} src - 内容图片 src
  16. * @param {string} title - 内容标题
  17. * @param {string} brief - 内容介绍
  18. */
  19. const details = [
  20. {
  21. key: 1,
  22. content: [
  23. {
  24. src: 'https://img.php.cn/upload/course/000/000/001/6221dba306f53195.png',
  25. title: 'php完全自学手册',
  26. brief: '欢迎朋友们加入php自学的行列,php语言是一门入门简单,容易上手的通用开源脚本语言',
  27. },
  28. ......
  29. ],
  30. },
  31. { key: 2, content: [ ...... ], },
  32. { key: 3, content: [ ...... ], },
  33. ]
  34. /**
  35. * @desc 创建栏目和内容函数 createTab(tab, content)
  36. * @param {Element} tab - 选项卡容器
  37. * @param {Element} content - 内容区容器
  38. */
  39. function createTab(tab, content) {
  40. // 1. 生成选项卡
  41. const div = document.createElement('div')
  42. for (let i = 0; i < tabMenu.length; i++) {
  43. const btn = document.createElement('button')
  44. btn.textContent = tabMenu[i].tabName
  45. // 为每个按钮添加一个自定义属性: data-key
  46. // data-key = tabMenu[i].key
  47. btn.dataset.key = tabMenu[i].tabId
  48. // 默认第一个按钮高亮显示
  49. if (i === 0) {
  50. btn.classList.add('active')
  51. }
  52. div.append(btn)
  53. }
  54. tab.append(div)
  55. // 2. 生成内容
  56. for (let i = 0; i < details.length; i++) {
  57. // 创建<ul>
  58. const ul = document.createElement('ul')
  59. // 为每个<ul>添加自定义属性data-key
  60. ul.dataset.key = details[i].key
  61. // 全部内容加载时,默认全隐藏,只要显示第一个按钮对应的内容
  62. ul.classList.add(i === 0 ? 'active' : 'hidden')
  63. // 循环: 将与按钮对应的数据全部渲染出来
  64. for (let j = 0; j < details[i].content.length; j++) {
  65. const li = document.createElement('li')
  66. const img = document.createElement('img')
  67. img.src = details[i].content[j].src
  68. const div = document.createElement('div')
  69. const h4 = document.createElement('h4')
  70. const p = document.createElement('p')
  71. h4.textContent = details[i].content[j].title
  72. p.textContent = details[i].content[j].brief
  73. div.append(h4)
  74. div.append(p)
  75. li.append(img)
  76. li.append(div)
  77. ul.append(li)
  78. content.append(ul)
  79. }
  80. }
  81. }
  82. /**
  83. * @desc 设置选项卡激活函数 setTabMenu(ev)
  84. * @param {} ev - 事件(点击事件)
  85. */
  86. function setTabMenu(ev){
  87. // 如果点击的不是按钮则返回
  88. if (ev.target.tagName !== 'BUTTON') return false;
  89. // 先取消所有选项卡激活状态
  90. ;[...ev.target.parentElement.children].forEach(btn => btn.classList.remove('active'))
  91. // 再把当前选项卡设置为激活状态
  92. ev.target.classList.add('active')
  93. }
  94. /**
  95. * @desc 设置内容区切换激活函数 currentTab(ev,currentTab)
  96. * @param {} ev - 事件(点击事件)
  97. * @param {Element} currentTab - 事件(点击事件)
  98. */
  99. function setContent(ev, currentTab){
  100. // 如果点击的不是按钮则返回
  101. if (ev.target.tagName !== 'BUTTON') return false;
  102. // 获取内容区所有 ul,并全部设置为 hidden
  103. const contentLists = document.querySelectorAll('.manualContent > ul')
  104. contentLists.forEach(list => list.classList.replace('active', 'hidden'))
  105. // 将与当前选项卡对应的 ul 设置为 active
  106. const currentList = [...contentLists].find(list => list.dataset.key === currentTab.dataset.key)
  107. currentList.classList.replace('hidden','active')
  108. }
  109. // 导出模块
  110. export {tabMenu,details,createTab,setTabMenu,setContent}
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
Author's latest blog post