Blogger Information
Blog 59
fans 6
comment 0
visits 51754
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
选项卡,图片懒加载,轮播图自动播放功能-js-41课8.17
希望
Original
1224 people have browsed it

一、选项卡

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. }
  • 总结:
  • 选项卡可以将对应内容进行切换,第一个要做激活项
  • 懒加载有左边和顶部偏移量,可视区高度是动态变化的
  • 轮播图可以点击下方小圆点阅览,也可以点击左右翻页按钮阅览
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:页面是的基本组件并不多 , 掌握他们的原理很有意思 的
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