博客列表 >PHP大牛成长之路:原生javascript实现轮播图

PHP大牛成长之路:原生javascript实现轮播图

周Sir-BLOG
周Sir-BLOG原创
2020年08月18日 01:23:43740浏览

原生javascript实现轮播图

功能描述:轮播图页面加载自动播放,鼠标移入时自动停止播放并等用户操作 ,鼠标移出时, 2秒后自动播放。

  • 文件结构如下图:

  • slider.html(轮播图演示页面)

  1. <!DOCTYPE html>
  2. <html lang="en">
  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="static/css/slider.css" />
  8. </head>
  9. <body>
  10. <div class="box">
  11. <!-- 轮播图 -->
  12. <img src="static/images/banner1.jpg" alt=""data-index="1" class="slider active" />
  13. <img src="static/images/banner2.jpg" alt="" data-index="2" class="slider" />
  14. <img src="static/images/banner3.jpg" alt="" data-index="3" class="slider" />
  15. <img src="static/images/banner4.jpg" alt="" data-index="4" class="slider" />
  16. <!-- 小圆点(js动态创建) -->
  17. <div class="point-list"></div>
  18. <!-- 上一张/下一张按钮 -->
  19. <span class="skip prev">&lt;</span>
  20. <span class="skip next">&gt;</span>
  21. </div>
  22. <script src="static/js/slider.js"></script>
  23. </body>
  24. </html>
  • slider.css(轮播图样式表文件)
  1. ul,
  2. li {
  3. margin: 0;
  4. padding: 0;
  5. list-style: none;
  6. }
  7. .box {
  8. /*定位父级*/
  9. position: relative;
  10. width: 1000px;
  11. height: 350px;
  12. margin: 0 auto;
  13. }
  14. .box .slider {
  15. width: 1000px;
  16. height: 350px;
  17. display: none;
  18. }
  19. .box .slider.active {
  20. display: block;
  21. }
  22. .box .point-list {
  23. position: absolute;
  24. /*绝对定位的环境下的水平居中方式*/
  25. left: 50%;
  26. margin-left: -38px;
  27. top: 310px;
  28. }
  29. .box .point-list .point {
  30. display: inline-block;
  31. width: 12px;
  32. height: 12px;
  33. margin: 0 5px;
  34. background-color: white;
  35. border-radius: 100%;
  36. }
  37. .box .point-list .point.active {
  38. background-color: black;
  39. }
  40. .box .point-list .point:hover {
  41. cursor: pointer;
  42. }
  43. .skip {
  44. position: absolute;
  45. top: 140px;
  46. display: inline-block;
  47. width: 40px;
  48. height: 80px;
  49. text-align: center;
  50. line-height: 80px;
  51. background-color: lightgray;
  52. color: white;
  53. opacity: 0.2;
  54. font-size: 36px;
  55. }
  56. .box .prev {
  57. left: 0;
  58. }
  59. .box .next {
  60. right: 0;
  61. }
  62. .box .skip:hover {
  63. cursor: pointer;
  64. opacity: 0.5;
  65. color: black;
  66. }
  • slider.js(轮播图JS文件-主要)
  1. // 获取轮播图片
  2. var imgs = document.querySelectorAll("img");
  3. // 获取小圆点组
  4. var pointList = document.querySelector(".point-list");
  5. // 动态生成小圆点
  6. imgs.forEach(function (img, index) {
  7. var span = document.createElement("span");
  8. if (index == 0) span.classList.add("point", "active");
  9. span.classList.add("point");
  10. // 给当前的小圆点添加自定义的data-index
  11. span.dataset.index = img.dataset.index;
  12. pointList.appendChild(span);
  13. });
  14. // 获取到所有的小圆点
  15. var points = document.querySelectorAll(".point");
  16. // 给小圆点添加点击事件(代理)
  17. pointList.addEventListener("click", function (ev) {
  18. imgs.forEach(function (img) {
  19. if (img.dataset.index === ev.target.dataset.index) {
  20. imgs.forEach(function (img) {
  21. img.classList.remove("active");
  22. });
  23. img.classList.add("active");
  24. // 设置与当前图片对应的小圆点高亮显示(调用公共函数)
  25. setPointActive(img.dataset.index);
  26. }
  27. });
  28. });
  29. // 设置与当前图片对应的小圆点高亮显示;
  30. function setPointActive(imgIndex) {
  31. // 遍历所有小圆点并取消高亮
  32. points.forEach(function (point) {
  33. point.classList.remove("active");
  34. });
  35. // 遍历所有小圆点,当小圆点的dataset值与图片一致时,设置为高亮
  36. points.forEach(function (point) {
  37. if (point.dataset.index === imgIndex) point.classList.add("active");
  38. });
  39. }
  40. // ----------------- 翻页功能 -----------------
  41. // 获取翻页按钮
  42. var skip = document.querySelectorAll(".skip");
  43. // 添加事件
  44. skip.item(0).addEventListener("click", prevImg, false);
  45. skip.item(1).addEventListener("click", nextImg, false);
  46. function prevImg(ev) {
  47. // 1. 获取当前的图片
  48. var currentImg = null;
  49. imgs.forEach(function (img) {
  50. if (img.classList.contains("active")) {
  51. currentImg = img;
  52. }
  53. });
  54. // 2. 判断是否是点击了显示前一张的按钮?
  55. if (ev.target.classList.contains("prev")) {
  56. // 为了显示出来前一张,必须将当前图片的激活去掉
  57. currentImg.classList.remove("active");
  58. // 将当前图片的前一张图片设置为当前图片
  59. currentImg = currentImg.previousElementSibling;
  60. // console.log(currentImg);
  61. // 如果存在前一张,再显示它,否则进入循环,显示最后一张
  62. if (currentImg !== null && currentImg.nodeName === "IMG") {
  63. currentImg.classList.add("active");
  64. } else {
  65. currentImg = imgs[imgs.length - 1];
  66. currentImg.classList.add("active");
  67. }
  68. }
  69. // 小圆点高亮
  70. setPointActive(currentImg.dataset.index);
  71. }
  72. function nextImg(ev) {
  73. // 1. 获取当前的图片
  74. var currentImg = null;
  75. imgs.forEach(function (img) {
  76. if (img.classList.contains("active")) {
  77. currentImg = img;
  78. }
  79. });
  80. // 3. 判断是否是点击了显示下一张的按钮?
  81. if (ev.target.classList.contains("next")) {
  82. // 为了显示出来前一张,必须将当前图片的激活去掉
  83. currentImg.classList.remove("active");
  84. // 将当前图片的前一张图片设置为当前图片
  85. currentImg = currentImg.nextElementSibling;
  86. // console.log(currentImg);
  87. // 如果存在下一张,再显示它,否则进入循环,显示第一张
  88. if (currentImg !== null && currentImg.nodeName === "IMG") {
  89. currentImg.classList.add("active");
  90. } else {
  91. currentImg = imgs[0];
  92. currentImg.classList.add("active");
  93. }
  94. }
  95. // 小圆点高亮
  96. setPointActive(currentImg.dataset.index);
  97. }
  98. var div = document.querySelector(".box");
  99. var playImg;
  100. // 页面加载时自动播放
  101. window.onload=start();
  102. // 鼠标移出时: 播放
  103. div.addEventListener("mouseout", start);
  104. // 鼠标移入时: 停止
  105. div.addEventListener("mouseover", function () {
  106. clearInterval(playImg);
  107. });
  108. function start() {
  109. playImg = setInterval(function () {
  110. // Event 对象代表事件的状态
  111. var event = new Event("click");
  112. // 派发点击事件
  113. skip.item(1).dispatchEvent(event);
  114. }, 2000);
  115. }

总结

  • 本来很简单的案例,根据老师8月14日的事件例子控制自动播放就行了,因为定时器的停止功能折腾半天,最后把定时器变量定在全局才实现,想想自己都觉得笨,生气中….
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议