程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

javascript轮播图超详细

发布于2022-08-03 06:49     阅读(1397)     评论(0)     点赞(21)     收藏(4)


主要功能介绍:

鼠标移动到轮播图中显示左右按钮,轮播图片的定时器停止

鼠标移出轮播图隐藏左右按钮,轮播图片的定时器开始

动态创建下面的小圆点

无缝滚动效果

点击左右按钮能切换图片,点击小圆点也能切换到对应的图片中,定时器切换图片

使用时间阀,只有点击左右按钮图片运动完成之后,点击左右按钮才能再次滚动,防止点击左右按钮次数过多,图片滚动过快的情况

 1、先搭建框架,标签如下图所示

2、html和css代码如下图所示,简单写一下,重要是学习js代码

  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. }
  6. div {
  7. box-sizing: border-box;
  8. }
  9. .focus {
  10. margin: 0 auto;
  11. position: relative;
  12. width: 1200px;
  13. height: 600px;
  14. background-color: pink;
  15. overflow: hidden;
  16. }
  17. ul {
  18. position: absolute;
  19. /* margin-left: 100px; */
  20. width: 8000px;
  21. height: 600px;
  22. }
  23. ul li {
  24. float: left;
  25. width: 1200px;
  26. height: 600px;
  27. background-color: purple;
  28. overflow: hidden;
  29. }
  30. img {
  31. width: 100%;
  32. }
  33. span {
  34. position: absolute;
  35. width: 60px;
  36. height: 60px;
  37. background-color: rgba(0, 0, 0, .5);
  38. color: #fff;
  39. font-size: 40px;
  40. text-align: center;
  41. line-height: 60px;
  42. top: 40%;
  43. z-index: 2;
  44. cursor: move;
  45. }
  46. .left {
  47. display: none;
  48. left: 0;
  49. }
  50. .right {
  51. display: none;
  52. left: 1138px;
  53. }
  54. ol {
  55. position: absolute;
  56. top: 550px;
  57. left: 50%;
  58. height: 40px;
  59. background-color: rgba(0, 0, 0, .2);
  60. list-style: none;
  61. transform: translate(-50%);
  62. border-radius: 20px;
  63. padding: 0 20px;
  64. }
  65. ol li {
  66. float: left;
  67. width: 20px;
  68. height: 20px;
  69. border-radius: 10px;
  70. background-color: #fff;
  71. margin-top: 10px;
  72. margin-left: 15px;
  73. }
  74. .current {
  75. background-color: orange;
  76. }
  77. </style>
  78. <script src="animate.js"></script>
  79. <script src="轮播.js"></script>
  80. </head>
  81. <body>
  82. <div class="focus">
  83. <span class="left">&lt</span>
  84. <span class="right">&gt</span>
  85. <ul>
  86. <li>
  87. <a href="javascript:;"><img src="1.jpg" alt=""></a>
  88. </li>
  89. <li>
  90. <a href="javascript:;"><img src="2.jpg" alt=""></a>
  91. </li>
  92. <li>
  93. <a href="javascript:;"><img src="3.jpg" alt=""></a>
  94. </li>
  95. <li>
  96. <a href="javascript:;"><img src="4.jpg" alt=""></a>
  97. </li>
  98. </ul>
  99. <ol>
  100. </ol>
  101. </div>

三、javascript代码如下

赶时间直接复制版:

  1. window.addEventListener('load', function() {
  2. var spanLeft = document.querySelector('.left');
  3. var spanRight = document.querySelector('.right');
  4. var focus = document.querySelector('.focus');
  5. var ol = this.document.querySelector('ol');
  6. var ul = focus.querySelector('ul');
  7. // 鼠标经过focus区域,左右两边的按钮显示
  8. focus.addEventListener('mouseenter', function() {
  9. spanLeft.style.display = 'block';
  10. spanRight.style.display = 'block';
  11. // 当鼠标经过focus区域的时候,清除定时器
  12. clearInterval(timer);
  13. timer = null;
  14. });
  15. // 鼠标离开focus区域,左右两边的按钮隐藏
  16. focus.addEventListener('mouseleave', function() {
  17. spanLeft.style.display = 'none';
  18. spanRight.style.display = 'none';
  19. // 离开focus时开启定时器(这里就不用var timer 了,直接给timer赋一个函数即可)
  20. timer = setInterval(function() {
  21. // 手动调用点击事件 目标对象.事件类型()
  22. spanRight.click();
  23. }, 2000)
  24. });
  25. // 动态创建小圆圈li并将他添加到ol中
  26. for (var i = 0; i < ul.children.length; i++) {
  27. // 每循环一次,创建一个li(不能创建一个li添加多次)
  28. var li = document.createElement('li');
  29. ol.appendChild(li);
  30. // 每创建一个li就给他创建一个自定义属性
  31. li.setAttribute('index', i);
  32. // 点击的这个li(不点击不会触发,当点击时早已经生成完毕)
  33. // 点击li让ul移动相应的距离
  34. li.addEventListener('click', function() {
  35. // 排他思想
  36. for (var i = 0; i < ol.children.length; i++) {
  37. ol.children[i].className = '';
  38. }
  39. this.className = 'current';
  40. // 获取被点击li的自定义属性index的值
  41. var index = this.getAttribute('index');
  42. // 当我们点击了某个li时,就把这个li的索引值index给num
  43. // 让点击的小圆圈和点击左右按钮移动图片联系起来
  44. //不然,如果点击第三个小圆圈,下面的小圆点到第三个,再点击右按钮,
  45. // 他又会按照点击右按钮的算法,给num赋值为2,让小圆点到第二个上去
  46. num = index;
  47. // 当我们点击了某个li时,就把这个li的索引值index给circle
  48. // 让点击的小圆圈和点击左右按钮,下面的小圆点也跟着动联系起来
  49. circle = index;
  50. // 注意ul没有position:absolute;就不能移动,原理就是靠改变绝对定位的值来改变位置的
  51. animate(ul, -index * focus.offsetWidth);
  52. });
  53. };
  54. // 先给ol里面的第一个小圆圈一个current属性,让圆圈不点击情况下,默认颜色为橘色
  55. ol.children[0].className = 'current';
  56. // 深度克隆第一个li,为了实现动态的无缝连接
  57. // 克隆的放到生成ol>li的后面,不然就会多生成一个li,影响效果
  58. var first = ul.children[0].cloneNode(true);
  59. // 将第一个li添加到ul的后面,他又在创建小圆圈的后面,所以不用多创建一个小圆圈
  60. ul.appendChild(first);
  61. // 点击一次右侧按钮,就让图片往右移动一个li的距离
  62. // 让左右按钮和ul图片移动联系起来
  63. var num = 0;
  64. // 定义一个全局变量circle,当点击左右切换按钮时,下面的小圆点也跟着动
  65. var circle = 0;
  66. // 定义一个flag变量,用节流阀来防止图片切换过快的现象
  67. var flag = true;
  68. spanRight.addEventListener('click ', function() {
  69. // 点击按钮后,先让他进入if判断语句执行,进入后把路给他封上,
  70. // 再当所有的动画都执行完毕后,即用回调函数再把路给他打开
  71. if (flag) {
  72. flag = false;
  73. num++;
  74. // num是从0开始的,他最多到ul.children.length-1个,当num=(children.length-1)+1时,
  75. // 说明又得循环一次。 比如有4个li,再加上克隆的,一共有5个。num最大到4(从0开始)
  76. // 当num等于5时,让他的位置迅速的到num= 0的位置(肉眼看不见的移动),此时再让num = 1,再进行
  77. // 一次动画,相当于无缝连接
  78. // 时,返回开头,从0开始无缝滚动
  79. if (num == ul.children.length) {
  80. ul.style.left = 0;
  81. num = 1;
  82. }
  83. // 添加回调函数,等动画都执行完毕再执行回调函数即让他可以点击按钮,切换图片
  84. animate(ul, -num * focus.offsetWidth, function() {
  85. flag = true;
  86. });
  87. // 先++,因为点击后切换到第二个li,给第二个小圆点current才行
  88. // 让左右按钮和下面的小圆圈联系起来
  89. circle++;
  90. // 排他思想
  91. for (var i = 0; i < ol.children.length; i++) {
  92. ol.children[i].className = '';
  93. }
  94. // 一共有四个圈,circle从0开始,最大到3,让他的圈等4时,强制circle等于0,就实现循环
  95. if (circle == ol.children.length) {
  96. circle = 0;
  97. }
  98. // 让第circle+1个圈有橙色的类名
  99. ol.children[circle].className = 'current';
  100. }
  101. });
  102. // 点击一次左边的按钮,先num--如果他等于-1,也就是说一个循环结束,他该换到最后一张图片了
  103. // 就迅速把他的最后一张的ul的left值用style.left的方式赋值给ul,
  104. // 当他迅速(肉眼看不到的速度)切换到最后一张克隆的照片时,让num=最后一张照片的前一个值,
  105. // 再做一次动画,将ul的left值,减少一个li的大小======> 无缝滚动原理
  106. spanLeft.addEventListener('click', function() {
  107. if (flag) {
  108. num--;
  109. if (num == -1) {
  110. // 当num= -1时,让ul迅速到达第5图,即num= 4时<=>ul.children.length - 1
  111. // 再让他往前做一次动画------->无缝连接
  112. ul.style.left = -(ul.children.length - 1) * focus.offsetWidth;
  113. num = ul.children.length - 2;
  114. }
  115. animate(ul, -num * focus.offsetWidth, function() {
  116. flag = true;
  117. });
  118. circle--;
  119. // 排他思想
  120. for (var i = 0; i < ol.children.length; i++) {
  121. ol.children[i].className = '';
  122. }
  123. if (circle == -1) {
  124. circle = ol.children.length - 1;
  125. }
  126. ol.children[circle].className = 'current';
  127. }
  128. })
  129. // 自动播放轮播图
  130. var timer = this.setInterval(function() {
  131. // 手动调用点击事件 目标对象.事件类型()
  132. spanRight.click();
  133. }, 1000);
  134. })

详细解析版:

1、 鼠标经过focus区域,左右两边的按钮显示

       鼠标离开focus区域,左右两边的按钮隐藏

这一块不是很难,当你想要做轮播图的时候,这就已经很简单了。

  1. window.addEventListener('load', function() {
  2. var spanLeft = document.querySelector('.left');
  3. var spanRight = document.querySelector('.right');
  4. var focus = document.querySelector('.focus');
  5. // 鼠标经过focus区域,左右两边的按钮显示
  6. focus.addEventListener('mouseenter', function() {
  7. spanLeft.style.display = 'block';
  8. spanRight.style.display = 'block';
  9. });
  10. // 鼠标离开focus区域,左右两边的按钮隐藏
  11. focus.addEventListener('mouseleave', function() {
  12. spanLeft.style.display = 'none';
  13. spanRight.style.display = 'none';
  14. });

2、动态创建小圆圈li并将他添加到ol中(ol中的小圆圈的数目不能固定,所以要动态添加)

  1. //获取小圆圈的ol和轮播图中的ul
  2. var ol = this.document.querySelector('ol');
  3. var ul = focus.querySelector('ul');
  4. for (var i = 0; i < ul.children.length; i++) {
  5. // 每循环一次,创建一个li(不能创建一个li添加多次)
  6. var li = document.createElement('li');
  7. ol.appendChild(li);
  8. }
  9. // 先给ol里面的第一个小圆圈一个current属性,让圆圈不点击情况下,默认颜色为橘色
  10. ol.children[0].className = 'current';

 3、点击下方的小圆圈,就切换图片(实质是让ul移动相应的距离),当前小圆点的颜色也改变

注意:这个操作可以在上述操作中进行,这步操作在点击之后才会运行,当你点击时,上述操作早已经执行完毕

  1. //获取小圆圈的ol和轮播图中的ul
  2. var ol = this.document.querySelector('ol');
  3. var ul = focus.querySelector('ul');
  4. for (var i = 0; i < ul.children.length; i++) {
  5. // 每循环一次,创建一个li(不能创建一个li添加多次)
  6. var li = document.createElement('li');
  7. ol.appendChild(li);
  8. // 每创建一个li就给他创建一个自定义属性
  9. li.setAttribute('index', i);
  10. // 点击的这个li(不点击不会触发,当点击时上述早已经生成完毕)
  11. // 点击li让ul移动相应的距离
  12. li.addEventListener('click', function() {
  13. // 排他思想,让所有的li的className全消失,让当前的classname出现
  14. for (var i = 0; i < ol.children.length; i++) {
  15. ol.children[i].className = '';
  16. }
  17. this.className = 'current';
  18. // 获取被点击li的自定义属性index的值
  19. var index = this.getAttribute('index');
  20. animate(ul, -index * focus.offsetWidth);
  21. });
  22. }

4、为了实现无缝连接,需要深度克隆第一li并将它放到ul最后面的位置

深度克隆:var  first = li.cloneNode(true);

在元素后添加:父级.appendChild(子级);

  1. ol.children[0].className = 'current';
  2. // 深度克隆第一个li,为了实现动态的无缝连接
  3. // 克隆的放到生成ol>li的后面,不然就会多生成一个li,影响效果
  4. var first = ul.children[0].cloneNode(true);
  5. // 将第一个li添加到ul的后面,他又在创建小圆圈的后面,所以不用多创建一个小圆圈
  6. ul.appendChild(first);

5、点击左右按钮实现图片的切换效果

  1. // 定义一个flag变量,用节流阀来防止图片切换过快的现象
  2. var flag = true;
  3. spanRight.addEventListener('click', function() {
  4. // 点击按钮后,先让他进入if判断语句执行,进入后把路给他封上,
  5. // 再当所有的动画都执行完毕后,即用回调函数再把路给他打开
  6. if (flag) {
  7. flag = false;
  8. num++;
  9. // num是从0开始的,他最多到ul.children.length-1个,当num=(children.length-1)+1时,
  10. // 说明又得循环一次。 比如有4个li,再加上克隆的,一共有5个。num最大到4(从0开始)
  11. // 当num等于5时,让他的位置迅速的到num= 0的位置(肉眼看不见的移动),此时再让num = 1,再进行
  12. // 一次动画,相当于无缝连接
  13. // 时,返回开头,从0开始无缝滚动
  14. if (num == ul.children.length) {
  15. ul.style.left = 0;
  16. num = 1;
  17. }
  18. // 添加回调函数,等动画都执行完毕再执行回调函数即让他可以点击按钮,切换图片
  19. animate(ul, -num * focus.offsetWidth, function() {
  20. flag = true;
  21. });
  22. // 先++,因为点击后切换到第二个li,给第二个小圆点current才行
  23. // 让左右按钮和下面的小圆圈联系起来
  24. circle++;
  25. // 排他思想
  26. for (var i = 0; i < ol.children.length; i++) {
  27. ol.children[i].className = '';
  28. }
  29. // 一共有四个圈,circle从0开始,最大到3,让他的圈等4时,强制circle等于0,就实现循环
  30. if (circle == ol.children.length) {
  31. circle = 0;
  32. }
  33. // 让第circle+1个圈有橙色的类名
  34. ol.children[circle].className = 'current';
  35. }
  36. });
  37. // 点击一次左边的按钮,先num--如果他等于-1,也就是说一个循环结束,他该换到最后一张图片了
  38. // 就迅速把他的最后一张的ul的left值用style.left的方式赋值给ul,
  39. // 当他迅速(肉眼看不到的速度)切换到最后一张克隆的照片时,让num=最后一张照片的前一个值,
  40. // 再做一次动画,将ul的left值,减少一个li的大小======> 无缝滚动原理
  41. spanLeft.addEventListener('click', function() {
  42. if (flag) {
  43. num--;
  44. if (num == -1) {
  45. // 当num= -1时,让ul迅速到达第5图,即num= 4时<=>ul.children.length - 1
  46. // 再让他往前做一次动画------->无缝连接
  47. ul.style.left = -(ul.children.length - 1) * focus.offsetWidth;
  48. num = ul.children.length - 2;
  49. }
  50. animate(ul, -num * focus.offsetWidth, function() {
  51. flag = true;
  52. });
  53. circle--;
  54. // 排他思想
  55. for (var i = 0; i < ol.children.length; i++) {
  56. ol.children[i].className = '';
  57. }
  58. if (circle == -1) {
  59. circle = ol.children.length - 1;
  60. }
  61. ol.children[circle].className = 'current';
  62. }
  63. })

 

 6、创建定时器实现自己滚动

  1. // 自动播放轮播图
  2. var timer = this.setInterval(function() {
  3. // 手动调用点击事件 目标对象.事件类型()
  4. spanRight.click();
  5. }, 1000);

7、当鼠标放到focus时,清除定时器。当鼠标移开focus时,创建定时器。

这一步是在第一步的基础上完成的

  1. // 鼠标经过focus区域,左右两边的按钮显示
  2. focus.addEventListener('mouseenter', function() {
  3. spanLeft.style.display = 'block';
  4. spanRight.style.display = 'block';
  5. // 当鼠标经过focus区域的时候,清除定时器
  6. clearInterval(timer);
  7. timer = null;
  8. });
  9. // 鼠标离开focus区域,左右两边的按钮隐藏
  10. focus.addEventListener('mouseleave', function() {
  11. spanLeft.style.display = 'none';
  12. spanRight.style.display = 'none';
  13. // 离开focus时开启定时器(这里就不用var timer 了,直接给timer赋一个函数即可)
  14. timer = setInterval(function() {
  15. // 手动调用点击事件 目标对象.事件类型()
  16. spanRight.click();
  17. }, 2000)
  18. });

8、让几个步骤联系起来

  1. // 当我们点击了某个li时,就把这个li的索引值index给num
  2. // 让点击的小圆圈和点击左右按钮移动图片联系起来
  3. //不然,如果点击第三个小圆圈,下面的小圆点到第三个,再点击右按钮,
  4. // 他又会按照点击右按钮的算法,给num赋值为2,让小圆点到第二个上去
  5. num = index;
  6. // 当我们点击了某个li时,就把这个li的索引值index给circle
  7. // 让点击的小圆圈和点击左右按钮,下面的小圆点也跟着动联系起来
  8. circle = index;
  9. // 注意ul没有position:absolute;就不能移动,原理就是靠改变绝对定位的值来改变位置的




所属网站分类: 技术文章 > 博客

作者:听说你很拽

链接:http://www.qianduanheidong.com/blog/article/381385/facafba9a2ffba40bfb4/

来源:前端黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

21 0
收藏该文
已收藏

评论内容:(最多支持255个字符)