博客列表 >选项卡,图片懒加载,轮播图自动播放功能-js-41课8.17

选项卡,图片懒加载,轮播图自动播放功能-js-41课8.17

希望
希望原创
2020年08月21日 09:47:061221浏览

一、选项卡

1.建demo1.html,并引入tabs.css和tabs.js

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>经典选项卡制作</title>
  7. <style>
  8. @import url(static/css/tabs.css);
  9. </style>
  10. </head>
  11. <body>
  12. <!-- 导航区 -->
  13. <div class="tabs">
  14. <ul class="tab">
  15. <!-- 给一个激活项active -->
  16. <li class="active" data-index="1">体育</li>
  17. <li data-index="2">教育</li>
  18. <li data-index="3">科技</li>
  19. </ul>
  20. <!-- 体育详情 -->
  21. <ul class="item active" data-index="1">
  22. <li><a href="">足球</a></li>
  23. <li><a href="">篮球</a></li>
  24. <li><a href="">高尔夫</a></li>
  25. </ul>
  26. <!-- 教育详情 -->
  27. <ul class="item" data-index="2">
  28. <li><a href="">数学</a></li>
  29. <li><a href="">语文</a></li>
  30. <li><a href="">英语</a></li>
  31. </ul>
  32. <!-- 科技详情 -->
  33. <ul class="item" data-index="3">
  34. <li><a href="">5G</a></li>
  35. <li><a href="">AI</a></li>
  36. <li><a href="">Blockchain</a></li>
  37. </ul>
  38. </div>
  39. <script src="static/js/tabs.js"></script>
  40. </body>
  41. </html>

2.建static/css/tabs.css

  1. * {
  2. margin: 0;
  3. padding: 0;
  4. }
  5. a {
  6. text-decoration: none;
  7. color: rgb(10, 1, 1);
  8. }
  9. a:hover {
  10. text-decoration: underline;
  11. color: red;
  12. }
  13. li {
  14. list-style: none;
  15. }
  16. li:hover {
  17. cursor: default;
  18. }
  19. .tabs {
  20. width: 300px;
  21. height: 200px;
  22. margin: 30px;
  23. background-color: rgb(245, 240, 240);
  24. display: flex;
  25. flex-direction: column;
  26. }
  27. .tab {
  28. height: 36px;
  29. display: flex;
  30. }
  31. .tab li {
  32. flex: auto;
  33. text-align: center;
  34. line-height: 36px;
  35. background-color: rgb(228, 226, 226);
  36. }
  37. .tab li.active {
  38. background-color: rgb(248, 223, 140);
  39. }
  40. /* 默认所有选项卡只有一个显示,其它隐藏 */
  41. .item {
  42. padding: 20px;
  43. display: none;
  44. }
  45. .item.active {
  46. display: block;
  47. }

3.建static/js/tabs.js

  1. // 1. 获取导航
  2. var tab = document.querySelector(".tab");
  3. // console.log(tab);
  4. // 2. 获取详情页,共3个,拿到全部
  5. var items = document.querySelectorAll(".item");
  6. // console.log(items);
  7. // 3. 给导航添加点击事件(事件代理/事件委托/冒泡)
  8. tab.addEventListener("click", show, false);
  9. tab.addEventListener("mouseover", show, false);
  10. // 4. 声明show()函数
  11. function show(ev) {
  12. // ev: 事件对象
  13. // ev.type: 事件类型,如click,mouseover,input....
  14. // console.log(ev.type);
  15. // ev.target: 事件的触发者
  16. // console.log(ev.target);
  17. // ev.currentTarget: 事件绑定者
  18. // console.log(ev.currentTarget);
  19. // 1. 清除除当前高亮选项卡之外的选项卡的高亮样式
  20. // console.log(ev.currentTarget.children);
  21. ev.currentTarget.childNodes.forEach(function (item) {
  22. if (item.nodeType === 1) item.classList.remove("active");
  23. });
  24. // 2. 应该将用户点击的当前选项卡高亮显示
  25. ev.target.classList.add("active");
  26. // 3. 清空原有列表
  27. items.forEach(function (item) {
  28. item.classList.remove("active");
  29. });
  30. // 4. 将选项卡对应的内容进行切换(根据导航和详情中的data-index)
  31. items.forEach(function (item) {
  32. // console.log(item);
  33. // console.log(ev.target.dataset.index, item.dataset.index);
  34. if (ev.target.dataset.index === item.dataset.index) {
  35. item.classList.add("active");
  36. }
  37. });
  38. }

二、图片懒加载

1.建demo3.html,引入lazy-base.css

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>图片懒加载</title>
  7. </head>
  8. <body>
  9. <div class="container">
  10. <img src="images/temp.jpg" alt="" data-src="images/img-1.jpg" />
  11. <img src="images/temp.jpg" alt="" data-src="images/img-2.jpg" />
  12. <img src="images/temp.jpg" alt="" data-src="images/img-3.jpg" />
  13. <img src="images/temp.jpg" alt="" data-src="images/img-4.jpg" />
  14. <img src="images/temp.jpg" alt="" data-src="images/img-5.jpg" />
  15. <img src="images/temp.jpg" alt="" data-src="images/img-6.jpg" />
  16. <img src="images/temp.jpg" alt="" data-src="images/img-7.jpg" />
  17. <img src="images/temp.jpg" alt="" data-src="images/img-8.jpg" />
  18. <img src="images/temp.jpg" alt="" data-src="images/img-9.jpg" />
  19. <img src="images/temp.jpg" alt="" data-src="images/img-10.jpg" />
  20. <img src="images/temp.jpg" alt="" data-src="images/img-11.jpg" />
  21. <img src="images/temp.jpg" alt="" data-src="images/img-12.jpg" />
  22. </div>
  23. <script>
  24. // 1. 获取所有的图片
  25. var imgs = document.querySelectorAll(".container img");
  26. // 2. 获取文档的高度
  27. var clientHeight = document.documentElement.clientHeight;
  28. // 3. 监听滚动事件
  29. window.addEventListener(
  30. "scroll",
  31. function () {
  32. lazyload(imgs, clientHeight);
  33. },
  34. false
  35. );
  36. // 4. 懒加载函数
  37. function lazyload(imgs, clientHeight) {
  38. // 获取文档的滚动大小
  39. var scrollTop = document.documentElement.scrollTop;
  40. // 遍历图片,判断是否进入到可视区
  41. imgs.forEach(function (img) {
  42. if (img.offsetTop <= clientHeight + scrollTop) {
  43. img.src = img.dataset.src;
  44. }
  45. });
  46. }
  47. </script>
  48. </body>
  49. </html>

2.根目录下建img文件,放入很多图片

3.建static/css/lazy-base.css

  1. .parent {
  2. height: 400px;
  3. width: 300px;
  4. padding: 5px;
  5. background-color: rgb(166, 224, 194);
  6. border: 5px solid;
  7. overflow: scroll;
  8. position: relative;
  9. }
  10. .parent .child {
  11. height: 500px;
  12. width: 400px;
  13. padding: 5px;
  14. background-color: rgb(241, 247, 194);
  15. background-clip: content-box;
  16. border: 5px solid;
  17. position: relative;
  18. left: 10px;
  19. top: 20px;
  20. }

三、轮播图自动播放功能,鼠标移出时, 2秒后自动播放,鼠标移入时自动停止播放

1.在根目录下建banner文件夹,里面放入4张图片

2.建demo4.html,并引入banner图片,slider.css和slider.js

  1. <!DOCTYPE html>
  2. <html lang="en">
  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="static/css/slider.css" />
  8. </head>
  9. <body>
  10. <div class="box">
  11. <img
  12. src="banner/banner1.jpg"
  13. alt=""
  14. data-index="1"
  15. class="slider active"
  16. />
  17. <img src="banner/banner2.jpg" alt="" data-index="2" class="slider" />
  18. <img src="banner/banner3.jpg" alt="" data-index="3" class="slider" />
  19. <img src="banner/banner4.jpg" alt="" data-index="4" class="slider" />
  20. <div class="point-list">
  21. <!-- <span class="point active" data-index="1"></span>
  22. <span class="point" data-index="2"></span>
  23. <span class="point" data-index="3"></span> -->
  24. </div>
  25. <span class="skip prev">&lt;</span>
  26. <span class="skip next">&gt;</span>
  27. </div>
  28. <script src="static/js/slider.js"></script>
  29. </body>
  30. </html>

3.建static/css/slider.css

  1. ul,
  2. li {
  3. margin: 0;
  4. padding: 0;
  5. list-style: none;
  6. }
  7. .box {
  8. /*定位父级*/
  9. position: relative;
  10. width: 1000px;
  11. height: 350px;
  12. margin: 0 auto;
  13. }
  14. .box .slider {
  15. width: 1000px;
  16. height: 350px;
  17. display: none;
  18. }
  19. .box .slider.active {
  20. display: block;
  21. }
  22. .box .point-list {
  23. position: absolute;
  24. /*绝对定位的环境下的水平居中方式*/
  25. left: 50%;
  26. margin-left: -38px;
  27. top: 310px;
  28. }
  29. .box .point-list .point {
  30. display: inline-block;
  31. width: 12px;
  32. height: 12px;
  33. margin: 0 5px;
  34. background-color: white;
  35. border-radius: 100%;
  36. }
  37. .box .point-list .point.active {
  38. background-color: black;
  39. }
  40. .box .point-list .point:hover {
  41. cursor: pointer;
  42. }
  43. .skip {
  44. position: absolute;
  45. top: 140px;
  46. display: inline-block;
  47. width: 40px;
  48. height: 80px;
  49. text-align: center;
  50. line-height: 80px;
  51. background-color: lightgray;
  52. color: white;
  53. opacity: 0.2;
  54. font-size: 36px;
  55. }
  56. .box .prev {
  57. left: 0;
  58. }
  59. .box .next {
  60. right: 0;
  61. }
  62. .box .skip:hover {
  63. cursor: pointer;
  64. opacity: 0.5;
  65. color: black;
  66. }

4.建static/js/slider.js

  1. // 获取轮播图片
  2. var imgs = document.querySelectorAll("img");
  3. // 获取小圆点
  4. var pointList = document.querySelector(".point-list");
  5. // 动态生成小圆点
  6. imgs.forEach(function (img, index) {
  7. var span = document.createElement("span");
  8. // 第一个小点是激活状态,添加索引span
  9. if (index == 0) span.classList.add("point", "active");
  10. span.classList.add("point");
  11. // 给当前的小圆点添加自定义data-index属性
  12. span.dataset.index = img.dataset.index;
  13. pointList.appendChild(span);
  14. });
  15. // 获取所有小圆点
  16. var points = document.querySelectorAll(".point");
  17. // 给小圆点添加事件(代理)
  18. pointList.addEventListener("click", function (ev) {
  19. imgs.forEach(function (img) {
  20. if (img.dataset.index === ev.target.dataset.index) {
  21. imgs.forEach(function (img) {
  22. img.classList.remove("active");
  23. });
  24. img.classList.add("active");
  25. // 设置与当前图片对应的小圆点高亮显示
  26. // 因为这个功能要多处使用,这里将它声明为公共函数
  27. setPointActive(img.dataset.index);
  28. }
  29. });
  30. });
  31. // 设置与当前图片对应的小圆点高亮显示;
  32. function setPointActive(imgIndex) {
  33. points.forEach(function (point) {
  34. point.classList.remove("active");
  35. });
  36. points.forEach(function (point) {
  37. // 添加当前相等的
  38. if (point.dataset.index === imgIndex) point.classList.add("active");
  39. });
  40. }
  41. // 获取翻页按钮左右
  42. var skip = document.querySelectorAll(".skip");
  43. // 添加事件
  44. skip.item(0).addEventListener("click", skipImg, false);
  45. skip.item(1).addEventListener("click", skipImg, false);
  46. // 翻页显示图片的回调方法
  47. function skipImg(ev) {
  48. // 1. 获取当前的图片
  49. var currentImg = null;
  50. imgs.forEach(function (img) {
  51. if (img.classList.contains("active")) {
  52. currentImg = img;
  53. }
  54. });
  55. // console.log(currentImg);
  56. // 2. 判断是否是点击了显示前一张的按钮?
  57. if (ev.target.classList.contains("prev")) {
  58. // 为了显示出来前一张,必须将当前图片的激活去掉
  59. currentImg.classList.remove("active");
  60. // 将当前图片的前一张图片设置为当前图片
  61. currentImg = currentImg.previousElementSibling;
  62. // console.log(currentImg);
  63. // 如果存在前一张,再显示它,否则进入循环,显示最后一张
  64. if (currentImg !== null && currentImg.nodeName === "IMG") {
  65. currentImg.classList.add("active");
  66. } else {
  67. currentImg = imgs[imgs.length - 1];
  68. currentImg.classList.add("active");
  69. }
  70. }
  71. // 3. 判断是否是点击了显示下一张的按钮?
  72. if (ev.target.classList.contains("next")) {
  73. // 为了显示出来前一张,必须将当前图片的激活去掉
  74. currentImg.classList.remove("active");
  75. // 将当前图片的前一张图片设置为当前图片
  76. currentImg = currentImg.nextElementSibling;
  77. // console.log(currentImg);
  78. // 如果存在下一张,再显示它,否则进入循环,显示第一张
  79. if (currentImg !== null && currentImg.nodeName === "IMG") {
  80. currentImg.classList.add("active");
  81. } else {
  82. currentImg = imgs[0];
  83. currentImg.classList.add("active");
  84. }
  85. }
  86. // 小圆点高亮
  87. setPointActive(currentImg.dataset.index);
  88. }
  89. var div = document.querySelector(".box");
  90. var playImg;
  91. // 页面加载时自动播放
  92. window.onload = start();
  93. // 鼠标移出时: 播放
  94. div.addEventListener("mouseout", start);
  95. // 鼠标移入时: 停止
  96. div.addEventListener("mouseover", function () {
  97. clearInterval(playImg);
  98. });
  99. function start() {
  100. playImg = setInterval(function () {
  101. // Event 对象代表事件的状态
  102. var event = new Event("click");
  103. // 派发点击事件
  104. skip.item(1).dispatchEvent(event);
  105. }, 2000);
  106. }
  • 总结:
  • 选项卡可以将对应内容进行切换,第一个要做激活项
  • 懒加载有左边和顶部偏移量,可视区高度是动态变化的
  • 轮播图可以点击下方小圆点阅览,也可以点击左右翻页按钮阅览
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议