資源描述:
《javascript動(dòng)畫(huà)的實(shí)現(xiàn)原理淺析》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。
1、我真正系統(tǒng)地接觸和學(xué)習(xí)黨的基本知識(shí)是在這次中級(jí)黨校的培訓(xùn)班上。通過(guò)學(xué)習(xí),了解了黨的發(fā)展歷程,對(duì)黨的性質(zhì)、宗旨、任務(wù)等基本知識(shí)有了進(jìn)一步的了解Javascript動(dòng)畫(huà)的實(shí)現(xiàn)原理淺析 這篇文章主要介紹了Javascript動(dòng)畫(huà)的實(shí)現(xiàn)原理淺析,本文用兩個(gè)實(shí)例來(lái)解釋Javascript動(dòng)畫(huà)的實(shí)現(xiàn)原理,需要的朋友可以參考下 假設(shè)有這樣一個(gè)動(dòng)畫(huà)功能需求:把一個(gè)div的寬度從100px變化到200px。寫(xiě)出來(lái)的代碼可能是這樣的: 代碼如下: functionanimate1(element,endValue,duration){ varstart
2、Time=newDate(), startValue=parseInt(element.style.width), step=1; vartimerId=setInterval(function(){ varnextValue=parseInt(element.style.width)+step; element.style.width=nextValue+'px'; if(nextValue>=endValue){ clearInterval(timerId); //顯示動(dòng)畫(huà)耗時(shí) element.innerHTML=newDa
3、te-startTime; } },duration/(endValue-startValue)*step);對(duì)黨的認(rèn)識(shí)也有了進(jìn)一步的提高。才真正體會(huì)到了中國(guó)共產(chǎn)黨的偉大、光榮和正確,更感到只有中國(guó)共產(chǎn)黨是全中國(guó)最廣大人民利益的忠實(shí)代表我真正系統(tǒng)地接觸和學(xué)習(xí)黨的基本知識(shí)是在這次中級(jí)黨校的培訓(xùn)班上。通過(guò)學(xué)習(xí),了解了黨的發(fā)展歷程,對(duì)黨的性質(zhì)、宗旨、任務(wù)等基本知識(shí)有了進(jìn)一步的了解 } animate1(document.getElementById('test1'),200,1000); 原理是每隔一定時(shí)間增加1px,一直到200px為止。然
4、而,動(dòng)畫(huà)結(jié)束后顯示的耗時(shí)卻不止1s(一般是1.5s左右)。究其原因,是因?yàn)閟etInterval并不能?chē)?yán)格保證執(zhí)行間隔?! ∮袥](méi)有更好的做法呢?下面先來(lái)看一道小學(xué)數(shù)學(xué)題: 代碼如下: A樓和B樓相距100米,一個(gè)人勻速?gòu)腁樓走到B樓,走了5分鐘到達(dá)目的地,問(wèn)第3分鐘時(shí)他距離A樓多遠(yuǎn)? 勻速運(yùn)動(dòng)中計(jì)算某個(gè)時(shí)刻路程的計(jì)算公式為:路程*當(dāng)前時(shí)間/時(shí)間。所以答案應(yīng)為100*3/5=60。 這道題帶來(lái)的啟發(fā)是,某個(gè)時(shí)刻的路程是可以通過(guò)特定公式計(jì)算出來(lái)的。同理,動(dòng)畫(huà)過(guò)程中某個(gè)時(shí)刻的值也可以通過(guò)公式計(jì)算出來(lái),而不是累加得出: 代碼如下: fun
5、ctionanimate2(element,endValue,duration){ varstartTime=newDate(), startValue=parseInt(element.style.width); vartimerId=setInterval(function(){ varpercentage=(newDate-startTime)/duration;對(duì)黨的認(rèn)識(shí)也有了進(jìn)一步的提高。才真正體會(huì)到了中國(guó)共產(chǎn)黨的偉大、光榮和正確,更感到只有中國(guó)共產(chǎn)黨是全中國(guó)最廣大人民利益的忠實(shí)代表我真正系統(tǒng)地接觸和學(xué)習(xí)黨的基本知識(shí)是在這次中級(jí)
6、黨校的培訓(xùn)班上。通過(guò)學(xué)習(xí),了解了黨的發(fā)展歷程,對(duì)黨的性質(zhì)、宗旨、任務(wù)等基本知識(shí)有了進(jìn)一步的了解 varstepValue=startValue+(endValue-startValue)*percentage; element.style.width=stepValue+'px'; if(percentage>=1){ clearInterval(timerId); element.innerHTML=newDate-startTime; } },13); } animate2(document.getElementById('
7、test2'),200,1000); 這樣改良之后,可以看到動(dòng)畫(huà)執(zhí)行耗時(shí)最多只會(huì)有10幾ms的誤差。但是問(wèn)題還沒(méi)完全解決,在瀏覽器開(kāi)發(fā)工具中檢查test2元素可以發(fā)現(xiàn),test2的最終寬度可能不止200px。仔細(xì)檢查animate2函數(shù)的代碼可以發(fā)現(xiàn): 1.percentage的值可能大于1,可以通過(guò)Math.min限制最大值解決?! ?.即使保證了percentage的值不大于1,只要endValue或startValue為小數(shù),(endValue-startValue)*percentage的值也可能產(chǎn)生誤差,因?yàn)镴avascript小數(shù)
8、運(yùn)算的精度不夠。其實(shí)我們要保證的只是最終值的準(zhǔn)確性,所以在percentage為1的時(shí)候,直接使用endValue即可。對(duì)黨的認(rèn)識(shí)也有了