博客列表 >轮播图、懒加载

轮播图、懒加载

手机用户1576673622
手机用户1576673622原创
2021年04月15日 17:19:45740浏览

轮播图

  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. // 所有图片
  35. const imgs = document.querySelectorAll(".container > .imgs img");
  36. // 按钮组
  37. const btnGroup = document.querySelector(".container > .btns");
  38. // 翻页按钮
  39. const skip = document.querySelector(".container > .skip");
  40. // const skip = document.querySelectorAll(".container > .skip > *");
  41. // 创建出一组与图片数量对应的小按钮
  42. function autoCreateBtns(ele, imgLength) {
  43. const frag = document.createDocumentFragment();
  44. for (let i = 0; i < imgLength; i++) {
  45. const a = document.createElement("a");
  46. a.href = "#";
  47. a.dataset.index = i + 1;
  48. if (i === 0) a.classList.add("active");
  49. frag.appendChild(a);
  50. }
  51. ele.appendChild(frag);
  52. }
  53. // 调用创建小按钮的函数
  54. autoCreateBtns(btnGroup, imgs.length);
  55. // 为刚刚生成的小按钮们添加点击事件
  56. const btns = document.querySelectorAll(".container > .btns > *");
  57. // 下面声明二个公共函数
  58. // 1. 获取激活的元素
  59. function getActiveEle(eles) {
  60. let activities = [...eles].filter(img => img.classList.contains("active"));
  61. return activities.shift();
  62. }
  63. // 2. 设置激活的元素,根据按钮索引更新正在显示的图片
  64. function setActiveEle(btnIndex) {
  65. [imgs, btns].forEach(arr => {
  66. // 将之前的状态全部重置到初始化(清空)
  67. getActiveEle(arr).classList.remove("active");
  68. arr.forEach(item => {
  69. if (item.dataset.index === btnIndex) {
  70. item.classList.add("active");
  71. }
  72. });
  73. });
  74. }
  75. // 为每一个小按钮添加事件
  76. btns.forEach(btn => btn.addEventListener("click", ev => setActiveEle(ev.target.dataset.index)));
  77. // 借鉴来的
  78. skip.addEventListener("click", skipImg, false);
  79. console.log(skip.children[1]);
  80. // 将前后翻页,使用一个回调统一处理
  81. function skipImg(ev) {
  82. // 当前激活的图片,实际上这里用不到它,而应该用它的父级<a>来判断是否存在兄弟节点
  83. let currentImg = getActiveEle(imgs);
  84. // 当前图片组父元素,注意<img>父级是<a>,<a>的父级才是需要的父节点
  85. let parentEle = currentImg.parentElement.parentElement;
  86. // 当前元素的前一个兄弟节点:previousElementSibling;
  87. let prevEle = currentImg.parentElement.previousElementSibling;
  88. // console.log(prevEle);
  89. // 当前元素的下一个兄弟节点:nextElementSibling;
  90. let nextEle = currentImg.parentElement.nextElementSibling;
  91. // console.log(nextEle);
  92. // 第一张图片, firstElementChild第一个子元素
  93. let firstImg = parentEle.firstElementChild.firstElementChild;
  94. // 最后一张图片, firstElementChild, 最后一个子元素
  95. let lastImg = parentEle.lastElementChild.firstElementChild;
  96. // console.log(lastImg);
  97. let activeImg = currentImg;
  98. // console.log(activeImg);
  99. // 向前翻页
  100. if (ev.target.classList.contains("prev")) {
  101. // console.log(ev.target.classList.contains("prev"));
  102. // 如果存在前一张图片,就使用它,否则就使用最后一张图片来更新它,形成循环显示的效果
  103. let activeImg = prevEle !== null ? prevEle.firstElementChild : lastImg;
  104. // 使用激活元素来同步更新图片与按钮
  105. // console.log(activeImg.dataset.index);
  106. setActiveEle(activeImg.dataset.index);
  107. }
  108. // 向后翻页
  109. if (ev.target.classList.contains("next")) {
  110. // 如果不存在下一张图片,就用第一张图片更新它
  111. let activeImg = nextEle !== null ? nextEle.firstElementChild : firstImg;
  112. setActiveEle(activeImg.dataset.index);
  113. }
  114. }
  115. // 让图片每隔2秒进行自动播放(使用定时器,事件自动派发)
  116. // 单独写一个事件监听器,为后面的事件自动派发做准备
  117. skip.children[1].addEventListener("load", skipImg, false);
  118. let timer = null;
  119. const slider = document.querySelector(".container");
  120. slider.addEventListener("mouseout", startTimer, false);
  121. window.addEventListener("load", startTimer);
  122. slider.addEventListener("mouseover", clearTimer, false);
  123. // 启动定时器
  124. function startTimer() {
  125. // 创建自定义事件对象
  126. const clickEvent = new Event("load");
  127. timer = setInterval(() => skip.children[1].dispatchEvent(clickEvent), 2000);
  128. }
  129. // 清除定时器
  130. function clearTimer() {
  131. clearInterval(timer);
  132. }
  133. </script>
  134. </body>
  135. </html>

懒加载

  1. <script>
  2. // querySelectorAll自带forEach借口,可以直接便利
  3. const imgs = document.querySelectorAll(".container img");
  4. // clientHeight:视口高度 scrollTop:滚动高度
  5. const clientHeight = document.documentElement.clientHeight;
  6. // 实现懒加载
  7. window.addEventListener("scroll", layzyload);
  8. // load:页面加载完成自动执行
  9. window.addEventListener("load", layzyload);
  10. function layzyload() {
  11. // 得到滚动高度
  12. let scrollTop = document.documentElement.scrollTop;
  13. // 遍历图片并判断是否进入到了可视区
  14. imgs.forEach(img => {
  15. // 只要当前图片距离文档顶部的偏移量,小于可视区高度与滚动高度之间则表示进入到可视区,应该显示出来
  16. // clientHeight是可视区高度,这是一个固定的值,滚动高度是动态的
  17. if (img.offsetTop < clientHeight + scrollTop) {
  18. setTimeout(() => (img.src = img.dataset.src), 500);
  19. }
  20. });
  21. }
  22. </script>
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议