跑马灯轮播特效
来源: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>
祝学习愉快!
相似问题