博主信息
JiaJieChen
博文
65
粉丝
3
评论
5
访问量
46499
积分:0
P豆:132

JavaScript:1.图片懒加载演示;2.轮播图为翻页按钮添加功能;

2021年04月13日 18:16:54阅读数:4893博客 / JiaJieChen/ HTML+CSS+JavaScript+jQuery+Vue

JavaScript:1.懒加载演示;2.轮播图为翻页按钮添加功能;

一.图片懒加载演示

关于高度 代码
视口高度 clientHeight
滚动高度 scrollTop
距离父级高度 offsetTop

  1. <script>
  2. //首先拿到所有的图片
  3. const img = document.querySelectorAll(".box img");
  4. //然后拿到视口高度
  5. const clientHeight = document.documentElement.clientHeight;
  6. //创建懒加载函数回调
  7. function layzyload() {
  8. //创建滚动距离变量
  9. let scrollTop = document.documentElement.scrollTop;
  10. //用forEach遍历img
  11. img.forEach((img) => {
  12. //用if语句来判断这张图片的顶部距离它的父级的高度,是否小于视口高度与滚动距离之和
  13. //offsetTop 图片距离父级的高度
  14. if (img.offsetTop < clientHeight + scrollTop) {
  15. //延迟函数 setTimeout
  16. setTimeout(() => {
  17. //延迟0.5秒替换显示图片的路径
  18. img.src = img.dataset.src;
  19. }, 500);
  20. }
  21. });
  22. }
  23. //创建监听滚动事件
  24. // scroll: 滚动事件,
  25. window.addEventListener("scroll", layzyload);
  26. //load:当页面加载完成后立即显示第一屏
  27. window.addEventListener("load", layzyload);
  28. </script>

二.轮播图为翻页按钮添加功能

代码块

  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. <style>
  9. @import url(lbt.css);
  10. </style>
  11. </head>
  12. <body>
  13. <div class="box">
  14. <!-- 图片组 -->
  15. <div class="imgs">
  16. <a href=""
  17. ><img src="banner/banner1.jpg" alt="" data-index="1" class="active"
  18. /></a>
  19. <a href=""><img src="banner/banner2.jpg" alt="" data-index="2" /></a>
  20. <a href=""><img src="banner/banner3.jpg" alt="" data-index="3" /></a>
  21. <a href=""><img src="banner/banner4.jpg" alt="" data-index="4" /></a>
  22. </div>
  23. <!-- 图片下方小按钮 -->
  24. <div class="btns"></div>
  25. <!-- 翻页按钮 -->
  26. <div class="skip active">
  27. <a href="" class="prev">&lt;</a>
  28. <a href="" class="next">&gt;</a>
  29. </div>
  30. <script>
  31. //拿到所有图片
  32. const imgs = document.querySelectorAll(".box > .imgs img");
  33. //拿到小按钮组
  34. const btns = document.querySelector(".box > .btns");
  35. //动态化创建小按钮组,轮播图片有多少张就有多少个按钮
  36. function zdButton(ele, imgLength) {
  37. //优化编程:按钮创造之后放到中介里面去,然后全部完成后放到页面中
  38. //createDocumentFragment 方法 建立复用文档片段
  39. const frag = document.createDocumentFragment();
  40. for (let i = 0; i < imgLength; i++) {
  41. //创建a链接
  42. const a = document.createElement("a");
  43. //设置a链接地址为空
  44. a.href = "#";
  45. //设置a链接自定义属性与图片自定义属性相符
  46. a.dataset.index = i + 1;
  47. //判断a链接激活样式
  48. if (i === 0) a.classList.add("active");
  49. // 将a链接传入frag复用文档片段中
  50. frag.append(a);
  51. }
  52. //将复用文档片段传入ele行参中
  53. ele.append(frag);
  54. }
  55. //调用函数传入按钮位置实参
  56. zdButton(btns, imgs.length);
  57. //为刚刚生成的小按钮添加点击事件
  58. //获取到全部的小按钮赋值给常量btnsj
  59. const btnsj = document.querySelectorAll(".box > .btns > *");
  60. //建立两个公共函数
  61. //获取激活的元素
  62. function getActiveEle(eles) {
  63. //contains 该方法是判断字符串中是否有子字符串,如果有为true,如果没有为false
  64. let activeEles = [...eles].filter((ele) =>
  65. ele.classList.contains("active")
  66. );
  67. //返回这个元素给函数
  68. return activeEles[0];
  69. }
  70. // 设置激活的元素,根据按钮索引更新正在显示的图片
  71. // 参数就是当前正在点击的按钮的索引
  72. function setActiveEle(btnIndex) {
  73. // 先将之前的激活的样式去掉
  74. [imgs, btnsj].forEach((arr) => {
  75. getActiveEle(arr).classList.remove("active");
  76. // 再根据当前的的自定义索引来重新设置应该激活的按钮和图片
  77. // 判断当前行参和实参索引是否相等如果相等重新传入active
  78. arr.forEach((item) => {
  79. if (item.dataset.index === btnIndex) {
  80. item.classList.add("active");
  81. }
  82. });
  83. });
  84. }
  85. // 为按钮添加事件监听器
  86. btnsj.forEach((btn) =>
  87. btn.addEventListener("click", (ev) =>
  88. setActiveEle(ev.target.dataset.index)
  89. )
  90. );
  91. // 当前图片索引: 公共函数 getActiveEle()
  92. let currentImgIndex = getActiveEle(imgs).dataset.index;
  93. //轮播图翻页按钮功能设置
  94. //拿到左右的翻页按钮
  95. const skipleft = document.querySelector(".box > .skip >.prev");
  96. const skipright = document.querySelector(".box > .skip >.next");
  97. //拿到翻页按钮
  98. const skip = document.querySelector(".box > .skip");
  99. //首先去除左右两边翻页按钮的默认样式:preventDefault 禁用默认样式
  100. skip.onclick = (ev) => {
  101. ev.preventDefault();
  102. };
  103. //设置右边按钮点击一下data-index值就+1
  104. let i = 1;
  105. skipright.onclick = (ev) => {
  106. if (i <= imgs.length) {
  107. // console.log("1" + skipright.target);
  108. skipright.dataset.index = i++;
  109. } else {
  110. i = 1;
  111. }
  112. [...skipright.children].forEach((item) =>
  113. item.classList.remove("active")
  114. );
  115. ev.target.classList.add("active");
  116. imgs.forEach((item) => item.classList.remove("active"));
  117. [...imgs]
  118. .filter((item) => item.dataset.index === ev.target.dataset.index)
  119. .pop()
  120. .classList.add("active");
  121. };
  122. //设置左边边按钮点击一下data-index值就-1
  123. let b = 4;
  124. skipleft.onclick = (ev) => {
  125. if (b <= imgs.length && b > 0) {
  126. // console.log("1" + skipright.target);
  127. skipleft.dataset.index = b--;
  128. } else {
  129. b = 4;
  130. }
  131. [...skipleft.children].forEach((item) =>
  132. item.classList.remove("active")
  133. );
  134. ev.target.classList.add("active");
  135. imgs.forEach((item) => item.classList.remove("active"));
  136. [...imgs]
  137. .filter((item) => item.dataset.index === ev.target.dataset.index)
  138. .pop()
  139. .classList.add("active");
  140. };
  141. // 定时器
  142. let timer = null;
  143. // 创建自定义事件对象: 点击类型
  144. let clickEvent = new Event("click");
  145. // 为轮播图容器绑定鼠标事件
  146. const container = document.querySelector(".box");
  147. // 鼠标移入时,停止自动播放
  148. container.addEventListener("mouseover", stopPlay, false);
  149. // 鼠标移出时,自动播放
  150. container.addEventListener("mouseout", autoPlay, false);
  151. // 自动播放
  152. function autoPlay(ev) {
  153. // 创建一个每隔1秒自动触发的"间歇式定时器"
  154. timer = setInterval(() => {
  155. // 将自定义点击事件任意派发给"前进或后退"中的一个按钮即可,本例自动点击前进按钮
  156. skip.querySelector(".next").dispatchEvent(clickEvent, skipright);
  157. }, 1000);
  158. }
  159. // 页面加载完成开始播放
  160. window.onload = () => {
  161. autoPlay(1000);
  162. };
  163. // 自动停止播放
  164. function stopPlay(ev) {
  165. // 清除间隙定时器,结束自动播放
  166. clearInterval(timer);
  167. }
  168. </script>
  169. </div>
  170. </body>
  171. </html>
批改老师:天蓬老师天蓬老师

批改状态:合格

老师批语:写得非常棒

版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论