封装动画函数

499 阅读1分钟
function animate(element,json,fn){
    clearInterval(element.timer);
    element.timer=setInterval(function(){
        var flag=true;//默认,假设全部到达目标
        for(var attr in json){
            //判断这个属性attr中是不是opacity
            if(attr=="opacity"){
                //获取元素当前的透明度,当前透明度放大100倍
                var current=getStyle(element,attr)*100;
                //目标的透明度 放大100倍
                var target=json[attr]*100;
                var step=(target-current)/10;
                step=step>0?Math.ceil(step):Math.floor(step);
                current+=step;
                //缩小100倍
                element.style[attr]=current/100;
            }else if(attr=="zIndex"){//判断这个属性attr中是不是zIndex
                //层级改变就是直接改变这个属性的值
                element.style[attr]=json[attr];
            }else{//普通属性
                var current=parseInt(getStyle(element,attr));
                //当前的属性对应的目标值
                var target=json[attr];
                var step=(target-current)/10;
                step=step>0?Math.ceil(step):Math.floor(step);
                current+=step;
                element.style[attr]=current+"px";
            }

            //只要有一个值到目标就停止了
            if(current!=target){
                flag=false;
            }
        }
        if(flag){
            clearInterval(element.timer);
            //所有属性到达目标才能使用这个函数,前提是用户传入了这个函数 
            if(fn){
                fn();
            }
        }

        //测试代码:
        console.log("目标位置:"+target+",当前位置:"+current+",每次移动步数:"+step);
    },20);
}


//任意一个元素的任意一个样式属性值
function getStyle(element,attr){
    //判断浏览器是否支持这个方法
    return window.getComputedStyle?window.getComputedStyle(element,null)[attr]:element.currentStyle[attr];
}