多值动画封装

在单值动画中,一次只能改变其中的单个量,比如left、width、height~~~
如果需要一次改变多的量,就需要传入多个变量,在多变量传输中,一般选择用数组或者json。这里选择用json的键值对便于程序的开发和维护。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {  margin: 0;  padding: 0;  }
        div{  width: 100px;  height: 100px;  background: red;  position: absolute;  }
    </style>
</head>
<body>
<button id="btn">开始动画</button>
<!--<button id="btn1">改变高度</button>-->
<div id="box"></div>
<script>
    window.onload = function () {
        function $(TagId){return document.getElementById(TagId);}
        var box=$("box");
        var btn=$("btn");
        var btn1=$("btn1");
        btn.onclick=function(){
            buffer(box,{width:400,left:400,height:400})
        };
        function buffer(obj,json){
            clearInterval(obj.timer);

                obj.timer = setInterval(function () {
                    for(var key in json ) {
                        var begin = parseInt(getCss(obj, key));
                        var target = parseInt(json[key]);
                        var speed = (target - begin) / 10;
                        speed = target > begin ? Math.ceil(speed) : Math.floor(speed);
                        begin = begin + speed;
                        box.style[key] = begin + "px";
                        if (begin == target) {
                            clearInterval(obj.timer)
                        }
                    }
                }, 20)
        }
        function getCss(obj,attr){
            if(obj.currentStyle){
                return  obj.currentStyle[attr];
            }else{
                return   window.getComputedStyle(obj,null)[attr];
            }
        }
    }
</script>
</body>
</html>
  • 在多值动画会存在一个问题:如果其中一个值在满足if (begin == target)条件后,会被立刻清空定时器。而停止动画,而其余只无法达到目标值。
利用布尔条件设置一个判定条件来将定时器清空
       function buffer(obj,json){
            clearInterval(obj.timer);
                obj.timer = setInterval(function () {
                    var flag=true;
                    for(var key in json ) {
                        var begin = parseInt(getCss(obj, key));
                        var target = parseInt(json[key]);
                        var speed = (target - begin) / 10;
                        speed = target > begin ? Math.ceil(speed) : Math.floor(speed);
                        begin = begin + speed;
                        box.style[key] = begin + "px";
                        if(begin!=target)
                        {flag=false;
                    }
                          if (flag==true) {
                            clearInterval(obj.timer)
                        }
                }, 20)
        }
  • 特殊情况考虑:函数回调;

在某些特殊情况下,动画需要复原,或者需要连续运动,会使用到一个函数回调的概念。

 function buffer(obj, json, fn) {
            clearInterval(obj.timer);
            obj.timer = setInterval(function () {
                var flag = true;
                for (var key in  json) {
                    var begin = parseInt(getCssAttr(obj, key));
                    var target = parseInt(json[key]);
                    var speed = (target - begin) * 0.2;
                    speed = target > obj.offsetLeft ? Math.ceil(speed) : Math.floor(speed);
                    obj.style[key] = begin + speed + 'px';
                    if (begin != target) {
                        flag = false;
                    }
                }
                if (flag == true) {
                    clearInterval(obj.timer);
                    if (fn) {
                        fn();
                    }
                }
            }, 20)
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • //获取屏幕滚动的宽高 functionscroll() { //判断是否是ie以及新的版本 if(window....
    加号_ZSL阅读 356评论 0 0
  • /** Created by Administrator on 2017/4/26.*/ /** 匀速运动框架 @...
    康轩阅读 128评论 0 0
  • 常见的取整函数的认识 向上取整函数如果是正数,那么向上取整得到的是绝对值大的如果是负数,那么向上取整得到的是绝对值...
    GodlinE阅读 139评论 0 0
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,110评论 1 10
  • 工作时没事做太痛苦 读研有一年了,可是每到工作汇报还是没有什么可以汇报的,唉,站在讲台前,两眼泪汪汪。我真的闲得蛋...
    星期二的下午白茫茫阅读 160评论 0 0