匀速动画案例

先搭架子:

        * {
            margin: 0;
            padding: 0;
        }
        
        .box {
            width: 100px;
            height: 100px;
            background: red;
        }
        
        .line1,
        .line2 {
            width: 500px;
            height: 20px;
            background: blue;
        }
        
        .line2 {
            width: 200px;
            background: purple;
        }

    <button id="start1">开始到500</button>
    <button id="start2">开始到200</button>
    <button id="end">结束</button>
    <div class="box"></div>
    <div class="line1"></div>
    <div class="line2"></div>

设计逻辑结构:

        //1.获取需要操作的元素
        const satrtBtn1 = document.querySelector("#start1");
        const satrtBtn2 = document.querySelector("#start2");
        const endBtn = document.querySelector("#end");
        const oBox = document.querySelector(".box");
        let timer = null;

        //2.监听按钮点击
        /*
        satrtBtn1.onclick = function() {
            clearInterval(timer);
            //0.定义变量 记录终点的位置
            const target = 500;
            timer = setInterval(function() {
                //1.拿到元素当前的位置
                let begin = parseInt(oBox.style.marginLeft) || 0;
                //2.定义变量记录步长
                let step = 13;
                //3.计算新的位置
                begin += step;

                // if (begin >= target) {或
                if ((target - begin) <= step) {
                    clearInterval(timer);
                    begin = target; //复位
                }

                //4.重新设置元素的位置
                oBox.style.marginLeft = begin + "px";
            }, 100);
        };

        satrtBtn2.onclick = function() {
            clearInterval(timer);
            //0.定义变量 记录终点的位置
            const target = 200;
            timer = setInterval(function() {
                //1.拿到元素当前的位置
                let begin = parseInt(oBox.style.marginLeft) || 0;
                //2.定义变量记录步长
                let step = -13;
                //3.计算新的位置
                begin += step;

                // console.log(Math.abs(target - begin), Math.abs(step));

                // if (begin >= target) {或
                if (Math.abs(target - begin) <= Math.abs(step)) {
                    clearInterval(timer);
                    begin = target; //复位
                }

                //4.重新设置元素的位置
                oBox.style.marginLeft = begin + "px";
            }, 100);
        };
        */

        endBtn.onclick = function() {
            clearInterval(timer);
        };

        satrtBtn1.onclick = function() {
            linearAnimation(oBox, 500);
        };

        satrtBtn2.onclick = function() {
            linearAnimation(oBox, 200);
        };

        //封装方法
        function linearAnimation(ele, target) {

            clearInterval(timer);

            timer = setInterval(function() {
                //1.拿到元素当前的位置
                let begin = parseInt(ele.style.marginLeft) || 0;

                //2.定义变量记录步长
                /*
                0-500=-500 12
                500-200=300 -12
                */
                let step = (begin - target) > 0 ? -13 : 13;
                //3.计算新的位置
                begin += step;

                // if (begin >= target) {或
                if ((target - begin) <= step) {
                    clearInterval(timer);
                    begin = target; //复位
                }

                //4.重新设置元素的位置
                ele.style.marginLeft = begin + "px";
            }, 100);
        }

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白小白从不日白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值