css實(shí)現動(dòng)畫(huà):animation transition transform等
javascript實(shí)現動(dòng)畫(huà):setInterval setTimeout requestAnimationFrame
javascript動(dòng)畫(huà):
優(yōu)點(diǎn):
1. 過(guò)程控制,可以在動(dòng)畫(huà)播放過(guò)程中對動(dòng)畫(huà)進(jìn)行控制:開(kāi)始、暫停、回放、終止、取消都是可以做到的。
2. 動(dòng)畫(huà)效果比css3動(dòng)畫(huà)豐富,有些動(dòng)畫(huà)效果,比如曲線(xiàn)運動(dòng),沖擊閃爍,視差滾動(dòng)效果,只有JavaScript動(dòng)畫(huà)才能完成。
3. CSS3有兼容性問(wèn)題,而JavaScript大多時(shí)候沒(méi)有兼容性問(wèn)題。
缺點(diǎn):
1. JavaScript在web前端瀏覽器的主線(xiàn)程中運行,而主線(xiàn)程中還有其它需要運行的JavaScript腳本、樣式計算、布局、繪制任務(wù)等,對其干擾導致線(xiàn)程可能出現阻塞,從而造成丟幀的情況。
2. 代碼的復雜度高于CSS動(dòng)畫(huà)。
CSS動(dòng)畫(huà):
優(yōu)點(diǎn)(瀏覽器可以對動(dòng)畫(huà)進(jìn)行優(yōu)化):
1. 集中所有DOM,一次重繪重排,刷新頻率和瀏覽器刷新頻率相同。
2. 代碼簡(jiǎn)單,方便調試
3. 不可見(jiàn)元素不參與重排,節約CPU
4. 可以使用硬件加速(通過(guò) GPU 來(lái)提高動(dòng)畫(huà)性能)。
缺點(diǎn):
1. 運行過(guò)程控制較弱,無(wú)法附加事件綁定回調函數。CSS動(dòng)畫(huà)只能暫停,不能在動(dòng)畫(huà)中尋找一個(gè)特定的時(shí)間點(diǎn),不能在半路反轉動(dòng)畫(huà),不能變換時(shí)間尺度,不能在特定的位置添加回調函數或是綁定回放事件,無(wú)進(jìn)度報告。
2. 代碼冗長(cháng)。
JavaScript在執行一些昂貴的任務(wù)
同時(shí)CSS動(dòng)畫(huà)不觸發(fā)layout或paint
在CSS動(dòng)畫(huà)或JavaScript動(dòng)畫(huà)觸發(fā)了paint或layout時(shí),需要main thread進(jìn)行Layer樹(shù)的重計算,這時(shí)CSS動(dòng)畫(huà)或JavaScript動(dòng)畫(huà)都會(huì )阻塞后續操作。
只有如下屬性的修改才符合“僅觸發(fā)Composite,不觸發(fā)layout或paint”:
backface-visibility
opacity
perspective
perspective-origin
transfrom
如果動(dòng)畫(huà)只是簡(jiǎn)單的狀態(tài)切換,不需要中間過(guò)程控制,在這種情況下,css動(dòng)畫(huà)是優(yōu)選方案。它可以讓你將動(dòng)畫(huà)邏輯放在樣式文件里面,而不會(huì )讓你的頁(yè)面充斥 Javascript 庫。然而如果你在設計很復雜的富客戶(hù)端界面或者在開(kāi)發(fā)一個(gè)有著(zhù)復雜UI狀態(tài)的 APP。那么你應該使用js動(dòng)畫(huà),這樣你的動(dòng)畫(huà)可以保持高效,并且你的工作流也更可控。所以,在實(shí)現一些小的交互動(dòng)效的時(shí)候,就多考慮考慮CSS動(dòng)畫(huà)。對于一些復雜控制的動(dòng)畫(huà),使用javascript比較可靠。
聯(lián)系客服