博客列表 >轮播图的制作

轮播图的制作

手机用户1580651468
手机用户1580651468原创
2022年11月14日 18:33:41717浏览

轮播图的制作

一、轮播图的html代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  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. const imgs = document.querySelector(`.imgs`);
  19. const btns = document.querySelector(`.btns`);
  20. // 2.导入轮播图模块
  21. // (1)创建图片组:createImgs()
  22. // (2)创建按钮组:createBtns()
  23. // (3)创建按钮事件:switchImg()
  24. // (4)定时器:
  25. import {
  26. createImgs,
  27. createBtns,
  28. switchImg,
  29. timePlay,
  30. } from "./static/js/slideshow.js";
  31. // 3.加载成功将图片以及按钮渲染出来
  32. window.onload = () => {
  33. // 1.创建图片组
  34. createImgs(imgs);
  35. // 2.创建按钮组
  36. createBtns(imgs, btns);
  37. // 3.添加事件
  38. [...btns.children].forEach(function (btn) {
  39. btn.onclick = function () {
  40. switchImg(this, imgs);
  41. };
  42. });
  43. // (4)定时器timePlay()
  44. // 按钮数组,三个span
  45. const btnArr = [...btns.children];
  46. // 按钮索引数组
  47. const btnKeys = Object.keys(btns.children);
  48. setInterval(
  49. function (btnArr, btnKeys) {
  50. timePlay(btnArr, btnKeys);
  51. },
  52. 2000,
  53. btnArr,
  54. btnKeys
  55. );
  56. };
  57. </script>
  58. </body>
  59. </html>

二、轮播图的js代码

  1. // todo 轮播图模块
  2. // * 1. 图片组
  3. const imgArr = [
  4. {
  5. key: 1,
  6. src: "static/images/item1.jpeg",
  7. url: "https://php.cn",
  8. },
  9. {
  10. key: 2,
  11. src: "static/images/item2.jpeg",
  12. url: "https://php.cn",
  13. },
  14. {
  15. key: 3,
  16. src: "static/images/item3.jpeg",
  17. url: "https://php.cn",
  18. },
  19. ];
  20. // * 2. 创建图片组
  21. function createImgs(imgs) {
  22. // 图片资源比较大,所以建议用文档片断来做
  23. const frag = new DocumentFragment();
  24. for (let i = 0; i < imgArr.length; i++) {
  25. // 1. 创建图片元素
  26. // const img = document.createElement('img')
  27. const img = new Image();
  28. // 2. 添加属性
  29. // src
  30. img.src = imgArr[i].src;
  31. // data-key
  32. img.dataset.key = imgArr[i].key;
  33. // class='active': 第一张
  34. if (i === 0) img.classList.add("active");
  35. // 3. 添加事件
  36. img.onclick = () => (location.href = imgArr[i].url);
  37. // 添加图片分二步: 第一步加到内存中的文档片断元素上, 第二步再加到图片容器上
  38. // 4. 添加图片到片断中
  39. frag.append(img);
  40. }
  41. // 5. 将片断添加到图片容器元素中
  42. imgs.append(frag);
  43. }
  44. // * 3. 创建按钮组
  45. function createBtns(imgs, btns) {
  46. // 计算出所有图片的数量,根据这个来创建相同数量的按钮
  47. // console.log(imgs.childElementCount);
  48. let length = imgs.childElementCount;
  49. for (let i = 0; i < length; i++) {
  50. // 1. 生成按钮: <span>
  51. const btn = document.createElement("span");
  52. // 2. 按钮索引: data-key, 必须与图片索引一致
  53. btn.dataset.key = imgs.children[i].dataset.key;
  54. // 3. 第1个按钮处于激活状态
  55. if (i === 0) btn.classList.add("active");
  56. // 4. 添加到容器中
  57. btns.append(btn);
  58. }
  59. }
  60. // * 4. 按钮点击事件
  61. function switchImg(btn, imgs) {
  62. // 1. 去掉图片和按钮的激活状态
  63. [...btn.parentNode.children].forEach((btn) => btn.classList.remove("active"));
  64. [...imgs.children].forEach((img) => img.classList.remove("active"));
  65. // 2. 将当前的按钮处于激活状态
  66. btn.classList.add("active");
  67. // 3. 根据按钮索引,找到对应的图片
  68. const currImg = [...imgs.children].find(function (img) {
  69. return img.dataset.key == btn.dataset.key;
  70. });
  71. // const currImg = [...imgs.children].find(img => img.dataset.key == btn.dataset.key);
  72. // console.log(currImg);
  73. // 4. 将当前图片处于激活状态(显示出来)
  74. currImg.classList.add("active");
  75. }
  76. // * 5. 定时播放
  77. function timePlay(btnArr, btnKeys) {
  78. // 1. 头部取一个
  79. let key = btnKeys.shift();
  80. // 2. 根据索引找到对应的按钮,再给它自动派发一个点击事件
  81. btnArr[key].dispatchEvent(new Event("click"));
  82. // 3. 把刚才取出的按钮再从尾部进入,实现首尾相连
  83. btnKeys.push(key);
  84. }
  85. export { createImgs, createBtns, switchImg, timePlay };

三、轮播图的css代码

  1. body {
  2. background-color: #eee;
  3. }
  4. /* 轮播图容器 */
  5. .slideshow {
  6. width: 240px;
  7. height: 360px;
  8. }
  9. /* 图片容器 */
  10. .slideshow .imgs {
  11. width: inherit;
  12. height: inherit;
  13. }
  14. /* 图片适应 */
  15. .slideshow img {
  16. width: 100%;
  17. height: 100%;
  18. border-radius: 10px;
  19. /* 默认全隐藏 */
  20. display: none;
  21. }
  22. /* 设置图片的激活状态 */
  23. .slideshow img.active {
  24. display: block;
  25. }
  26. .slideshow img:hover {
  27. cursor: pointer;
  28. }
  29. /* ------ 按钮容器 ------- */
  30. /* 按钮容器 */
  31. .slideshow .btns {
  32. display: flex;
  33. place-content: center;
  34. /* position: relative;
  35. top: -40px; */
  36. transform: translateY(-40px);
  37. }
  38. .slideshow .btns > span {
  39. background-color: rgba(233, 233, 233, 0.5);
  40. height: 16px;
  41. width: 16px;
  42. border-radius: 50%;
  43. margin: 5px;
  44. }
  45. .slideshow .btns > span.active {
  46. background-color: orangered;
  47. }
  48. .slideshow .btns > span:hover {
  49. cursor: pointer;
  50. }

三、轮播图的实现效果

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