博客列表 >JS学习小结(选项卡实现、轮播图实现完整版)

JS学习小结(选项卡实现、轮播图实现完整版)

庖丁
庖丁原创
2021年01月25日 14:15:36557浏览

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>
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议