轮播图完整代码详细解析,css+js+html完整代码,可直接复制粘贴使用,仅需改图片即可
这是一段使用HTML、CSS和JavaScript编写的图片轮播组件。它通过定时器实现自动播放图片,同时提供向左和向右的箭头按钮以手动切换图片。还包括一个圆圈导航,用于显示当前图片的索引,并且可以点击圆圈导航进行图片切换。
具体实现步骤如下:
- 获取相关元素:获取轮播图容器(images)、向左箭头按钮(arrow_l)、向右箭头按钮(arrow_r)、图片列表(ul)、圆圈导航(ol)等元素。
- 设置鼠标悬停和离开事件:当鼠标悬停在轮播图容器上时,显示箭头按钮,并清除定时器;当鼠标离开轮播图容器时,隐藏箭头按钮,并重新开启定时器。
- 动态生成圆圈导航:根据图片数量动态生成相应数量的圆圈导航,并为导航元素设置索引号(index)属性和点击事件。
- 克隆第一张图片:将第一张图片复制一份,并添加到图片列表的最后,以实现图片无缝滚动。
- 向右切换图片:点击向右箭头按钮时,判断是否滚动到最后一张图片,如果是,则将图片容器的left值快速复原为0,并将num重置为0,接着执行滚动动画;同时,圆圈导航也随之变化。
- 向左切换图片:点击向左箭头按钮时,判断是否滚动到第一张图片,如果是,则将图片容器的left值设置为倒数第二张图片的位置,并将num重置为最后一张图片的索引号,接着执行滚动动画;同时,圆圈导航也随之变化。
- 圆圈导航变化:通过循环遍历圆圈导航元素,将除当前导航以外的所有导航的class清空,为当前导航添加class,实现高亮效果。
- 自动播放轮播图:使用定时器实现自动切换轮播图,每隔一段时间调用向右切换图片的逻辑。
以上就是该轮播组件的实现步骤。你可以根据需要进行修改和扩展,例如调整样式、更换图片等。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> * { margin: 0; padding: 0; } body { display: flex; justify-content: center; align-items: center; } .images { width: 350px; height: 350px; position: relative; overflow: hidden; } ul { list-style-type: none; width: 600%; position: absolute; } ul li { float: left; } .images a { text-decoration: none; color: white; position: absolute; top: 175px; display: none; z-index: 999; } .arrow_l { left: 0; transform: translate(0, -50%); } .arrow_r { right: 0; transform: translate(0, -50%); } ol { list-style-type: none; position: absolute; top: 0; left: 0; width: 350px; height: 350px; display: flex; justify-content: center; align-items: flex-end; } ol li { width: 10px; height: 10px; border-radius: 50%; border: 1px solid white; /* float: left; */ margin-left: 5px; } .current { background-color: white; } </style> </head> <body> <div class="images"> <a href="javascript:;" class="arrow_l">向左</a> <a href="javascript:;" class="arrow_r">向右</a> <ul> <li><img src="./images/flame-girl1.jpg" alt=""></li> <li><img src="./images/flame-girl2.jpg" alt=""></li> <li><img src="./images/flame-girl3.jpg" alt=""></li> <li><img src="./images/flame-girl4.jpg" alt=""></li> <li><img src="./images/flame-girl5.jpg" alt=""></li> <!-- <li><img src="./images/flame-girl1.jpg" alt=""></li> --> </ul> <ol class="circle"> <!-- <li></li> <li></li> <li></li> <li></li> --> </ol> </div> <script> // 思路 // 让盒子每次移动的距离慢慢变小,速度就会慢慢落下来 // 核心算法:(目标值-现在的位置)/10作为每次移动的距离 步长 // 停止的条件是:让当前盒子位置等于目标位置就停止定时器 function animate(obj, target, callback) { //先清除以前的定时器,只保留当前的一个定时器执行 clearInterval(obj.timer)//清除以前的定时器 obj.timer = setInterval(function () { //步长值写到定时器的里面 //把步长值改为整数 不要出现小数的问题 var step = (target - obj.offsetLeft) / 10 step = step > 0 ? Math.ceil(step) : Math.floor(step) if (obj.offsetLeft == target) { //停止动画效果本质是停止定时器 clearInterval(obj.timer) //如果有就调用,如果没有不执行 if (callback) { //调用函数 callback() } } obj.style.left = obj.offsetLeft + step + 'px' }, 15) } window.addEventListener('load', function () { var images = document.querySelector('.images') var arrow_l = document.querySelector('.arrow_l') var arrow_r = document.querySelector('.arrow_r') var moveWidth = images.offsetWidth images.addEventListener('mouseenter', function () { arrow_l.style.display = 'block' arrow_r.style.display = 'block' //鼠标经过,就清除定时器 clearInterval(timer) timer = null//清除定时器变量 }) images.addEventListener('mouseleave', function () { arrow_l.style.display = 'none' arrow_r.style.display = 'none' //鼠标离开,再开启定时器 timer = setInterval(function () { //手动调用点击事件 arrow_r.click() }, 2000) }) //动态生成小圆圈,有几个图片,就生成几个小圆圈 var ul = images.querySelector('ul') var ol = images.querySelector('ol') for (var i = 0; i < ul.children.length; i++) { //创建li var li = document.createElement('li') //记录当前小圆圈的索引号,通过自定义属性 li.setAttribute('index', i) //把li插入到ol里面 ol.appendChild(li) //小圆圈的排他思想 我们可以直接在生成小圆圈的同时绑定点击事件 li.addEventListener('click', function () { //干掉所有人 把所有的li清除current类名 for (var i = 0; i < ol.children.length; i++) { ol.children[i].className = '' } //留下我自己 当前的li设置current类名 this.className = 'current' //点击小圆圈,移动的是ul //移动的距离是小圆圈的索引号乘以图片的宽度 注意为负值 //当我们点击了某个li,我们就拿到当前li的索引号 var index = this.getAttribute('index') //当我们点击了某个li 就把这个li的索引号给num num = index //当我们点击了某个li 就把这个li的索引号给circle circle = index animate(ul, -index * moveWidth) }) } //ba0l里面的第一个li设置类名为current ol.children[0].className = 'current' //克隆第一张图片li放到ul最后面 var first = ul.children[0].cloneNode(true) ul.appendChild(first) //点击右侧按钮,图片滚动一张 //声明一个变量num,点击一次,自增1,让这个变量乘以图片的宽度,就是ul的滚动距离 //图片无缝滚动原理: //把ul第一个li复制一份,放到ul的最后面 //当图片滚动到克隆的最后一张图片时,让ul快速的、不做动画的跳到最左侧:left为0 //同时num赋值为0,重新开始滚动就可以了 var num = 0; //控制小圆圈的播放 var circle = 0 //右侧按钮做法 arrow_r.addEventListener('click', function () { //如果走到了最后复制的一张图片,此时,我们的ul要快速复原,left值为0 if (num == ul.children.length - 1) { ul.style.left = 0 num = 0 } num++ animate(ul, -num * moveWidth) //点击右侧按钮,小圆圈跟随一起变化 可以在声明一个变量控制小圆圈的播放 circle++ //如果circle==ol.children.length 说明我们走到最后我们克隆的这张图片了 我们就复原 if (circle == ol.children.length) { circle = 0 } circleChange() }) //左侧按钮 arrow_l.addEventListener('click', function () { //如果走到了第一张图片,此时,我们的ul要快速到倒数第一张 if (num == 0) { num = ul.children.length - 1 ul.style.left = -num * moveWidth + 'px' } num-- animate(ul, -num * moveWidth) //点击右侧按钮,小圆圈跟随一起变化 可以在声明一个变量控制小圆圈的播放 circle-- //如果circle<0 说明我们走到第一张张图片了 我们就改为第5个小圆圈 if (circle < 0) { circle = ol.children.length - 1 } circleChange() }) function circleChange() { //先清除其余小圆圈的current类名 for (var i = 0; i < ol.children.length; i++) { ol.children[i].className = '' } //留下当前小圆圈的current类名 ol.children[circle].className = 'current' } //自动播放轮播图 var timer = setInterval(function () { //手动调用点击事件 arrow_r.click() }, 2000) }) </script> </body> </html>
复制
效果图