Javascript 完美運動框架(逐行分析代碼,讓你輕松了運動的原理)
大家一聽這名字就知道,有了這套框架 網(wǎng)上的效果基本都是可以實現(xiàn)的。實際上之前的運動框架還是有局限性的,就是不能讓好幾個值一塊運動。
那這個問題怎么解決呢? 我們先來看看之前的運動框架
function getStyle(obj, name) { if (obj.currentStyle) { return obj.currentStyle[name]; } else { return getComputedStyle(obj, null)[name]; } } function startMove(obj, attr, iTarget) { clearInterval(obj.time); obj.time = setInterval(function() { var cur = 0; if (attr == 'opacity') { cur = Math.round(parseFloat(getStyle(obj, attr)) * 100); } else { cur = parseInt(getStyle(obj, attr)); } var speed = (iTarget - cur) / 6; speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); if (cur == iTarget) { clearInterval(obj.time); } else { if (attr == 'opacity') { obj.style.filter = 'alpha(opacity=' + cur + speed + ')'; obj.style.opacity = (cur + speed) / 100; } else { obj.style[attr] = cur + speed + 'px'; } } }, 30); }
怎么修改呢? 實際上很簡單, 在過去的框架中,你每一次只能傳一個樣式,和一個值。那么現(xiàn)在把這些改成一個json對象。相信大家就明白了。
我們調(diào)用的時候就是startMove(oDiv,{width:200,height:200}); 如果需要的話就在加上回調(diào)函數(shù)。那么我們具體看看代碼是怎么修改的。
function startMove(obj, json, fnEnd) { var MAX=18; //每次調(diào)用就只有一個定時器在工作(開始運動時關(guān)閉已有定時器) //并且關(guān)閉或者開啟都是當前物體的定時器,已防止與頁面上其他定時器的沖突,使每個定時器都互不干擾 clearInterval(obj.timer); obj.timer=setInterval(function (){ var bStop=true; // 假設(shè):所有的值都已經(jīng)到了 for(var name in json) { var iTarget=json[name]; // 目標點 //處理透明度,不能使用parseInt否則就為0了 if(name=='opacity') { // *100 會有誤差 0000007 之類的 所以要用 Math.round() 會四舍五入 var cur=Math.round(parseFloat(getStyle(obj, name))*100); } else { var cur=parseInt(getStyle(obj, name)); // cur 當前移動的數(shù)值 } var speed=(iTarget-cur)/5; // 物體運動的速度 數(shù)字越小動的越慢 /5 : 自定義的數(shù)字 speed=speed>0?Math.ceil(speed):Math.floor(speed); if(Math.abs(speed)>MAX)speed=speed>0?MAX:-MAX; if(name=='opacity') { obj.style.filter='alpha(opacity:'+(cur+speed)+')'; //IE obj.style.opacity=(cur+speed)/100; //ff chrome } else { obj.style[name]=cur+speed+'px'; } // 某個值不等于目標點 if(cur!=iTarget) { bStop=false; } } // 都達到了目標點 if(bStop) { clearInterval(obj.timer); if(fnEnd) //只有傳了這個函數(shù)才去調(diào)用 { fnEnd(); } } }, 20); }
為什么會有bstop的假設(shè)呢?
其實如果我這樣調(diào)用startMove(oDiv,{width:101,height:200}); 寬度變成101 已經(jīng)完成運動了,高度沒有到, 但是我們可能已經(jīng)關(guān)閉了當前的定時器。運動已經(jīng)結(jié)束了,就會出現(xiàn)一個特殊情況下的bug。解釋一下:
實際上來說,需要所有的運動都到了才關(guān)閉定時器,反過來說,如果沒有不到的,那就關(guān)閉。在程序上就是定義一個布爾值,一開始為true,假設(shè)
所有的值都已經(jīng)到了,如果說有一個值不等于目標點,bstop為false 。 在整個循環(huán)結(jié)束后,bstop 為ture 就說明所有運動都完成了,這個時候就關(guān)閉定時器。
那么這個運動框架基本已經(jīng)完成了,適用css2 不適用css3。
總結(jié):
運動框架的演變過程
startMove(iTarget) 運動框架
startMove(obj,iTarget) 多物體
startMove(obj,attr,iTarget) 任意值
startMove(obj,attr,iTarget,fn) 鏈式運動
startMove(obj,json,fn) 完美運動
O(∩_∩)O謝謝 ~
- js運動動畫的八個知識點
- javascript動畫之圓形運動,環(huán)繞鼠標運動作小球
- JS運動框架之分享側(cè)邊欄動畫實例
- 原生javascript實現(xiàn)勻速運動動畫效果
- js彈性勢能動畫之拋物線運動實例詳解
- JS實現(xiàn)基于Sketch.js模擬成群游動的蝌蚪運動動畫效果【附demo源碼下載】
- JS實現(xiàn)勻速與減速緩慢運動的動畫效果封裝示例
- Js實現(xiàn)簡單的小球運動特效
- javascript實現(xiàn)10個球隨機運動、碰撞實例詳解
- JS實現(xiàn)勻速運動的代碼實例
- js實現(xiàn)緩沖運動效果的方法
- JS實現(xiàn)的小火箭發(fā)射動畫效果示例
相關(guān)文章
淺談js對象屬性 通過點(.) 和方括號([]) 的不同之處
下面小編就為大家?guī)硪黄獪\談js對象屬性 通過點(.) 和方括號([]) 的不同之處。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10js結(jié)合正則實現(xiàn)國內(nèi)手機號段校驗
這篇文章主要介紹了js結(jié)合正則實現(xiàn)國內(nèi)手機號段校驗的方法以及使用js和jQuery實現(xiàn)的簡單校驗手機號的示例,非常簡單實用,有需要的小伙伴可以參考下。2015-06-06各種頁面定時跳轉(zhuǎn)(倒計時跳轉(zhuǎn))代碼總結(jié)
下面對實現(xiàn)頁面定時跳轉(zhuǎn)(也稱倒計時跳轉(zhuǎn))做一下總結(jié),以備不時之需,經(jīng)常使用的朋友可以參考下2013-10-10原生JS實現(xiàn)DOM加載完成馬上執(zhí)行JS代碼的方法
今天小編就為大家分享一篇原生JS實現(xiàn)DOM加載完成馬上執(zhí)行JS代碼的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09Javascript動手實現(xiàn)call,bind,apply的代碼詳解
這篇文章主要為大家詳細介紹了Javascript動手實現(xiàn)call,bind,apply的代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02Typescript 中的 interface 和 type 到底有什么區(qū)別詳解
這篇文章主要介紹了Typescript 中的 interface 和 type 到底有什么區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-06-06