博客列表 >幻灯片完善:为翻页按钮添加功能 , 当鼠标移出时,图片的每隔2秒的自动播放,当鼠标移入时自动停止播放,选项卡, 懒加载二选一

幻灯片完善:为翻页按钮添加功能 , 当鼠标移出时,图片的每隔2秒的自动播放,当鼠标移入时自动停止播放,选项卡, 懒加载二选一

后网络时代
后网络时代原创
2021年01月13日 15:18:44656浏览

1. 为翻页按钮添加功能

2. 当鼠标移出时,图片的每隔2秒的自动播放,当鼠标移入时自动停止播放

第一版:通过变量控制:

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  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="banner/style.css" />
  8. </head>
  9. <body>
  10. <div class="container">
  11. <!-- 1. 图片组 -->
  12. <nav class="imgs">
  13. <a href=""><img src="banner/banner1.jpg" alt="" data-index="1" class="active" /></a>
  14. <a href=""><img src="banner/banner2.jpg" alt="" data-index="2" /></a>
  15. <a href=""><img src="banner/banner3.jpg" alt="" data-index="3" /></a>
  16. <a href=""><img src="banner/banner4.jpg" alt="" data-index="4" /></a>
  17. </nav>
  18. <!-- 2. 图片小按钮 -->
  19. <nav class="btns">
  20. <!-- 这些小按钮应该根据图片数量自动生成 -->
  21. <!-- <a href="" data-index="1" class="active"></a>
  22. <a href="" data-index="2"></a>
  23. <a href="" data-index="3"></a>
  24. <a href="" data-index="4"></a> -->
  25. </nav>
  26. <!-- 3. 翻页 -->
  27. <nav class="skip">
  28. <a href="#" class="prev">&lt;</a>
  29. <a href="#" class="next">&gt;</a>
  30. </nav>
  31. </div>
  32. <script>
  33. // 所有图片
  34. const imgs = document.querySelectorAll(".container > .imgs img");
  35. // 按钮组
  36. const btnGroup = document.querySelector(".container > .btns");
  37. // 翻页按钮
  38. const skip = document.querySelector(".container > .skip");
  39. // 创建出一组与图片数量对应的小按钮
  40. function autoCreateBtns(ele, imgLength) {
  41. const frag = document.createDocumentFragment();
  42. for (let i = 0; i < imgLength; i++) {
  43. const a = document.createElement("a");
  44. a.href = "#";
  45. a.dataset.index = i + 1;
  46. if (i === 0) a.classList.add("active");
  47. frag.appendChild(a);
  48. }
  49. ele.appendChild(frag);
  50. }
  51. // 调用创建小按钮的函数
  52. autoCreateBtns(btnGroup, imgs.length);
  53. // 为刚刚生成的小按钮们添加点击事件
  54. const btns = document.querySelectorAll(".container > .btns > *");
  55. // 下面声明二个公共函数
  56. // 1. 获取激活的元素
  57. function getActiveEle(eles) {
  58. let activities = [...eles].filter(img => img.classList.contains("active"));
  59. return activities.shift();
  60. }
  61. let playNum=1;
  62. // 2. 设置激活的元素,根据按钮索引更新正在显示的图片
  63. function setActiveEle(btnIndex) {
  64. btnIndex=(String)(btnIndex>imgs.length?"1": btnIndex);
  65. btnIndex=(String)(btnIndex<=0?imgs.length: btnIndex);
  66. playNum=btnIndex;
  67. [imgs, btns].forEach(arr => {
  68. // 将之前的状态全部重置到初始化(清空)
  69. getActiveEle(arr).classList.remove("active");
  70. arr.forEach(item => {
  71. if (item.dataset.index === btnIndex) {
  72. item.classList.add("active");
  73. }
  74. });
  75. });
  76. }
  77. // 为每一个小按钮添加事件
  78. btns.forEach(btn => btn.addEventListener("click", ev => setActiveEle(ev.target.dataset.index)));
  79. // 作业:
  80. // 1. 为翻页按钮添加功能
  81. // 2. 当鼠标移出时,图片的每隔2秒的自动播放,当鼠标移入时自动停止播放
  82. // 3. 上节课的选项卡, 懒加载二选一
  83. // 按时间自动切换:
  84. function autoPlay(){
  85. setActiveEle(++playNum);
  86. }
  87. let setId=setInterval(autoPlay,2000);
  88. const container = document.querySelector(".container");
  89. container.addEventListener('mousemove',()=>clearInterval(setId));
  90. container.addEventListener('mouseleave',()=>setId=setInterval(autoPlay,2000));
  91. //左右切换
  92. const skipLift = document.querySelector(".skip > .prev");
  93. const skipRight = document.querySelector(".skip > .next");
  94. skipLift.addEventListener('click',()=>setActiveEle(--playNum));
  95. skipRight.addEventListener('click',()=>setActiveEle(++playNum));
  96. </script>
  97. </body>
  98. </html>

第二版:
事件派发版本:

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  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="banner/style.css" />
  8. </head>
  9. <body>
  10. <div class="container">
  11. <!-- 1. 图片组 -->
  12. <nav class="imgs">
  13. <a href=""><img src="banner/banner1.jpg" alt="" data-index="1" class="active" /></a>
  14. <a href=""><img src="banner/banner2.jpg" alt="" data-index="2" /></a>
  15. <a href=""><img src="banner/banner3.jpg" alt="" data-index="3" /></a>
  16. <a href=""><img src="banner/banner4.jpg" alt="" data-index="4" /></a>
  17. </nav>
  18. <!-- 2. 图片小按钮 -->
  19. <nav class="btns">
  20. <!-- 这些小按钮应该根据图片数量自动生成 -->
  21. <!-- <a href="" data-index="1" class="active"></a>
  22. <a href="" data-index="2"></a>
  23. <a href="" data-index="3"></a>
  24. <a href="" data-index="4"></a> -->
  25. </nav>
  26. <!-- 3. 翻页 -->
  27. <nav class="skip">
  28. <a href="#" class="prev">&lt;</a>
  29. <a href="#" class="next">&gt;</a>
  30. </nav>
  31. </div>
  32. <script>
  33. // 所有图片
  34. const imgs = document.querySelectorAll(".container > .imgs img");
  35. // 按钮组
  36. const btnGroup = document.querySelector(".container > .btns");
  37. // 翻页按钮
  38. const skip = document.querySelector(".container > .skip");
  39. // 创建出一组与图片数量对应的小按钮
  40. function autoCreateBtns(ele, imgLength) {
  41. const frag = document.createDocumentFragment();
  42. for (let i = 0; i < imgLength; i++) {
  43. const a = document.createElement("a");
  44. a.href = "#";
  45. a.dataset.index = i + 1;
  46. if (i === 0) a.classList.add("active");
  47. frag.appendChild(a);
  48. }
  49. ele.appendChild(frag);
  50. }
  51. // 调用创建小按钮的函数
  52. autoCreateBtns(btnGroup, imgs.length);
  53. // 为刚刚生成的小按钮们添加点击事件
  54. const btns = document.querySelectorAll(".container > .btns > *");
  55. // 下面声明二个公共函数
  56. // 1. 获取激活的元素
  57. function getActiveEle(eles) {
  58. let activities = [...eles].filter(img => img.classList.contains("active"));
  59. return activities.shift();
  60. }
  61. // 2. 设置激活的元素,根据按钮索引更新正在显示的图片
  62. function setActiveEle(btnIndex) {
  63. [imgs, btns].forEach(arr => {
  64. // 将之前的状态全部重置到初始化(清空)
  65. getActiveEle(arr).classList.remove("active");
  66. arr.forEach(item => {
  67. if (item.dataset.index === btnIndex) {
  68. item.classList.add("active");
  69. }
  70. });
  71. });
  72. }
  73. // 为每一个小按钮添加事件
  74. btns.forEach(btn => btn.addEventListener("click", ev => setActiveEle(ev.target.dataset.index)));
  75. // 作业:
  76. // 1. 为翻页按钮添加功能
  77. // 2. 当鼠标移出时,图片的每隔2秒的自动播放,当鼠标移入时自动停止播放
  78. // 3. 上节课的选项卡, 懒加载二选一
  79. //通过实践盘发来实现切交换:
  80. let currId=0;
  81. const ev=new Event('click');
  82. let setId=setInterval("autoPlay(currId++)",2000);
  83. function autoPlay(runId){
  84. runId=runId>=(imgs.length)?0:runId;
  85. runId=runId<0?(imgs.length-1):runId;
  86. currId=runId;
  87. btns[runId].dispatchEvent(ev);
  88. }
  89. const container = document.querySelector(".container");
  90. container.addEventListener('mousemove',()=>clearInterval(setId));
  91. container.addEventListener('mouseleave',()=>setId=setInterval("autoPlay(++currId);",2000));
  92. //左右切换
  93. const skipLift = document.querySelector(".skip > .prev");
  94. const skipRight = document.querySelector(".skip > .next");
  95. skipLift.addEventListener('click',()=>autoPlay(--currId));
  96. skipRight.addEventListener('click',()=>autoPlay(++currId));
  97. </script>
  98. </body>
  99. </html>

效果图:

选项卡

  1. <!DOCTYPE html>
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <style type="text/css">
  9. *{
  10. margin:0;
  11. padding: 0;
  12. border:0;
  13. box-sizing: border-box;
  14. }
  15. .container{
  16. width:300px;
  17. margin:0 auto;
  18. overflow: hidden;
  19. }
  20. .container ul:nth-of-type(1){
  21. font-size: 16px;
  22. text-align: center;
  23. line-height: 35px;
  24. list-style: none;
  25. display: grid;
  26. grid-template-columns: 1fr 1fr 1fr;
  27. overflow: hidden;
  28. }
  29. .container ul:nth-of-type(1) li{
  30. float:left;
  31. background-color:coral;
  32. }
  33. .container ul:nth-of-type(1) li a{
  34. text-decoration: none;
  35. color:#333;
  36. }
  37. .container ul:nth-of-type(1) li.active{
  38. background-color:gray;
  39. }
  40. .container ul.item{
  41. font-size: 14px;
  42. text-align: left;
  43. line-height: 28px;
  44. list-style: none;
  45. overflow: hidden;
  46. background-color: gray;
  47. text-indent: 12px;
  48. display: none;
  49. }
  50. .container ul.active{
  51. display:block;
  52. }
  53. </style>
  54. </head>
  55. <body>
  56. <div class="container">
  57. <ul><li class="active" data-index="1">国内新闻</li><li data-index="2">国外新闻</li><li data-index="3">娱乐新闻</li></ul>
  58. <ul class="item active" data-index="1">
  59. <li><a href="">特朗谱下台特朗谱下台特朗谱下台</a></li>
  60. <li><a href="">特朗谱下台特朗谱下台特朗谱下台</a></li>
  61. <li><a href="">特朗谱下台特朗谱下台特朗谱下台</a></li>
  62. <li><a href="">特朗谱下台特朗谱下台特朗谱下台</a></li>
  63. </ul>
  64. <ul class="item" data-index="2">
  65. <li><a href="">石家庄疫情严重</a></li>
  66. <li><a href="">全国各地疫情蔓延中</a></li>
  67. <li><a href="">武汉援助石家庄</a></li>
  68. <li><a href="">疫情源头系冷链产品</a></li>
  69. </ul>
  70. <ul class="item" data-index="3">
  71. <li><a href="">真正的明星终于上台了</a></li>
  72. <li><a href="">是金子总要发光的</a></li>
  73. <li><a href="">杨丽颖要分手黄晓明拒绝</a></li>
  74. <li><a href="">李克勤周深同台</a></li>
  75. </ul>
  76. </div>
  77. <script>
  78. const topSelectParent=document.querySelector(".container > ul:nth-of-type(1)");
  79. const topSelect=document.querySelectorAll(".container > ul:nth-of-type(1) li");
  80. const selectItem=document.querySelectorAll(".container > ul.item");
  81. topSelectParent.addEventListener('click',function(ev){
  82. let index=ev.target.dataset.index;
  83. let topSelectRand=[...topSelect];
  84. let topObj=ev.target;
  85. selectItem.forEach(arr=>{
  86. arr.classList.remove('active');
  87. topSelectRand.shift().classList.remove('active');
  88. if(arr.dataset.index==index){
  89. arr.classList.add('active');
  90. }
  91. })
  92. topObj.classList.add('active');
  93. });
  94. </script>
  95. </body>
  96. </html>

效果图:

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