博客列表 >【JS作业0228】选项卡、懒加载、轮播图实战

【JS作业0228】选项卡、懒加载、轮播图实战

暴风战斧
暴风战斧原创
2020年04月14日 23:09:29670浏览

编程思路

1、选项卡:主要搞清楚1.点击事件改变样式,2.根据index显示详情,3.未激活详情先隐藏display:none;
2、轮播图:与选项卡类似,增加点击翻页,定时器,逻辑有点多,一步步来
3、懒加载:理解offsetTop <= clientHeight + scrollTop即图片进去可视区,据此改变图片的src值

作业总结

这次作业把JS基本的DOM操作算是过了一遍了,最深刻的就是addEventLisenter()。轮播图是这里面逻辑最复杂的一个,要做三个功能,先做的选项卡,搞半天没反应(常态了哈哈),最后发现未激活详情先隐藏display:none;突然就理解了,核心就是事件发生后改变样式这一点就好做了。后面做轮播图因为类似,逻辑也可以借鉴,其实顺利多了,懒加载就更简单了,理解offsetTop <= clientHeight + scrollTop就可以做出来了!
这次其实是在做自己的网站了,选项卡开始做的想哭啊,总算做成了。基础的还是要会,以后用jQuery就更爽了!

代码效果

1. 选项卡
  • 部分代码
  1. <!-- 选项卡控制脚本-->
  2. <script>
  3. // 1.获取标签导航
  4. var tabNav = document.querySelector('.tab-nav');
  5. // console.log(tabNav);
  6. var navArr = Array.from(tabNav.firstElementChild.children);
  7. // console.log(navArr);
  8. var details = document.querySelectorAll('.detail');
  9. // console.log(details);
  10. // 2.委托父级事件对象
  11. tabNav.addEventListener('click', showDetail, false);
  12. // 3.监听点击事件
  13. function showDetail(ev) {
  14. // console.log(ev.target.nodeName);
  15. // 判断点击的是否是导航标签
  16. if (ev.target.nodeName === "LI") {
  17. navArr.forEach(function (nav) {
  18. nav.classList.remove('tabon')
  19. });
  20. ev.target.classList.add('tabon');
  21. // 4.匹配对应标签详情
  22. // 4.1.清空激活的详情样式,根据data-index属性对应标签,设置当前内容
  23. details.forEach(function (detail) {
  24. detail.classList.remove('xqon')
  25. });
  26. // 4.2.判断标签与详情data-index相等,显示详情
  27. details.forEach(function (detail) {
  28. if (detail.dataset.index === ev.target.dataset.index) {
  29. detail.classList.add('xqon');
  30. }
  31. });
  32. }
  33. }
  34. </script>
  • 效果展示


2. 轮播图
  • 部分代码
  1. <script>
  2. // 获取到所有的图片
  3. var imgs = document.querySelectorAll('img');
  4. console.log(imgs);
  5. // 获取小圆点的父节点
  6. var pointList = document.querySelector('.point-list');
  7. // 动态生成小圆点
  8. imgs.forEach(function (img, index) {
  9. var span = document.createElement('span');
  10. // 默认显示第一张图片,所以第一个小圆点应该激活
  11. if (index === 0) {
  12. span.classList.add('point', 'dianOn');
  13. }
  14. span.classList.add('point');
  15. // 将小圆点与当前的图片进行关联
  16. span.dataset.index = img.dataset.index;
  17. // 将小圆点添加到页面中
  18. pointList.appendChild(span);
  19. });
  20. // 为小圆点添加点击事件,让图片动起来
  21. // 获取所有的小圆点
  22. var points = document.querySelectorAll('.point');
  23. // 为每个小圆点添加点击事件
  24. points.forEach(function (point) {
  25. point.addEventListener('click', function (ev) {
  26. imgs.forEach(function (img) {
  27. if (img.dataset.index === ev.target.dataset.index) {
  28. imgs.forEach(function (img) {
  29. img.classList.remove('picOn');
  30. });
  31. img.classList.add('picOn');
  32. // 设置小圆点的当前激活状态,与图片同步显示
  33. setPointActive(img.dataset.index);
  34. }
  35. })
  36. }, false);
  37. });
  38. // 设置小圆点高亮
  39. function setPointActive(imgIndex) {
  40. // 清除之前的小圆点的激活
  41. points.forEach(function (point) {
  42. point.classList.remove('dianOn');
  43. });
  44. points.forEach(function (point) {
  45. if (point.dataset.index === imgIndex) point.classList.add('dianOn');
  46. });
  47. }
  48. // 翻页功能
  49. var skip = document.querySelectorAll('.skip');
  50. skip.item(0).addEventListener('click', skipImg, false);
  51. skip.item(1).addEventListener('click', skipImg, false);
  52. // 翻页显示图片的函数
  53. function skipImg(ev) {
  54. // 获取当前正在显示的图片
  55. var currentImg = null;
  56. imgs.forEach(function (img) {
  57. // 当前图片是否有'active'
  58. if (img.classList.contains('picOn')) {
  59. currentImg = img;
  60. }
  61. });
  62. // 1.判断点击的是显示前一张的按钮,显示前一张图片
  63. if (ev.target.classList.contains('prev')) {
  64. // 去掉当前图片的激活状态
  65. currentImg.classList.remove('picOn');
  66. // 获取前一张图片
  67. currentImg = currentImg.previousElementSibling;
  68. // 如果存在前一张
  69. if (currentImg !== null && currentImg.nodeName === 'IMG') {
  70. currentImg.classList.add('picOn');
  71. } else {
  72. // 如果不存在前一张
  73. currentImg = imgs[imgs.length - 1];
  74. currentImg.classList.add('picOn');
  75. }
  76. }
  77. // 2.判断点击的是显示后一张的按钮,显示后一张图片
  78. if (ev.target.classList.contains('next')) {
  79. // 去掉当前图片的激活状态
  80. currentImg.classList.remove('picOn');
  81. // 获取后一张图片
  82. currentImg = currentImg.nextElementSibling;
  83. // 如果存在后一张
  84. if (currentImg !== null && currentImg.nodeName === 'IMG') {
  85. currentImg.classList.add('picOn');
  86. } else {
  87. // 如果不存在后一张
  88. currentImg = imgs[0];
  89. currentImg.classList.add('picOn');
  90. }
  91. }
  92. // 设置小圆点的高亮
  93. setPointActive(currentImg.dataset.index);
  94. }
  95. // 定时器自动播放
  96. var picEr = document.querySelector('.picSilde');
  97. var timer = null;
  98. // 创建鼠标移入事件的监听器
  99. picEr.addEventListener('mouseover', function () {
  100. clearInterval(timer);
  101. }, false);
  102. // 移出时自动播放轮播图
  103. picEr.addEventListener('mouseout', function () {
  104. // 创建一个时间模拟器
  105. var clickEvent = new Event('click');
  106. timer = setInterval(function () {
  107. skip.item(1).dispatchEvent(clickEvent);
  108. }, 3000);
  109. })
  110. </script>
  • 效果展示


3. 懒加载
  • 部分代码
  1. <script>
  2. // 1.获取所有图片
  3. var imgs = document.querySelectorAll('img');
  4. // 2.获取可视区高度
  5. var userHeight = document.documentElement.clientHeight;
  6. console.log(userHeight);
  7. // 3.监听窗口滚动事件
  8. window.addEventListener('scroll', function() {
  9. // 3.1 滚动的距离
  10. var scrollTop = document.documentElement.scrollTop;
  11. console.log(scrollTop);
  12. // 3.2 遍历所有图片,判断图片是否进入可视区,图片相对高度小于可视区+滚动距离即进入了可视区
  13. imgs.forEach(function(img) {
  14. if (img.offsetTop <= (userHeight + scrollTop)) {
  15. img.src = img.dataset.src;
  16. }
  17. });
  18. }, false);
  19. </script>
  • 效果展示



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