Blogger Information
Blog 20
fans 0
comment 0
visits 15089
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
JS学习小结(选项卡实现、轮播图实现完整版)
庖丁
Original
562 people have browsed it

1.选项卡

选项卡需要用到一个classList属性,通过该属性加方法的方式,来增、删、改元素的css样式。

classList.add() 增加样式
classList.remove() 删除样式
classList.replace()替换样式

选项卡还会用到自定义属性

比如,class=”data-index”,以data-自定义属性名 的方式命名,
读取自定义属性需要用到 dataset.自定义属性名
示例代码如下

  1. <div class=".box">
  2. <ul class="tab">
  3. <li data-index="1" class="active">html教程</li>
  4. <li data-index="2">JS小结</li>
  5. <li data-index="3">php代码</li>
  6. </ul>
  7. <ul data-index="1" class="item active">
  8. <li>html教程1</li>
  9. <li>html教程2</li>
  10. <li>html教程3</li>
  11. </ul>
  12. <ul data-index="2" class="item">
  13. <li>JS小结1</li>
  14. <li>JS小结1</li>
  15. <li>JS小结1</li>
  16. </ul>
  17. <ul data-index="3" class="item">
  18. <li>php代码1</li>
  19. <li>php代码1</li>
  20. <li>php代码1</li>
  21. </ul>
  22. </div>
  23. <script>
  24. const tab = document.querySelector(".tab");
  25. const item = document.querySelectorAll('.item');
  26. console.log(item);
  27. tab.onclick = (ev)=>{
  28. [...tab.children].forEach(item=>
  29. item.classList.remove('active'));
  30. ev.target.classList.add('active');
  31. item.forEach(item=>item.classList.remove("active"));
  32. [...item].filter(item=>item.dataset.index === ev.target.dataset.index)[0].classList.add('active');
  33. };
  34. </script>

2.轮播图(补全版)

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>轮播图</title>
  7. <link rel="stylesheet" href="banner/style.css" />
  8. </head>
  9. <body>
  10. <div class="container">
  11. <!-- 1. 图片组 -->
  12. <nav class="imgs">
  13. <a href=""><img src="banner/banner1.jpg" alt="" data-index="1" class="active" /></a>
  14. <a href=""><img src="banner/banner2.jpg" alt="" data-index="2" /></a>
  15. <a href=""><img src="banner/banner3.jpg" alt="" data-index="3" /></a>
  16. <a href=""><img src="banner/banner4.jpg" alt="" data-index="4" /></a>
  17. </nav>
  18. <!-- 2. 图片小按钮 -->
  19. <nav class="btns">
  20. <!-- 这些小按钮应该根据图片数量自动生成 -->
  21. <!-- <a href="" data-index="1" class="active"></a>
  22. <a href="" data-index="2"></a>
  23. <a href="" data-index="3"></a>
  24. <a href="" data-index="4"></a> -->
  25. </nav>
  26. <!-- 3. 翻页 -->
  27. <nav class="skip">
  28. <a href="#" class="prev">&lt;</a>
  29. <a href="#" class="next">&gt;</a>
  30. </nav>
  31. </div>
  32. <script>
  33. // 所有图片
  34. const imgs = document.querySelectorAll(".container > .imgs img");
  35. // 按钮组
  36. const btnGroup = document.querySelector(".container > .btns");
  37. // 翻页按钮
  38. const skip = document.querySelector(".container > .skip");
  39. // 创建出一组与图片数量对应的小按钮
  40. function autoCreateBtns(ele, imgLength) {
  41. const frag = document.createDocumentFragment();
  42. for (let i = 0; i < imgLength; i++) {
  43. const a = document.createElement("a");
  44. a.href = "#";
  45. a.dataset.index = i + 1;
  46. if (i === 0) a.classList.add("active");
  47. frag.appendChild(a);
  48. }
  49. ele.appendChild(frag);
  50. }
  51. // 调用创建小按钮的函数
  52. autoCreateBtns(btnGroup, imgs.length);
  53. // 为刚刚生成的小按钮们添加点击事件
  54. const btns = document.querySelectorAll(".container > .btns > *");
  55. // 下面声明二个公共函数
  56. // 1. 获取激活的元素
  57. function getActiveEle(eles) {
  58. let activities = [...eles].filter(img => img.classList.contains("active"));
  59. return activities.shift();
  60. }
  61. // 2. 设置激活的元素,根据按钮索引更新正在显示的图片
  62. function setActiveEle(btnIndex) {
  63. [imgs, btns].forEach(arr => {
  64. // 将之前的状态全部重置到初始化(清空)
  65. getActiveEle(arr).classList.remove("active");
  66. arr.forEach(item => {
  67. if (item.dataset.index === btnIndex) {
  68. item.classList.add("active");
  69. }
  70. });
  71. });
  72. }
  73. // 为每一个小按钮添加事件
  74. btns.forEach(btn => btn.addEventListener("click", ev => setActiveEle(ev.target.dataset.index)));
  75. // 1. 为翻页按钮添加功能
  76. // 1.1 获取当前激活元素的上一个元素自定义属性序号
  77. function prevActiveEle(eles) {
  78. let indexNumber = getActiveEle(eles).dataset.index;
  79. if (indexNumber == 1) {
  80. return String(eles.length);
  81. } else {
  82. return String(indexNumber - 1);
  83. }
  84. }
  85. // 1.2 获取当前激活元素的下一个元素自定义属性序号
  86. function nextActiveEle(eles) {
  87. let indexNumber = getActiveEle(eles).dataset.index;
  88. if (indexNumber == eles.length) {
  89. return 1 + "";
  90. } else {
  91. return String(Number(indexNumber) + 1);
  92. }
  93. }
  94. // 1.3 为上翻页按钮添加点击事件
  95. skip.children[0].addEventListener('click',()=>setActiveEle(prevActiveEle(imgs)));
  96. // 1.4 为下翻页按钮添加点击事件
  97. skip.children[1].onclick =()=>setActiveEle(nextActiveEle(imgs));
  98. // 2. 当鼠标移出时,图片的每隔2秒的自动播放,当鼠标移入时自动停止播放
  99. // 2.1 创建派发事件
  100. const evclick = new Event('click');
  101. // 2.2 使用间歇式定时器,给下翻页按钮添加事件派发,间隔2秒
  102. let timer = setInterval('skip.children[1].dispatchEvent(evclick)',2000);
  103. // 2.3 获取图片组的父元素
  104. const imgsBox = document.querySelector(".container");
  105. // 2.4 当鼠标移入时自动停止播放
  106. imgsBox.onmouseover=()=>clearInterval(timer);
  107. // 2.5 当鼠标移除时继续自动播放
  108. imgsBox.onmouseout=()=>timer = setInterval('skip.children[1].dispatchEvent(evclick)',2000);
  109. </script>
  110. </body>
  111. </html>
Correcting teacher:天蓬老师天蓬老师

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