JavaScript 选项卡实例(模块方法)- 仿php中文网首

编辑: admin 分类: 电脑知识 发布时间: 2023-06-14 来源:互联网
选项卡实例(模块方法)- 仿海外运维网首页“手册教程”页面效果

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}
【文章转自中东服务器 http://www.558idc.com/dibai.html欢迎留下您的宝贵建议】