js实现轮播和滑动轮播

矫情吗;* 2023-02-18 08:27 113阅读 0赞

js的轮播图无论网页还是移动端都随处可见,本文用简单的方法来实现js的普通轮播图与滑动轮播图。(废话不多说,关键思路都写在代码注释处)
js普通轮播
简单描述一下js普通轮播的思路,用一个ul来存储需要轮播的图片,li使用绝对定位来保证图像成层叠关系。此时只需要改变图像的层叠关系就行,在这里程序的关键就是index变量,可以通过改变index来做到控制相应的图片的z-index。(具体思路步骤请参考代码的注释)

  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. <style>
  9. .lb_page {
  10. margin: 200px auto;
  11. width: 400px;
  12. height: 250px;
  13. position: relative;
  14. }
  15. .lb_img {
  16. width: 100%;
  17. height: 100%;
  18. position: relative;
  19. }
  20. ul {
  21. margin: 0px;
  22. padding: 0px;
  23. list-style: none;
  24. width: 100%;
  25. height: 100%;
  26. }
  27. .lb_img li {
  28. position: absolute;
  29. width: 100%;
  30. height: 100%;
  31. opacity: 0;
  32. transition: all 1s;
  33. }
  34. .active {
  35. opacity: 1 !important;
  36. }
  37. .lb_dot {
  38. position: absolute;
  39. z-index: 3;
  40. top: 90%;
  41. left: 50%;
  42. transform: translate(-50%, -50%);
  43. width: 100px;
  44. height: 20px;
  45. }
  46. .lb_dot>ul {
  47. display: flex;
  48. justify-content: center;
  49. align-items: center;
  50. }
  51. .lb_dot li {
  52. width: 20%;
  53. height: 100%;
  54. font-size: 36px;
  55. color: white;
  56. text-align: center;
  57. line-height: 20px;
  58. cursor: pointer;
  59. }
  60. .lb_pre {
  61. position: absolute;
  62. top: 50%;
  63. left: 0;
  64. z-index: 4;
  65. transform: translate(0, -50%);
  66. background-color: black;
  67. opacity: 0.5;
  68. width: 30px;
  69. height: 30px;
  70. color: white;
  71. display: none;
  72. cursor: pointer;
  73. }
  74. .lb_next {
  75. position: absolute;
  76. top: 50%;
  77. right: 0;
  78. z-index: 4;
  79. transform: translate(0, -50%);
  80. background-color: black;
  81. opacity: 0.5;
  82. width: 30px;
  83. height: 30px;
  84. color: white;
  85. display: none;
  86. cursor: pointer;
  87. }
  88. .select {
  89. color: aqua !important;
  90. }
  91. </style>
  92. <body>
  93. <!-- 整个轮播容器 -->
  94. <div class="lb_page">
  95. <!-- 轮播图 -->
  96. <div class="lb_img">
  97. <ul>
  98. <li class="active"><img src="image/lbt1.jpg" alt="" style="width: 100%;height: 100%;"></li>
  99. <li><img src="image/lbt2.jpg" alt="" style="width: 100%;height: 100%;"></li>
  100. <li><img src="image/lbt3.jpg" alt="" style="width: 100%;height: 100%;"></li>
  101. <li><img src="image/lbt4.jpg" alt="" style="width: 100%;height: 100%;"></li>
  102. <li><img src="image/lbt5.jpg" alt="" style="width: 100%;height: 100%;"></li>
  103. </ul>
  104. </div>
  105. <!-- 轮播小圆点 -->
  106. <div class="lb_dot">
  107. <ul>
  108. <li class="select">·</li>
  109. <li>·</li>
  110. <li>·</li>
  111. <li>·</li>
  112. <li>·</li>
  113. </ul>
  114. </div>
  115. <!-- 左右按钮 -->
  116. <div class="lb_pre">per</div>
  117. <div class="lb_next">next</div>
  118. </div>
  119. </body>
  120. <script>
  121. var lbImg = document.getElementsByClassName("lb_img")[0];
  122. var lbPre = document.getElementsByClassName("lb_pre")[0];//上一个DOM
  123. var lbNext = document.getElementsByClassName("lb_next")[0];//下一个DOM
  124. var lbDots = document.getElementsByClassName("lb_dot")[0];//轮播索引点
  125. var lbDot = lbDots.getElementsByTagName('li');//每一个索引点
  126. var imgLi = lbImg.getElementsByTagName('li');//每一张
  127. let index = 0;//关键变量、通过操作index进行轮播、切换等操作
  128. // 鼠标移进让左右按钮显示(暂时有这种办法解决事件捕捉)
  129. lbDots.onmouseover = lbNext.onmouseover = lbPre.onmouseover = lbImg.onmouseover = function () {
  130. clearInterval(timer) //鼠标移入暂定轮播
  131. lbPre.style.display = 'block';
  132. lbNext.style.display = 'block';
  133. }
  134. lbDots.onmouseout = lbNext.onmouseout = lbPre.onmouseout = lbImg.onmouseout = function () {
  135. lbPre.style.display = 'none';
  136. lbNext.style.display = 'none';
  137. timer = setInterval(() => { //鼠标移出重新开始
  138. index++
  139. showImg()
  140. }, 2000);
  141. }
  142. function showImg() {
  143. //初始化
  144. for (let i = 0; i < imgLi.length; i++) {
  145. imgLi[i].className = '';
  146. lbDot[i].className = ''
  147. }
  148. if (index > 4) {
  149. index = 0
  150. }
  151. if (index < 0) {
  152. index = 4
  153. }
  154. imgLi[index].className = 'active';
  155. lbDot[index].className = 'select'
  156. }
  157. //自动轮播
  158. var timer = setInterval(() => {
  159. index++
  160. showImg();
  161. }, 2000);
  162. //前后点击事件
  163. lbNext.onclick = function () {
  164. index++
  165. showImg()
  166. }
  167. lbPre.onclick = function () {
  168. index--
  169. showImg()
  170. }
  171. //点击圆点切换
  172. for (let i = 0; i < lbDot.length; i++) {
  173. lbDot[i].onclick = function () {
  174. clearInterval(timer);
  175. index = i
  176. showImg()
  177. }
  178. }
  179. </script>
  180. </html>

演示图:

在这里插入图片描述
js滑动轮播
js的滑动轮播相对于普通轮播来说相对麻烦点,思路也不太一样,在这我简述一下滑动轮播的实现思路。首先滑动轮播的实现主要原理和js走马灯类似,通过改变left 来做到切换。首先在定位上,ul使用绝对定位以改变其left做到轮播,大概了解的伙伴知道,要想让图片转换的非常丝滑~就必须在原本图片的前后在复制最后一张图片和第一张的图片(不知道也没关系,一张图让你搞懂)

在这里插入图片描述

  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>js滑动轮播</title>
  7. </head>
  8. <style>
  9. .lb_page {
  10. margin: 200px auto;
  11. width: 400px;
  12. height: 250px;
  13. position: relative;
  14. }
  15. .lb_img {
  16. width: 100%;
  17. height: 100%;
  18. position: relative;
  19. overflow: hidden;
  20. }
  21. ul {
  22. position: absolute;
  23. margin: 0px;
  24. padding: 0px;
  25. list-style: none;
  26. width: 2800px;
  27. height: 100%;
  28. }
  29. .lb_img li {
  30. float: left;
  31. width: 400px;
  32. height: 100%;
  33. }
  34. .lb_dot {
  35. position: absolute;
  36. z-index: 3;
  37. top: 90%;
  38. left: 50%;
  39. transform: translate(-50%, -50%);
  40. width: 100px;
  41. height: 20px;
  42. }
  43. .lb_dot>ul {
  44. width: 100%;
  45. left: 0px;
  46. display: flex;
  47. justify-content: center;
  48. align-items: center;
  49. }
  50. .lb_dot li {
  51. width: 20%;
  52. height: 100%;
  53. font-size: 36px;
  54. color: white;
  55. text-align: center;
  56. line-height: 20px;
  57. cursor: pointer;
  58. }
  59. .lb_pre {
  60. position: absolute;
  61. top: 50%;
  62. left: 0;
  63. z-index: 4;
  64. transform: translate(0, -50%);
  65. background-color: black;
  66. opacity: 0.5;
  67. width: 30px;
  68. height: 30px;
  69. color: white;
  70. display: none;
  71. cursor: pointer;
  72. }
  73. .lb_next {
  74. position: absolute;
  75. top: 50%;
  76. right: 0;
  77. z-index: 4;
  78. transform: translate(0, -50%);
  79. background-color: black;
  80. opacity: 0.5;
  81. width: 30px;
  82. height: 30px;
  83. color: white;
  84. display: none;
  85. cursor: pointer;
  86. }
  87. .select {
  88. color: aqua !important;
  89. }
  90. </style>
  91. <body>
  92. <!-- 整个轮播容器 -->
  93. <div class="lb_page">
  94. <!-- 轮播图 -->
  95. <div class="lb_img">
  96. <ul id="lbImg">
  97. <li><img src="image/lbt1.jpg" alt="" style="width: 100%;height: 100%;"></li>
  98. <li><img src="image/lbt2.jpg" alt="" style="width: 100%;height: 100%;"></li>
  99. <li><img src="image/lbt3.jpg" alt="" style="width: 100%;height: 100%;"></li>
  100. <li><img src="image/lbt4.jpg" alt="" style="width: 100%;height: 100%;"></li>
  101. <li><img src="image/lbt5.jpg" alt="" style="width: 100%;height: 100%;"></li>
  102. </ul>
  103. </div>
  104. <!-- 轮播小圆点 -->
  105. <div class="lb_dot">
  106. <ul>
  107. <li class="select">·</li>
  108. <li>·</li>
  109. <li>·</li>
  110. <li>·</li>
  111. <li>·</li>
  112. </ul>
  113. </div>
  114. <!-- 左右按钮 -->
  115. <div class="lb_pre">per</div>
  116. <div class="lb_next">next</div>
  117. </div>
  118. </body>
  119. <script>
  120. //得到一系列DOM
  121. var lbImg = document.getElementById("lbImg");
  122. var lbImgItem = lbImg.getElementsByTagName('li');
  123. var lbDots = document.getElementsByClassName("lb_dot")[0];
  124. var lbDot = lbDots.getElementsByTagName('li');
  125. var lbPre = document.getElementsByClassName("lb_pre")[0];
  126. var lbNext = document.getElementsByClassName("lb_next")[0];
  127. //复制最后一张图片到队首、第一张图片到队尾
  128. lbImg.appendChild(lbImgItem[0].cloneNode(true));
  129. lbImg.prepend(lbImgItem[4].cloneNode(true))
  130. lbImg.style.left = -400 + "px" //将第一张图片放入盒子中
  131. let index = 0 //关键变量,指向当前图片
  132. lbDots.onmouseover = lbNext.onmouseover = lbPre.onmouseover = lbImg.onmouseover = function () {
  133. clearInterval(timer) //鼠标移入暂定轮播
  134. lbPre.style.display = 'block';
  135. lbNext.style.display = 'block';
  136. }
  137. lbDots.onmouseout = lbNext.onmouseout = lbPre.onmouseout = lbImg.onmouseout = function () {
  138. lbPre.style.display = 'none';
  139. lbNext.style.display = 'none';
  140. timer = setInterval(() => { //鼠标移出重新开始
  141. index++
  142. show()
  143. }, 2000);
  144. }
  145. //核心函通过判断index的变化来做对应的操作
  146. function show() {
  147. for (let i = 0; i < lbDot.length; i++) {
  148. lbDot[i].className = ''
  149. }
  150. //类似index = 6时
  151. if (index < -1) {
  152. lbImg.style.transition = 'none';
  153. lbImg.style.left = -2000 + 'px';
  154. lbDot[4].className = 'select'
  155. index = 4;
  156. setTimeout(() => {
  157. index--;
  158. show()
  159. }, 0);
  160. return
  161. }
  162. //index = 6及index指向第一张图片
  163. else if (index > 5) {
  164. clearInterval(timer)
  165. lbImg.style.transition = 'none';//停止过渡的动画
  166. lbImg.style.left = -400 + 'px';//迅速切换到第一张图片
  167. lbDot[0].className = 'select'
  168. setTimeout(() => { //开个0延迟的计时器的目的是为了直接切换到第二张(解决第二次轮播时第一张图片换到第二张图片时,延迟加倍的bug)!!重点理解
  169. index++
  170. show()
  171. }, 0);
  172. timer = setInterval(() => { //重新开启循环计时器
  173. index++;
  174. show()
  175. }, 2000);
  176. index = 0;
  177. return;
  178. }
  179. //下面都是解决轮播序号的切换认真看下不难理解
  180. else if (index == 5) {
  181. lbDot[0].className = 'select'
  182. }
  183. else if (index == -1) {
  184. lbDot[4].className = 'select'
  185. }
  186. else {
  187. lbDot[index].className = 'select'
  188. }
  189. //关键步骤400为图片宽度 index为几个初始为-400px 因为前面复制了最后一张图片
  190. var widthLeft = -(index + 1) * 400;
  191. lbImg.style.left = widthLeft + "px";
  192. lbImg.style.transition = 'left 0.5s';//图片切换的动画
  193. }
  194. //前后点击事件
  195. lbNext.onclick = function () {
  196. clearInterval(timer)
  197. index++
  198. show()
  199. }
  200. lbPre.onclick = function () {
  201. clearInterval(timer)
  202. index--
  203. show()
  204. }
  205. //点击圆点切换
  206. for (let i = 0; i < lbDot.length; i++) {
  207. lbDot[i].onclick = function () {
  208. clearInterval(timer);
  209. index = i
  210. show()
  211. }
  212. }
  213. var timer = setInterval(() => {
  214. index++;
  215. show()
  216. }, 2000);
  217. </script>

演示图:
在这里插入图片描述
两种轮播图暂时没有发现什么bug,如果你有什么问题或者建议欢迎留言。

发表评论

表情:
评论列表 (有 0 条评论,113人围观)

还没有评论,来说两句吧...

相关阅读

    相关 js实现滑动

    js的轮播图无论网页还是移动端都随处可见,本文用简单的方法来实现js的普通轮播图与滑动轮播图。(废话不多说,关键思路都写在代码注释处) js普通轮播 简单描述一下js普

    相关 js

    js轮播 轮播:指的是图片间隔n秒循环性的播放 知识点:if/else、for语句、DOM操作、事件绑定、定时器 这里简单说明一下js所做的事情的思路: 1、单