JS進階-運動

運動:
a). 連續(xù)不斷的走
for
定時器:setInterval();
b). 改變某一個屬性(left)
讓Div走一個

定時器的時間給30ms ?
a). 人的眼睛最容易接受
b). 時間給小一點,程序的性能開銷大

定時器的問題 ?
a). 不能設(shè)置太小的值
0 -> 其實不是0
b). 時間越小越不穩(wěn)定
c). 多標(biāo)簽打開瀏覽器,定時器在背景的標(biāo)簽里面執(zhí)行變慢了

運動:
多長時間 -> 已知
總時間:1000

起點,終點 -> 已知

總距離:終點-起點

多長時間走一次 30ms

總次數(shù):總時間/30
1000/30
把一個數(shù)變成整數(shù) ?
a). parseInt();
b). Math.floor(); √ 用floor性能最優(yōu)
c). Math.ceil();
d). Math.round();

一次能走多少 ?
總距離/總次數(shù)

現(xiàn)在走到哪里了 ?:n*總距離/總次數(shù)
鏈?zhǔn)竭\動:
判斷第一次運動完成 ?
回調(diào)函數(shù)
move(oDiv,'width',400,1000,complete);

運動形式:
    勻速運動:'linear'
    var a = n/count;
        var cur = start[name] + dis[name] * a;
    加速運動:'ease-in'
    var a = n/count;
    var cur = start[name] + dis[name] * a*a*a;
    減速(緩沖)運動:'ease-out'
    var a = 1 - n/count;
    var cur = start[name]+dis[name]*(1-a*a*a);

運動框架(封裝的函數(shù)):
a). 通用性
b). 方便
最后封裝的運動框架:move(oDiv,json,options);

options:可選json{}
duration
easing
complete

代碼

// ojb : 物體 ,json :要改變的屬性, duration 總時間 ,easing 運動形式 ,complete: 鏈?zhǔn)竭\動回調(diào)函數(shù)  
function getStyle(obj,name) {
    return (obj.currentStyle || getComputedStyle(obj,false))[name];
}

function move(obj,json,options) {
    options = options || {}
    options.duration = options.duration || 500;
    options.easing = options.easing || 'ease-out';
    
    clearInterval(obj.timer); // 定時器先關(guān)后開
     //總次數(shù)
    var count = Math.floor(options.duration/30);
    var start = {}; // 起點
    var dis = {}; // 總距離
    // 循環(huán)獲取起點位置 ,然后計算出總距離
    for (var name in json) {
        start[name] = parseFloat(getStyle(obj,name));
        // 總距離 = 終點 - 起點
        dis[name] = json[name] -start[name];
    };
    var n =0; //當(dāng)前已經(jīng)走了多少次了
    obj.timer = setInterval(function () {
        n++;
        //循環(huán)讓所有的屬性改變
        for (var name in json) {
            // 根據(jù)運動形式 計算每次走的距離
            switch(options.easing){
                case 'linear': //勻速
                    var a = n/count;
                    var cur = start[name] + dis[name]*a;
                
                    break;
                case 'ease-in': // 加速
                    var a = n/count;
                    var cur =start[name] + dis[name] *a*a*a;
                    break;
                case 'ease-out': // 緩沖
                    var a = 1- n/count;
                    var cur = start[name] + dis[name]*(1-a*a*a);
                    break;  
            }
            //設(shè)置樣式
            if ( name = 'opacity') {
                obj.style.opacity = cur;
                obj,style.filter = 'alpha(opacity:'+cur*100+')';
            } else {
                obj.style[name] = cur + 'px';   
            }   
        }   
            //判斷當(dāng)前走的次數(shù)跟總是是否相等,相等表示已經(jīng)走完了
            if (n == count) {
                clearInterval(obj.timer);
                //回調(diào)鏈?zhǔn)竭\動函數(shù)
                options.complete && options.complete();
            }
    },30);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容