Blogger Information
Blog 29
fans 0
comment 0
visits 19773
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
轮播图、懒加载
手机用户1576673622
Original
741 people have browsed it

轮播图

  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>
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:懒加载是一个实用且常用的功能 , 目前已经有实现它的js对象了, 不必再这么麻烦, 有空可关注一下
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post