博客列表 >基于JS模块的选项卡实现

基于JS模块的选项卡实现

安超
安超原创
2022年11月13日 22:40:01517浏览

1.基于JS模块的选项卡的实现主要有几个要点:

选项卡效果图如下:
选项卡效果图

2.html搭建基本框架

基于JS的选项卡的实现,基本上由JS的模块实现。
html搭建好基本框架,内容有JS动态填充。

  1. <div class="box">
  2. /* 选项卡选项*/
  3. <div class="menu"></div>
  4. /*选项卡内容*/
  5. <div class="content"></div>
  6. </div>

3.CSS实现基本样式

样式中最主要的时.hidden 和.active。用来切换内容的显示状态:显示或者不显示。

  1. <style>
  2. /* 目录选中状态时的样式 */
  3. .box .menu .active {
  4. display:block;
  5. background-color: green;
  6. }
  7. /* 内容选中状态时的样式 */
  8. .box .content .active{
  9. background-color: cornsilk;
  10. }
  11. /* 隐藏样式 */
  12. .hidden{
  13. display: none;
  14. }
  15. /* 目录,flex布局是为了盒子里的内容横排 */
  16. .menu{
  17. display: flex;
  18. }
  19. /* 目录里的按钮为圆角样式 */
  20. .menu button{
  21. border-radius: 10px;
  22. margin-left: 5px;
  23. }
  24. .box .content ul{
  25. list-style: none;
  26. margin-left: -30px;
  27. }
  28. .box .content ul li:nth-of-type(2n){
  29. background-color: rgb(224, 220, 228);
  30. }
  31. </style>

3.在html中实现JS模块的调用

  1. <!-- 导入模块时,scripttype必须是module -->
  2. <script type="module">
  3. // 导入模块,注意,用了别名,所以后续引用模块中的到处项时,必须使用.的形式
  4. import * as tab from "./content.js"; //注意模块的路径和别名的使用
  5. // 获取选项标题
  6. const menu = document.querySelector('.menu');
  7. // 获取每个选项下对应的内容
  8. const content = document.querySelector('.content');
  9. // 加载选项标题和选项内容
  10. window.onload = ()=>tab.createTab(menu,content);
  11. // 点击选项卡目录时,改变选中卡的背景色并切换选项卡内容,第二个参数是为了简化模块中的代码
  12. menu.onclick = (ev)=> tab.changeItems(menu,ev.target);
  13. </script>

4.JS模块

js模块包括动态建立DOM元素所需要的数据和函数。主要有选项卡的栏目及其对应的内容

  1. // 选项卡目录
  2. const menu =[
  3. {cid:1,content:"menu_1"},
  4. {cid:2,content:"menu_2"},
  5. {cid:3,content:"menu_3"}
  6. ];
  7. // 项目卡内容
  8. // 在visual studio code编辑器里,摁住alt后,鼠标左键单击多行中的某片段,可以更改多个地方。
  9. const neirong = [
  10. {key:1,cid:1,ncontent:[{url:"https://www.jacgoo.com",content:"试验测试网络1"},{url:"https://www.jacgoo.com",content:"环宇测试网1"},{url:"https://www.php.cn",content:"php中文网1"}]},
  11. {key:2,cid:2,ncontent:[{url:"https://www.jacgoo.com",content:"试验测试网络2"},{url:"https://www.jacgoo.com",content:"环宇测试网2"},{url:"https://www.php.cn",content:"php中文网2"}]},
  12. {key:3,cid:3,ncontent:[{url:"https://www.jacgoo.com",content:"试验测试网络3"},{url:"https://www.jacgoo.com",content:"环宇测试网3"},{url:"https://www.php.cn",content:"php中文网3"}]}
  13. ]
  14. function createTab(type,card){
  15. // 创建项目目录
  16. for(let i = 0 ; i < menu.length;i++){
  17. const btn = document.createElement('button');
  18. // 添加按钮的文本内容
  19. btn.textContent = menu[i].content;
  20. // 添加按钮的data-key属性
  21. btn.dataset.key = menu[i].cid;
  22. // 将第一个按钮家加上active样式
  23. if(i === 0 ) btn.classList.add('active');
  24. type.append(btn);
  25. }
  26. //创建内容
  27. //1.创建ul
  28. for(let j = 0 ;j < neirong.length;j++){
  29. const ul = document.createElement("ul");
  30. //为ul添加data-key属性,便于改变目录时改变内容
  31. ul.dataset.key = neirong[j].cid;
  32. // 创建每个ul下的li和a
  33. for(let k = 0 ;k < neirong[j].ncontent.length;k++){
  34. const li = document.createElement('li');
  35. const a = document.createElement('a');
  36. a.href = neirong[j].ncontent[k].url;
  37. a.textContent = neirong[j].ncontent[k].content;
  38. li.append(a);
  39. ul.append(li);
  40. }
  41. ul.classList.add(j === 0?'active':'hidden');
  42. card.append(ul);
  43. }
  44. }
  45. // 点击目录里的选项时,改变活动目录的背景色,同时改变内容
  46. function changeItems(type,ev){
  47. // 获取所点目录的key值
  48. const key = ev.dataset.key;
  49. console.log(type);
  50. // 去掉目录里所有的active类
  51. [...type.children].forEach(btn => btn.classList.remove('active'));
  52. // 为目录里的key值等于常亮key的button加上active类
  53. [...type.children].find(btn => btn.dataset.key === key).classList.add('active');
  54. // 找到目录选项卡的近邻兄弟元素content
  55. const con = type.nextElementSibling;
  56. console.log(con.children);
  57. // 去掉内容上的active类;
  58. [...con.children].forEach(nr => nr.classList.replace('active','hidden'));
  59. [...con.children].find(nr => nr.dataset.key === key).classList.replace('hidden','active');
  60. }
  61. export {createTab,changeItems};
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议