老师上课讲的轮播图案例有时候左按钮失效问题

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

redTSH

2020-11-21 22:21:57

# 具体遇到的问题
根据老师上课讲的案例写的轮播图代码,在做测试的时候发现:


有的时候当在第0张图时,按左按钮却表现出按0.5s从左往右去到第4张图的动画,这种情况发生的频率不高,大概10次会触发一次,感觉像左按钮的0秒延时器偶尔失效的样子,请问这个问题要怎么解决?


另外我下载了老师的源代码测试,也是发现这种偶尔失效的表现。
# 报错信息的截图

# 相关课程内容截图

# 尝试过的解决思路和结果

# 粘贴全部相关代码,切记添加代码注释(请勿截图)

<!DOCTYPE html>

<html lang="en">


<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</title>

    <style>

        * {

            margin0;

            padding0;

        }


        .box {

            positionrelative;

            width650px;

            height360px;

            border1px solid #000;

            margin50px auto;

            overflowhidden;

        }


        .box ul {

            positionrelative;

            width5000px;

            list-stylenone;

            left0;

            /* transition: left .5s ease 0s; */

        }


        .box ul li {

            floatleft;

        }


        #leftbtn {

            positionabsolute;

            left10px;

            top50%;

            margin-top-25px;

            width50px;

            height50px;

            border-radius50%;

            background-colorpink;

        }


        #rightbtn {

            positionabsolute;

            right10px;

            top50%;

            margin-top-25px;

            width50px;

            height50px;

            border-radius50%;

            background-colorpink;

        }

    </style>

</head>


<body>

    <div id="box" class="box">

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

        <a href="javascript:;" id="leftbtn"></a>

        <a href="javascript:;" id="rightbtn"></a>

    </div>


    <script>

        var oBox = document.getElementById('box');

        var oList = document.getElementById('list');

        var leftBtn = document.getElementById('leftbtn');

        var rightBtn = document.getElementById('rightbtn');


        // 将第0张图片复制一张

        // 要用firstElementChild 否则得到空文本节点

        var new_li = oList.firstElementChild.cloneNode(true);

        // 上树

        oList.appendChild(new_li);


        // 定义图片标号

        var pic_pos = 0;


        // 定义节流锁标记

        var lock = true;


        // 右按钮点击事件

        rightBtn.onclick = function () {

            // 判断锁的状态,上了锁直接跳过

            if (!lockreturn;


            // 上锁,开始动画

            lock = false;

            // 添加动画,防止最后一张时清除了

            oList.style.transition = 'left .5s ease 0s';

            // 图片标号+1,改变left值

            pic_pos += 1;

            oList.style.left = pic_pos * -650 + 'px';

            // 判断是否为最后一张

            if (pic_pos == 5) {

                // 延时器为了让过渡动画跑完

                setTimeout(function () {

                    // 取消过渡属性以达到瞬间切换效果

                    oList.style.transition = 'none';

                    pic_pos = 0;

                    oList.style.left = pic_pos * -650 + 'px';

                }, 500);

            };

            // 延时0,5s动画结束,解锁

            setTimeout(function () {

                lock = true;

            }, 500);

        }


        // 左按钮事件

        leftBtn.onclick = function () {

            // 节流锁

            if (!lockreturn;

            // 上锁

            lock = false;

            oList.style.transition = 'none';

            // 判断是否为第0张图片

            if (pic_pos == 0) {

                // 先取消动画,瞬移到第0张的假身,即第5张

                oList.style.transition = 'none';

                // pic_pos = 5;

                oList.style.left = 5 * -650 + 'px';

                // 延时器为了产生异步,等瞬移结束了,按照动画要求过渡到第4张图片

                // 此时看起来就是从第0张缓慢移动到第4张

                setTimeout(function () {

                    oList.style.transition = 'left .5s ease 0s';

                    pic_pos = 4;

                    oList.style.left = pic_pos * -650 + 'px';

                }, 0);

            } else {

                oList.style.transition = 'left .5s ease 0s';

                pic_pos -= 1;

                oList.style.left = pic_pos * -650 + 'px';

            }

            // 动画结束解锁

            setTimeout(function () {

                lock = true;

            }, 500);

        };


    </script>

</body>


</html>


写回答

1回答

好帮手慕久久

2020-11-22

同学你好,由于幻灯片过渡切换的时候,实际所用的时间可能会超出500ms,比如501ms,而500ms按钮就会解锁,解锁后立即点击左按钮,会立刻切换下一张,此时会造成两张幻灯片的切换动作有重叠,从而造成效果偶尔不正确。可以通过增大解锁时间的方式来改善这个问题:

http://img.mukewang.com/climg/5fb9cb7f097c942805920186.jpg

该问题,同学了解即可,主要关注幻灯片的实现思路即可。实际开发中,会使用现成的插件,而插件一般不会出现这种bug。

祝学习愉快!

0

0 学习 · 15276 问题

查看课程