Blogger Information
Blog 32
fans 2
comment 2
visits 23244
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
【JS作业0228】选项卡、懒加载、轮播图实战
暴风战斧
Original
669 people have browsed it

编程思路

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>
  • 效果展示



Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:这是2个月前的作业了, 以现在为准吧
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