博客列表 >实战: 仿淘宝移动端轮播图-模块

实战: 仿淘宝移动端轮播图-模块

放手去爱
放手去爱原创
2022年11月17日 17:04:14374浏览

实战: 仿淘宝移动端轮播图-模块

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>实战: 仿淘宝移动端轮播图-模块</title>
  8. <link rel="stylesheet" href="static/css/slideshow.css" />
  9. </head>
  10. <body>
  11. <div class="slideshow">
  12. <!-- 1. 图片容器 -->
  13. <div class="imgs"></div>
  14. <!-- 2. 按钮容器 -->
  15. <div class="btns"></div>
  16. </div>
  17. <script type="module">
  18. // 1. 获取图片容器和按钮容器
  19. const imgs = document.querySelector(".imgs");
  20. const btns = document.querySelector(".btns");
  21. // console.log(imgs, btns);
  22. // 2. 导入轮播图模块
  23. // (1) 创建图片组: createImgs()
  24. // (2) 创建按钮组: createBtns()
  25. // (3) 创建按钮事件: switchImg()
  26. // (4) 定时器: timePlay()
  27. import {
  28. createImgs,
  29. createBtns,
  30. switchImg,
  31. timePlay,
  32. } from "./static/js/slideshow.js";
  33. // 3. 加载成功将图片以及按钮渲染出来
  34. window.onload = () => {
  35. // (1) 创建图片组
  36. createImgs(imgs);
  37. // (2) 创建按钮组
  38. createBtns(imgs, btns);
  39. // 事件委托不能滥用,将点击事件绑定到每一个按钮上
  40. // (3) 创建按钮事件
  41. [...btns.children].forEach(function (btn) {
  42. btn.onclick = function () {
  43. switchImg(this, imgs);
  44. };
  45. });
  46. // 按钮数组,三个span
  47. const btnArr = [...btns.children];
  48. console.log(btnArr);
  49. // 按钮索引的数组
  50. const btnKeys = Object.keys(btns.children);
  51. console.log(btnKeys);
  52. // (4) 定时器: timePlay()
  53. setInterval(
  54. function (btnArr, btnKeys) {
  55. timePlay(btnArr, btnKeys);
  56. },
  57. 2000,
  58. btnArr,
  59. btnKeys
  60. );
  61. };
  62. </script>
  63. <script>
  64. // todo 轮播图模块
  65. // * 1. 图片组
  66. const imgArr = [
  67. {
  68. key: 1,
  69. src: "static/images/item1.jpeg",
  70. url: "https://php.cn",
  71. },
  72. {
  73. key: 2,
  74. src: "static/images/item2.jpeg",
  75. url: "https://php.cn",
  76. },
  77. {
  78. key: 3,
  79. src: "static/images/item3.jpeg",
  80. url: "https://php.cn",
  81. },
  82. ];
  83. // * 2. 创建图片组
  84. function createImgs(imgs) {
  85. // 图片资源比较大,所以建议用文档片断来做
  86. const frag = new DocumentFragment();
  87. for (let i = 0; i < imgArr.length; i++) {
  88. // 1. 创建图片元素
  89. // const img = document.createElement('img')
  90. const img = new Image();
  91. // 2. 添加属性
  92. // src
  93. img.src = imgArr[i].src;
  94. // data-key
  95. img.dataset.key = imgArr[i].key;
  96. // class='active': 第一张
  97. if (i === 0) img.classList.add("active");
  98. // 3. 添加事件
  99. img.onclick = () => (location.href = imgArr[i].url);
  100. // 添加图片分二步: 第一步加到内存中的文档片断元素上, 第二步再加到图片容器上
  101. // 4. 添加图片到片断中
  102. frag.append(img);
  103. }
  104. // 5. 将片断添加到图片容器元素中
  105. imgs.append(frag);
  106. }
  107. // * 3. 创建按钮组
  108. function createBtns(imgs, btns) {
  109. // 计算出所有图片的数量,根据这个来创建相同数量的按钮
  110. // console.log(imgs.childElementCount);
  111. let length = imgs.childElementCount;
  112. for (let i = 0; i < length; i++) {
  113. // 1. 生成按钮: <span>
  114. const btn = document.createElement("span");
  115. // 2. 按钮索引: data-key, 必须与图片索引一致
  116. btn.dataset.key = imgs.children[i].dataset.key;
  117. // 3. 第1个按钮处于激活状态
  118. if (i === 0) btn.classList.add("active");
  119. // 4. 添加到容器中
  120. btns.append(btn);
  121. }
  122. }
  123. // * 4. 按钮点击事件
  124. function switchImg(btn, imgs) {
  125. // 1. 去掉图片和按钮的激活状态
  126. [...btn.parentNode.children].forEach((btn) =>
  127. btn.classList.remove("active")
  128. );
  129. [...imgs.children].forEach((img) => img.classList.remove("active"));
  130. // 2. 将当前的按钮处于激活状态
  131. btn.classList.add("active");
  132. // 3. 根据按钮索引,找到对应的图片
  133. const currImg = [...imgs.children].find(function (img) {
  134. return img.dataset.key == btn.dataset.key;
  135. });
  136. // const currImg = [...imgs.children].find(img => img.dataset.key == btn.dataset.key);
  137. // console.log(currImg);
  138. // 4. 将当前图片处于激活状态(显示出来)
  139. currImg.classList.add("active");
  140. }
  141. // * 5. 定时播放
  142. function timePlay(btnArr, btnKeys) {
  143. // 1. 头部取一个
  144. let key = btnKeys.shift();
  145. // 2. 根据索引找到对应的按钮,再给它自动派发一个点击事件
  146. btnArr[key].dispatchEvent(new Event("click"));
  147. // 3. 把刚才到出的按钮再从尾部进入,实现首尾相连
  148. btnKeys.push(key);
  149. }
  150. export { createImgs, createBtns, switchImg, timePlay };
  151. </script>
  152. </body>
  153. </html>
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议