美文网首页Web前端之路
JavaScript动画6-同时运动

JavaScript动画6-同时运动

作者: 你好星期四 | 来源:发表于2017-05-01 14:15 被阅读168次

    系列文章导航

    JavaScript动画1-速度动画
    JavaScript动画2-缓冲运动
    JavaScript动画3-多物体运动
    JavaScript动画4-任意属性值
    JavaScript动画5-链式运动
    JavaScript动画6-同时运动
    所有源代码

    同时运动

    如果我们想要同时改变元素的宽度和高度,前面的代码就不能实现了。

    change(div, "width", 400);
    change(div, "height", 400);
    

    结果是,div只改变了height,并没有改变width,因为change函数一进去就clearInterval(obj.timer),把div的定时器清除了。

    我们需要想其他办法。这里用到了json。

    这里我们设计成这样的形式:

    animate(div, {width: 200, height: 200, opacity: 100},function(){
        alert("Finished!");
    });
    

    我们把上一节课的change函数改名为animate,更为贴切。把需要改变的属性通过一个json的形式传进animate函数,然后在函数内依次遍历json中的属性,就可以实现同时改变多个属性了。

    当然,不可能真正做到同时改变多个属性,但在极短的时间内,依次改变多个属性,每个属性只改变一点点,这样就能在宏观上造成多个属性同时改变的错觉。

    我们来看一下最终完成的animate函数:

    function animate(obj, attrs, fn) {
        if (obj.timer) {
            clearInterval(obj.timer);
        }
    
        obj.timer = setInterval(function () {
            var allCompleted = true;
            for (var attr in attrs) {
                //取得当前值
                var currentValue = 0;
                if (attr == 'opacity') {
                    currentValue = Math.round((parseFloat(getStyle(obj, attr)) * 100));
                } else {
                    currentValue = parseInt(getStyle(obj, attr));
                }
    
                //计算速度
                var speed = (attrs[attr] - currentValue) / 10; //缓冲运动
                speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
    
                //检测停止
                if (currentValue != attrs[attr]) {
                    allCompleted = false;
                }
                if (attr == 'opacity') {
                    obj.style.opacity = (currentValue + speed) / 100;
                } else {
                    obj.style[attr] = currentValue + speed + 'px';
                }
            }
    
            if (allCompleted) { //只有当所有的属性都完成,才清除定时器
                clearInterval(obj.timer);
                if (fn) {
                    fn();
                }
            }
        }, 30);
    }
    
    

    大部分代码都是相同的,最不同的地方是我们在定时器内加入了一个循环,依次遍历json中的属性,这样才能做到多个属性同时改变。

    值得注意的是,我们设置了一个allCompleted的布尔值,只有当所有属性值都完成的时候,才清除定时器,这样才不会造成“只有一个属性完成,其他属性才完成一半,定时器就被清除了”的情况出现。

    调用也非常简单:

    var div8 = document.getElementById("div8");
    div8.onmouseover = function () {
        var _this = this;
        animate(_this, {width: 400, height: 400, opacity: 50}, function () {
            alert("hello");
        });
    };
    
    div8.onmouseout = function () {
        var _this = this;
        animate(_this, {width: 200, height: 200, opacity: 100});
    };
    
    

    完成的效果图:

    JS动画演示10

    相关文章

      网友评论

        本文标题:JavaScript动画6-同时运动

        本文链接:https://www.haomeiwen.com/subject/lsgftxtx.html