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;     //当这个样式为空时设置为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.youkuaiyun.com/qq_33599109
欢迎关注支持,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值