为啥轮播图得用图片计数的变量idx,而那个动画用普通的变量去改变left值就行?

来源:6-3 编写跑马灯轮播图特效

张小阳_

2022-07-13 17:18:41

<!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>
    <style>
        * {
            padding: 0;
            margin: 0;
            list-style: none;
            text-decoration: none;
        }

        .carousel {
            width: 650px;
            height: 360px;
            margin: 0 auto;
            position: relative;
            overflow: hidden;
        }

        .carousel ul {
            width: 6000px;
            position: absolute;
            left: 0;
            transition: left 1s ease-in-out;
        }

        .carousel ul li {
            float: left;
        }

        .carousel .leftBtn {
            width: 30px;
            height: 30px;
            border-radius: 50%;
            position: absolute;
            left: 15px;
            top: 50%;
            margin-top: -15px;
            text-align: center;
            line-height: 30px;
            font-size: 20px;
            background-color: rgba(0, 0, 0, .2);
        }

        .carousel .rightBtn {
            width: 30px;
            height: 30px;
            border-radius: 50%;
            position: absolute;
            right: 15px;
            top: 50%;
            margin-top: -15px;
            text-align: center;
            font-size: 20px;
            background-color: rgba(0, 0, 0, .2);
        }

        .carousel a:hover {
            background-color: rgba(0, 0, 0, .4);
        }
    </style>
</head>

<body>
    <div class="carousel">
        <ul>
            <li><img src="./images/0.jpg" alt=""></li>
            <li><img src="./images/1.jpg" alt=""></li>
            <li><img src="./images/2.jpg" alt=""></li>
            <li><img src="./images/3.jpg" alt=""></li>
            <li><img src="./images/4.jpg" alt=""></li>
        </ul>
        <a class="leftBtn" id="leftBtn" href="javascript:;">&lt;</a>
        <a class="rightBtn" id="rightBtn" href="javascript:;">&gt;</a>
    </div>

    <script>
        var leftBtn = document.getElementById('leftBtn');
        var rightBtn = document.getElementById('rightBtn');
        var ul = document.querySelector('.carousel ul');
        // 克隆第一张图
        var cloneImg = ul.firstElementChild.cloneNode(true);
        ul.appendChild(cloneImg);
        // 表示显示到第几张图,从0开始!
        var idx = 0;
        var lock = true;    //节流锁
        rightBtn.onclick = function () {        //先过渡到假图上,再瞬间定位到正常图上
            if (!lock) return;
            ul.style.transition = 'left 1s ease-in-out';    //把失去的过渡,再次添加上
            idx++;
            if (idx > 4) {
                setTimeout(function () {        //给它跳到假图的时间,然后瞬间定位到第一张
                    idx = 0;
                    ul.style.left = 0;
                    ul.style.transition = 'none';
                }, 1000);
            }
            ul.style.left = -idx * 650 + 'px';
            lock = false;
            setTimeout(function () {
                lock = true;
            }, 1000);
        };

        // 先瞬间定位到假图上,再过渡到正常图上
        leftBtn.onclick = function () {
            if (!lock) return;
            if (idx == 0) {
                idx = 5;
                ul.style.left = -idx * 650 + 'px';
                ul.style.transition = 'none';
                // 将过度添加上
                setTimeout(function () {
                    ul.style.transition = 'left 1s ease-in-out';
                    idx = 4;
                    ul.style.left = -idx * 650 + 'px';
                }, 0);
            } else {
                idx--;
                ul.style.left = -idx * 650 + 'px';
            }
            lock = false;
            setTimeout(function () {
                lock = true;
            }, 1000);
        };
    </script>
</body>

</html>
<!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>
    <style>
        * {
            padding: 0;
            margin: 0;
            list-style: none;
        }

        #box {
            width: 1000px;
            height: 146px;
            margin: 20px auto;
            border: 2px solid #333;
            overflow: hidden;
        }

        #box ul {
            width: 2500px;
            position: relative;
            left: 0;
        }

        #box ul li {
            float: left;
        }

        #box ul li img {
            width: 200px;
        }
    </style>
</head>

<body>
    <div id="box">
        <ul id="list">
            <li><img src="./images/logo_img_0.png" alt=""></li>
            <li><img src="./images/logo_img_1.png" alt=""></li>
            <li><img src="./images/logo_img_2.png" alt=""></li>
            <li><img src="./images/logo_img_3.png" alt=""></li>
            <li><img src="./images/logo_img_4.png" alt=""></li>
            <li><img src="./images/logo_img_5.png" alt=""></li>
        </ul>
    </div>

    <script>
        // 复制一份
        var list = document.getElementById('list');
        list.innerHTML += list.innerHTML;
        // 运行函数
        move();
        var leftMove = 0;
        var timer;
        function move() {
            timer = setInterval(function () {
                leftMove -= 3;
                list.style.left = leftMove + 'px';
                if (leftMove <= - 1200) {
                    leftMove = 0;
                }
            }, 20);
        };
        // 移入停止
        var box = document.getElementById('box');
        box.onmouseenter = function () {
            clearInterval(timer);
        };
        // 移出继续运行
        box.onmouseleave = function () {
            move();
        };
    </script>
</body>

</html>

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

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

它俩有啥区别?

可以通用吗?


写回答

1回答

imooc_慕慕

2022-07-13

同学你好,两者的效果不同,前者是涉及到左右按钮的相关效果;当点击左右按钮的时候需要确定当前ul显示到第几张了,从0张开始,当点击右按钮的时候设置延时器,延时器的功能就是将ul瞬间拉回0的位置,然后监听左按钮判断是不是第0张,如果是,就要瞬间用假的替换真的;

后者是无缝轮播,效果当鼠标移入的时候轮播停止,当移出的时候,继续动画,不需要复杂的思路;

但是两者的思想是 一样的,需要去获取移动的距离;

可以根据效果,自行选择实现方式;

祝学习愉快~

0

0 学习 · 17877 问题

查看课程