JavaScript实现缓动动画

JavaScript原生定时器实现动画的缓动效果
原理很简单通过定时器修改边距达到移动动画效果

实现速度的变化

缓动必然移动速度会有变化,这里需要用到一个小公式或者说算法?

移动单位 = (指定移动位置边距 - obj.offsetLeft) / 10;
var step = (ydpx - obj.offsetLeft) / 10;

有一个细节需要注意下:

移动的步数应该去掉小数,否者因为除法的原因无法移动到指定位置,会有一些差距
当step小于0对应的是向左移动舍去小数如:1.2 为1
大于0向右移动,进位,如:1.2为2
这应该是个数学问题
**

之后代码的实现就简单多了:

//ydjl:移动到指定位置  (obj.offsetLeft)
function animate(obj,ydpx) {
   //清除定时器  防止每一次调用都产生一个定时器,叠加导致问题(速度变快)
    clearInterval(obj.timer); 
    obj.timer=setInterval(function () {
        var step = (ydpx - obj.offsetLeft) / 10;   //移动距离
        //取整
        step = step>0 ? Math.ceil(step) : Math.floor(step);
        //判断是否移动到指定位置
        if(obj.offsetLeft == ydpx)
        {
        //清除定时器,停止移动
            clearInterval(obj.timer);
        }
        //修改left实现移动
        obj.style.left = obj.offsetLeft + step + 'px';

    },15)//移动间隔设置
}

下面是演示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .boks{
            position: absolute;
            top: 300px;
            left:0;
            width: 100px;
            height: 100px;
            background-color: #ff0011;
        }
    </style>

</head>
<body>
<button class="yd500">移动500px</button>
<button class="yd800">移动800px</button>
<div class="boks">hezi</div>
</body>
<script>
    function animate(obj,ydpx) {
        //清除定时器
       clearInterval(obj.timer);
        obj.timer=setInterval(function () {
            var step = (ydpx - obj.offsetLeft) / 10;
            step = step>0 ? Math.ceil(step) : Math.floor(step);
             if(obj.offsetLeft == ydpx)
             {
                 clearInterval(obj.timer);
             }
            obj.style.left = obj.offsetLeft + step + 'px';

        },15);
    }
    var yd500 = document.querySelector(".yd500");
    var yd800 = document.querySelector(".yd800");
    //盒子
    var boks = document.querySelector(".boks");

    yd500.addEventListener('click', function() {
        // 调用函数
        animate(boks, 500);  //传递要移动的对象 和 移动位置
    })

    yd800.addEventListener('click', function() {
        // 调用函数
        animate(boks, 800);  //传递要移动的对象 和 移动位置
    })
</script>
</html>

萌新小白的学习记录~
在这里插入图片描述在不取整的情况下

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值