天天看点

JavaScript封装缓动动画函数

本文将从封装缓动动画的以下几个部分进行封装(1、单个属性,2、多个属性,3、缓动框架之回调函数,4、缓动框架之层级与透明度)

首先:获取元素样式的兼容方式

function getStyle(ele,attr){            //获取任意类型的CSS样式的属性值
    if(window.getComputedStyle){        
        return window.getComputedStyle(ele,null)[attr];
    }
    return ele.currentStyle[attr];
}
           

封装单个属性

function animate(ele,attr,target){     //元素(box)  样式(left) 目标值(400)
    clearInterval(ele.timer);         //使用定时器时,先清除定时器,防止多个定时器并行
    ele.timer = setInterval(function(){
        //先定义一个当前值
        var leader = parseInt(getStyle(ele,attr)) || ;     //当这个样式为空时设置为0,获取来的样式值要取整。
        var step = (target - leader)/;
        step = step >  ? Math.ceil(step) : Math.floor(step);
        leader = leader + step;
        ele.style[attr] = leader + "px";         //注意设置元素样式,注意加单位
        if(Math.abs(target-leader) <= Math.abs(step)){
            ele.style[attr] = target + "px";
            clearInterval(ele.timer);
        }
    },);
}
           

封装多个属性

function animate(ele,json){     //把样式和目标值放在json中,如:var json = {"left":10,"top":200,"width":300,"height":200}    
    clearInterval(ele.timer);
    ele.timer = setInterval(function(){
        //开闭原则,目的保证所有样式都到达目标值
        var bool = true;
        // 分别单独处理json;
        for(k in json){
            var attr = k;    //这里的k即上文中的样式
            var target = json[k];    //这里的json[k]即上文中的目标值,熟练后直接写k,json[k]。
            var leader = parseInt(getStyle(ele,attr)) || ;
            var step = (target - leader) / ;
            step = step >  ? Math.ceil(step) : Math.floor(step);
            leader = leader + step;
            ele.style[attr] = leader + "px";

            //如果使用上文中清除定时器的方式,则完成了一个json内容就清除了定时器,显然不能这么做
            // if(Math.abs(target - leader) <= Math.abs(step)){
                //  ele.style[attr] = target + "px";
                //  clearInterval(ele.timer);
            // }
            if(target !== leader){    //依据上文定义的bool,遍历json时当有一个样式未完成,则bool值依旧为false。
                bool = false;
            }
        }

        //只有所有属性样式都到了指定位置,bool值才变成true
        if(bool){    
            clearInterval(ele.timer);
        }
    },);              
}
           

缓动框架之回调函数

function animate(ele,json,fn){
        clearInterval(ele.timer);
        ele.timer = setInterval(function(){
                var bool = true;
                for(k in json){             
                        var leader = parseInt(getStyle(ele,k)) || ;    
                        var step = (json[k] - leader) / ;
                        step = step >  ? Math.ceil(step) : Math.floor(step);
                        leader = leader + step;
                        ele.style[k] = leader + "px";
                        if(json[k] !== leader){
                                bool = false;
                        }
                }
                if(bool){
                        clearInterval(ele.timer);
                        if(fn){          //此处如果有函数,则掉用,如果没有则自动不执行,当然也可加个判断,if(typeof fn == "function"),当fn类型为函数时。
                                fn();
                        }
                }
        },);
}

//调用
animate(box,json,function(){           //这里的function是一整个函数体,所以上文中的fn要加();
        animate(box,json1,function(){         //当执行完第一个缓动动画时,有function则继续执行。
                animate(box,json);
        });
});
           

缓动框架之层级与透明度

function animate(ele,json,fn){
    clearInterval(ele.timer);
    ele.timer = setInterval(function(){
        var bool = true;
        for(k in json){
            var leader;
            if(k === "opacity"){      //如果属性为opacity
                leader = getStyle(ele,k) *  || ;    //不能取整,先把它乘100
            }else{
                leader = parseInt(getStyle(ele,k)) || ;   
            }                   
            var step = (json[k] - leader) / ; 
            step = step >  ? Math.ceil(step) : Math.floor(step);
            leader = leader + step;
            if(k === "opacity"){  
                ele.style[k] = leader/;     //如果是opacity,赋值时在除以100
                ele.style.filter = "alpha(opacity="+leader+")";     //兼容IE
            }else if(k === "zIndex"){
                ele.style[k] = leader;      //直接赋值就是了,不用加单位
            }else{
                ele.style[k] = leader + "px";
            }
            if(json[k] !== leader){
                bool = false;
                console.log(leader);
            }
        }
        if(bool){
            clearInterval(ele.timer);
            if(fn){
                fn();
            }
        }
    },);
}
**//注意这里赋值的opacity要乘以100,如:30,100等**
           

作者:kuke_kuke

博客链接:http://blog.csdn.net/qq_33599109

欢迎关注支持,谢谢!

继续阅读