合適的動畫不只更能吸引人們的眼球,也能讓你的應用體驗更爲流暢,而將動畫的效果作到極致,才能讓用戶感到使用你的應用是一種享受,而不是以爲生硬和枯燥。本文旨在探討各類前端動畫效果實現方式的異同,具體應用中如何實現,以及實現的效果還得根據自身的狀況進行考量。css
由於沒有其它可用的實現方式,最初的前端動畫都是JS來實現,實現上就是經過一個定時器setInterval
每隔必定時間來改變元素的樣式,動畫結束時clearInterval
便可。早期的類庫包括 jquery、prototype、mootools 等等都是這種方式。html
儘管這種方式動畫的可控性很強,可是問題也很明顯:前端
css3 加了兩種動畫的實現方式,一種是 transition
, 一種是 animation
。html5
transition 包含4種屬性:transition-delay
transition-duration
transition-property
transition-timing-function
,對應動畫的4種屬性: 延遲、持續時間、對應css屬性和緩動函數,jquery
transform 包含7種屬性:animation-name
animation-duration
animation-timing-function
animation-delay
animation-direction
animation-iteration-count
animation-fill-mode
animation-play-state
,它們能夠定義動畫名稱,持續時間,緩動函數,動畫延遲,動畫方向,重複次數,填充模式。css3
總的來書,css 動畫相比與JS更輕量,性能更好,更易於實現,同時也沒必要擔憂缺少標準和增長帶寬消耗的問題。animation 相比 transtion 使用起來更爲複雜,但也提供了更多的控制,其中最重要的就是 frame 的支持,不過經過一些簡單的JS庫,例如 TJ 的 move.js, 咱們也能在JS中經過 transition 來實現更復雜的控制。git
html5 定義了三種繪圖的方式,canvas
svg
webgl
,其中svg
作爲一種可縮放矢量圖形的實現是基於xml標籤訂義的,它有專門的 animate
標籤來定義動畫。而爲 canvas
或者 webgl
實現動畫則須要經過 requestAnimationFrame (簡稱 raf) 來按期刷新畫布。 儘管說 raf 的方式會讓代碼變得複雜,可是由於不須要那麼多的文檔對象(一般瀏覽器只須要管理一個畫布),它的性能也好不少,尤爲是在內存吃緊的移動端上面。github
經過新的 raf 接口以及一些改進手段咱們也能夠用JS來實現高性能的動畫。主要手段以下:
1. 減小 Dom 樣式屬性查詢,Dom 樣式屬性的查詢會致使頁面重排,從而消耗性能,經過將屬性保存在JS變量中就能夠避免在動畫時去查詢,從而減小卡頓。
2. 使用性能更好的 css transform
替代改變絕對定位元素的定位屬性
3. 在移動設備上使用 3d 硬件加速,最簡單辦法就是添加 -webkit-transform: translateZ(0)
,緣由是移動端的顯卡有很強的圖形渲染能力,而每一個應用的 webview 內存倒是極其有限的。web
使用JS的動畫可控性更好,好比說經過事件捕捉能夠很容易的設定不一樣參數。這方面作的最全面的有 Velocity.js,它可作爲jquery 插件使用,對於初學者很友好,我我的會傾向於使用 tween.js,由於它只專一與動畫的數值計算,不只僅只適用與 Dom 操做。canvas