JavaScript封装缓动动画函数

来源:互联网 发布:滨州行知中学电话 编辑:程序博客网 时间:2024/06/05 04:03

本文将从封装缓动动画的以下几个部分进行封装(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;     //当这个样式为空时设置为0,获取来的样式值要取整。        var step = (target - leader)/10;        step = step > 0 ? 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);        }    },25);}

封装多个属性

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)) || 0;            var step = (target - leader) / 10;            step = step > 0 ? 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);        }    },25);              }

缓动框架之回调函数

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)) || 0;                            var step = (json[k] - leader) / 10;                        step = step > 0 ? 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();                        }                }        },25);}//调用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 || 1;    //不能取整,先把它乘100            }else{                leader = parseInt(getStyle(ele,k)) || 0;               }                               var step = (json[k] - leader) / 10;             step = step > 0 ? Math.ceil(step) : Math.floor(step);            leader = leader + step;            if(k === "opacity"){                  ele.style[k] = leader/100;     //如果是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();            }        }    },30);}**//注意这里赋值的opacity要乘以100,如:30,100等**

作者:kuke_kuke
博客链接:http://blog.csdn.net/qq_33599109
欢迎关注支持,谢谢!