JavaScript 多属性缓冲运动

JavaScript 多属性缓冲运动

//动画函数
function animate(dom, obj, callback) {
    for (var attr in obj) {
        if (attr === 'opacity') {
            var current = parseInt(getComputedStyle(dom, null)[attr] * 100);
            var target = obj[attr] * 100;
        } else if (attr.indexOf('scroll') !== -1) {
            var current = dom[attr];
            var target = obj[attr];
        } else {
            var current = parseInt(getComputedStyle(dom, null)[attr]);//去掉单位
            var target = obj[attr];
        }
        obj[attr] = {//获取要运动属性的初始值和目标值
            current: current,
            target: target
        }
    }
    clearInterval(dom.timer)//启动定时器之前清除上一个定时器
    dom.timer = setInterval(function () {
        var index = 0;//记录剩下的属性
        for (var key in obj) {
            var current = parseInt(obj[key].current);
            var target = obj[key].target;
            var speed = (target - current) / 10 >= 0 ? Math.ceil((target - current) / 10) : Math.floor((target - current) / 10);
            //计算每一次需要运动的距离,大于0向上取整,小于0向下取整
            if (Math.abs(target - current) <= Math.abs(speed)) {
                //临界值判断,剩下要运动的小于本次需要运动的,该属性运动结束,属性直接等于目标值。
                if (key === 'opacity') {
                    dom.style[key] = target / 100;
                } else if (attr.indexOf('scroll') !== -1) {
                    dom[key] = target;
                } else {
                    dom.style[key] = target + 'px';
                }
                delete obj[key];//运动结束删除对应属性
                for (var item in obj) {
                    index++;//记录剩余属性
                }
                if (!index) {//如果剩余属性为0,说明整体运动结束,清除定时器,执行回调函数
                    clearInterval(dom.timer);
                    typeof callback === 'function' ? callback() : ''
                }
            } else {
                obj[key].current += speed;
                if (key === 'opacity') {
                    dom.style[key] = current / 100;
                } else if (attr.indexOf('scroll') !== -1) {
                    dom[key] = current;
                } else {
                    dom.style[key] = current + 'px';
                }
            }
        }
    }, 20)
}

调用示例

<!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>
        *{
            margin: 0;
            padding: 0;
        }
        body,html{
            height: 3000px;
        }
        .box{
            width: 80px;
            height: 180px;
            background-color: pink;
            border-radius: 10px;
            position: absolute;
            right:10px;
        }
    </style>
</head>
<body>
    <div class="box"></div>
    <script src="./js/tool.js"></script>
    <script>
        var box = document.querySelector(".box");
        
        window.onscroll = function(ev){ 
            var e = ev || event;  
             var s_top = document.body.scrollTop || document.documentElement.scrollTop;
             animate(box,{top:s_top + document.documentElement.clientHeight/2-box.offsetHeight/2})
        }
    </script>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/evail_/article/details/107619086
今日推荐