跑马灯轮播特效
来源:6-3 编写跑马灯轮播图特效
卷毛奋斗中
2022-07-06 09:26:31
<!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>Document</title> <style> * { margin: 0; padding: 0; } #banner { position: relative; width: 650px; height: 360px; border: 1px solid #000; margin: 50px auto; overflow: hidden; } #banner ul { position: relative; list-style: none; width: 6000px; transition: all .5s ease 0s; } #banner ul li { float: left; } #banner button { display: block; width: 50px; height: 50px; border-radius: 50%; background-color: rgb(80, 182, 242); outline: none; user-select: none; cursor: pointer; border: 0; position: absolute; top: 50%; margin-top: -25px; font-size: 24px; color: rgb(224, 224, 224); font-weight: 400; text-align: center; } #banner button.leftbtn { left: 20px; } #banner button.rightbtn { right: 20px; } </style> </head> <body> <div id="banner"> <ul id='list'> <li><img src="./images/beijing/0.jpg" alt=""></li> <li><img src="./images/beijing/1.jpg" alt=""></li> <li><img src="./images/beijing/2.jpg" alt=""></li> <li><img src="./images/beijing/3.jpg" alt=""></li> <li><img src="./images/beijing/4.jpg" alt=""></li> </ul> <button id='leftbtn' class="leftbtn"><</button> <button id='rightbtn' class="rightbtn">></button> </div> <script> //获取元素 let leftbtn = document.getElementById('leftbtn'); let rightbtn = document.getElementById('rightbtn'); let list = document.getElementById('list'); //克隆第一张图片 let cloneli = list.firstElementChild.cloneNode(true); //上树 list.append(cloneli); //定义当前ul显示到第几张了,从0开始数 let index = 0; //节流锁 let lock = true; //右按钮事件监听 rightbtn.onclick = function () { //判断锁的状态 if (!lock) return; lock = false; //给list加过渡,为什么要加?因为最后一张图片会把过渡去掉 list.style.transition = 'left .5s ease 0s'; index++; //判断 if (index > 4) { //设置延时器,延时器的功能是将ul瞬间拉回0的位置 setTimeout(function () { //取消过渡,因为是瞬间移动,不是‘咕噜’回去 list.style.transition = 'none'; list.style.left = 0; index = 0; }, 500); } list.style.left = -index * 650 + 'px'; setTimeout(function () { lock = true; }, 500); } //左边按钮监听 leftbtn.onclick = function () { //判断锁的状态 if (!lock) return; lock = false; //判断是不是第0张,如果是,瞬间用假的替换真的 if (index === 0) { //取消过渡,因为是瞬间移动,不是‘咕噜’回去 list.style.transition = 'none'; list.style.left = -index * 650 + 'px'; //设置一个延时器,这个延时器虽然是0毫秒,但是可以让我们过渡先是瞬间取消,再加上 setTimeout(function () { //加过渡 list.style.transition = 'left .5s ease 0s'; //index改为真正的最后一张图片编号 index = 4; list.style.left = -index * 650 + 'px'; }, 0); } else { index--; list.style.left = -index * 650 + 'px'; } setTimeout(function () { lock = true; }, 500); } </script> </body> </html>
为什么点击右按钮第一张没有过渡呢?
左按钮 index === 0 的时候为什么是咕噜回去的?
1回答
好帮手慕小李
2022-07-06
同学你好,解答如下:
1、当第一次点击右侧按钮时,才给list的transition赋值,所以第一次点击时没有过渡效果,优化建议如下:
将transition与left在页面渲染时就先赋值。
2、因为过渡都是按照left执行的,所以才会有回滚的效果出现,优化思路如下:
既然无缝滚动是指当右点击的时候克隆一张第一张图片,那么往左点击是不是可以克隆一张最后的图片添加到第一个元素中,然后我们将index从0变道1,当向左点击时我们判断index是否等于0,当等于0的时候那么就滚动到了克隆好的最后一张上去了。代码如下,仅供参考:
<script>
//获取元素
let leftbtn = document.getElementById('leftbtn');
let rightbtn = document.getElementById('rightbtn');
let list = document.getElementById('list'); //克隆第一张图片
let cloneli = list.firstElementChild.cloneNode(true); //上树
let cloneli2 = list.lastElementChild.cloneNode(true); //上树
console.log(cloneli2)
list.append(cloneli);
list.prepend(cloneli2);
let index = 1;
let lock = true;
list.style.transition = 'left .5s ease 0s';
list.style.left = "-650px";
rightbtn.onclick = function() {
//判断锁的状态
if (!lock) return;
lock = false;
//给list加过渡,为什么要加?因为最后一张图片会把过渡去掉
list.style.transition = 'left .5s ease 0s';
index++; //判断
if (index > 4) {
//设置延时器,延时器的功能是将ul瞬间拉回0的位置
setTimeout(function() { //取消过渡,因为是瞬间移动,不是‘咕噜’回去
list.style.transition = 'none';
list.style.left = '-650px';
index = 1;
}, 500);
}
list.style.left = -index * 650 + 'px';
setTimeout(function() {
lock = true;
}, 500);
} //左边按钮监听
leftbtn.onclick = function() { //判断锁的状态
if (!lock) return;
lock = false;
index--;
list.style.transition = 'left .5s ease 0s';
list.style.left = -index * 650 + 'px';
if (index == 0) {
setTimeout(function() {
list.style.transition = 'none';
index = 4;
list.style.left = -index * 650 + 'px';
}, 500);
} else {
list.style.left = -index * 650 + 'px';
}
setTimeout(function() {
lock = true;
}, 500);
}
</script>
祝学习愉快!
相似问题