天天看點

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

歡迎關注支援,謝謝!

繼續閱讀