跑马灯轮播特效

来源: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">&lt;</button>
<button id='rightbtn' class="rightbtn">&gt;</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>
  1. 为什么点击右按钮第一张没有过渡呢?

  2. 左按钮 index === 0 的时候为什么是咕噜回去的?

写回答

1回答

好帮手慕小李

2022-07-06

同学你好,解答如下:

1、当第一次点击右侧按钮时,才给list的transition赋值,所以第一次点击时没有过渡效果,优化建议如下:

https://img.mukewang.com/climg/62c4ea30093009ef10060666.jpg

将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>

祝学习愉快!

0

0 学习 · 17877 问题

查看课程