1.一个播放窗口
2.方向键
3.要播放的图片
4.随图片播放的小圆圈
1.方向键根据窗口高度自动居中,左右间隔固定
2.根据图片数量自动创建小圆圈
3.点击小圆圈图片随之改变,小圆圈必须与图片对应
4.点击方向键,图片也随之改变
5.鼠标移入窗口,则显示方向键,同时播放停止
6.鼠标移除窗口,则方向键隐藏,播放恢复
7.图片自动播放
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>轮播图</title> </head> <body> <div id="focus"> <ul> <li><img src="img/703.jpg" alt=""></li><li><img src="img/704.jpg" alt=""></li><li><img src="img/705.jpg" alt=""></li><li><img src="img/706.jpg" alt=""></li> </ul> <ol></ol> <!-- 方向键标签 --> <a class="direction left" href="javascript:;"><</a> <a class="direction right" href="javascript:;">></a> </div> </body> </html>
注意
如果li元素不写在同一行即:
<li><img src="img/703.jpg" alt=""></li> <li><img src="img/704.jpg" alt=""></li> <li><img src="img/705.jpg" alt=""></li> <li><img src="img/706.jpg" alt=""></li>
这样写的话,当li的display属性改为inline-block时,图片与图片之间会有孔隙,如果不希望出现空隙,可以将li元素写在同一行,或者float改为left(建议改float)
<style> * { margin: 0; padding: 0; } #focus { width: 500px; height: 300px; margin: 50px auto; position: relative; border: 0px solid red; overflow: hidden; } ul { list-style: none; /* 此处为六张图片的总长度(通过js代码将第一张图片和最后一张复制了一份) */ width: 3000px; height: 300px; position: absolute; left: -500px; /* 过渡效果:使宽度缓慢变化(也可以在代码中添加) */ /* transition: all .3s; */ /* user agent stylesheet */ margin-block-start: 0em; margin-block-end: 0em; padding-inline-start: 0px; } ul li { width: 500px; height: 300px; /* 如果设置为inline-block/inline,则图片之间会有孔隙(2.5px),可将li元素写在同一行消除*/ /* display: inline-block; */ float: left; text-align: left; } ul li img { width: 500px; height: 300px; } ol { position: absolute; bottom: 10px; } ol li { display: inline-block; list-style: none; width: 10px; height: 10px; border-radius: 50%; outline: 1px solid #666; background-color: white; margin: 0 5px; } #focus ol li.current { background-color: red; } #focus .direction { background-color: #555; font-size: 14px; text-align: center; color: #eee; width: 4%; height: 10%; /* line-height设置为字体的两倍可实现垂直居中 */ line-height: 28px; text-decoration: none; position: absolute; opacity: 0.3; display: none; cursor: pointer; } #focus .left { left: 5px; } #focus .right { right: 5px; } </style>
<script> window.addEventListener("load", function () { // 获取元素对象 var focus = document.querySelector("#focus"); var ul = focus.children[0]; var ol = focus.children[1]; // 获取方向键元素对象 var direction = foucs.querySelectorAll(".direction"); // 获得focus的宽度和高度 var focus_width = focus.offsetWidth; var focus_height = focus.offsetHeight; // 创建图片的索引 var img_index = 0; // 设置节流阀开关 // 如果不设置节流阀,当短时间内多次点击方向键时,图片滚动还没结束就会开启下一次滚动 var flag = true; // (1)自动设置方向键的top direction[0].style.top = (focus_height - focus_height / 10) / 2 + "px"; direction[1].style.top = direction[0].style.top; // (2)自动生成小圆圈的个数和居中 for (var i = 0; i < ul.children.length; i++) { var li = document.createElement("li"); // 添加小圆圈的index属性,并赋值为i; li.index = i; ol.appendChild(li); }; ol.children[0].classList.add("current"); // 将current样式类赋给第一个小圆圈 ol.style.left = (focus_width - ol.offsetWidth) / 2 + "px"; // 居中 // (3)克隆左右两边的图片并添加到ul中(为实现无缝滚动) var newimg_1 = ul.children[0].cloneNode(true); var newimg_4 = ul.children[3].cloneNode(true); ul.appendChild(newimg_1); // 加入到ul的最后面 ul.insertBefore(newimg_4, ul.children[0]); // 在ul的最前方插入 // (4)鼠标经过focus显示方向键 focus.addEventListener("mouseenter", function () { direction[0].style.display = "block"; direction[1].style.display = "block"; // 鼠标移入移除定时器 clearInterval(timer); }) // (5)鼠标离开隐藏方向键 focus.addEventListener("mouseleave", function () { direction[0].style.display = "none"; direction[1].style.display = "none"; // 鼠标移除重新添加定时器 timer = setInterval(function(){ direction[1].click(); }, 2000); }) // (6)点击小圆圈实现小圆圈的样式变化,并让图片滚动切换 ol.addEventListener("click", function (e) { // console.log(e.currentTarget,e.target.tagName); // importerror --> if(e.target.tagName == "li"||"LI") 不生效,但不会报错 if (e.target.tagName == "LI" || e.target.tagName == "li") { // 将圆圈索引赋值给图片索引 img_index = e.target.index; console.log("图片索引"+img_index, "圆圈索引"+e.target.index); // // 把ol里带有current类名的li元素选出来,去掉类名 remove // ol.querySelector(".current").classList.remove("current"); // // 让当前的索引号的li元素加上current add // ol.children[img_index].classList.add("current"); // // 加上过渡效果 // ul.style.transition = 'all .2s'; // // ul的移动距离 = 小圆圈的索引*图片的宽度 + "px" // ul.style.left = -(e.target.index + 1) * focus_width + "px"; roll(img_index, true); } }) // (7)点击方向键实现图片滚动 direction[0].addEventListener("click", function(){ if(flag){ flag = false; // 节流阀关闭 img_index = ol.querySelector(".current").index; // 使小圆圈的索引与图片的索引一致 img_index--; if(img_index < 0) { // 当图片滚动到第一张时,继续向左滚动 roll_img(img_index, true) /// 滚动结束后将图片的索引设置为最后一张,此时显示的实际上是通过代码复制的最后一张图片,只是将它放到了第一张图片前面 img_index = 3; roll_circul(img_index) ul.addEventListener("transitionend", function(){ // 滚动结束后,关闭过渡效果显示 ul.style.transition = "none"; // 同时将ul的left值设置到刚好显示最后一张图片的位置上 // 因为实际不止四张图片,所以img_index要加1,这样才能刚好显示第四张图片 ul.style.left = -(img_index + 1) * focus_width + "px"; }); } else { roll(img_index, true); } ul.addEventListener("transitionend", function(){ // 动画结束则打开节流阀 flag = true; }); } }) direction[1].addEventListener("click", function(){ if(flag){ flag = false; // 节流阀关闭 img_index = ol.querySelector(".current").index; // 使小圆圈的索引与图片的索引一致 img_index++; if(img_index > 3) { roll_img(img_index, true) img_index = 0; roll_circul(img_index) ul.addEventListener("transitionend", function(){ ul.style.transition = "none"; ul.style.left = -(img_index + 1) * focus_width + "px"; }); } else { roll(img_index, true); } ul.addEventListener("transitionend", function(){ // 动画结束则打开节流阀 flag = true; }); } }) // (8)实现自动轮播 var timer = setInterval(function(){ // 自动播放可通过调用右方向键的点击事件实现 direction[1].click(); }, 2000) // 功能函数(emmmm封装的不是很好) function roll (index, bool) { // 把ol里带有current类名的li元素选出来,去掉类名 remove ol.querySelector(".current").classList.remove("current"); // 让当前的索引号的li元素加上current add ol.children[index].classList.add("current"); if (bool) { // 加上过渡效果 ul.style.transition = 'all .5s'; } else { ul.style.transition = "none"; } // ul的移动距离 = 小圆圈的索引*图片的宽度 + "px" ul.style.left = -(index + 1) * focus_width + "px"; } function roll_img(index, bool){ if (bool) { // 加上过渡效果 ul.style.transition = 'all .5s'; } else { ul.style.transition = "none"; } // ul的移动距离 = 小圆圈的索引*图片的宽度 + "px" ul.style.left = -(index + 1) * focus_width + "px"; } function roll_circul (index) { // 把ol里带有current类名的li元素选出来,去掉类名 ol.querySelector(".current").classList.remove("current"); // 让当前的索引号的li元素加上current ol.children[index].classList.add("current"); } }) </script>