前言:動畫從用途上能夠分爲兩種,一種是展現型的動畫,相似於一張GIF圖,或者一段視頻,另外一種就是交互性的動畫。這兩種都有具體的應用場景,好比在咱們信息流業務中,從下拉頁面到進入活動頁這個過程當中,咱們徹底能夠用一個展現型的入場動畫代替本來可能只有一個小圓圈的的loading頁。javascript
展現型動畫: css
交互性動畫(能夠看到屏幕那個小手勢): html
展現型動畫在實際使用的場景中,實現的方法不少,好比用gif圖
,canvas
,css3
動畫等,可是最終輸出的結果是不帶有交互的,也就是從動畫起始狀態到結束狀態一鼓作氣,這個過程用戶能夠感知,可是沒法參與。對於交互性動畫而言,咱們能夠在動畫播放的某個時間節點觸發相應的操做,進而讓用戶參與到其中,最多見的例子好比紅包雨,或者是咱們世界盃踢足球的動畫,不只僅能提高用戶的體驗,還能提高咱們的產品的多元性。然而交互性動畫常常面臨的一個問題就是,經過原生代碼實現交互動畫是很複雜的,同時性能和兼容性是不得不認真考慮的問題,比較好的解決方案仍是尋求相關的框架。前端
伴隨着CSS3的發展,利用CSS3的transform
和動畫的@keyframes
就能夠完成不少酷炫的動畫,可是CSS3的動畫應用場景僅僅是展現型動畫,只要動畫開始,咱們就沒法控制動畫的狀態,並且對於複雜的動畫,CSS3就顯得很無力了。對於JavaScript驅動的動畫,在必定程度上就能夠彌補這些缺點,好比anime.js
增長的timeline
的概念,經過將各部分動畫鏈式執行,從而完成更爲複雜的動畫,同時動畫執行的各個階段提供的回調函數也能讓咱們更方便的控制動畫執行的狀態,爲交互提供了可能。對於canvas
,在 canvas
上繪製的圖形自身不支持 DOM 事件
,只有canvas
標籤自身支持 DOM 事件監聽。所以須要對 canvas 容器
的事件進行處理,實現相對應事件的監聽及處理。WebGL
能夠爲canvas
提供硬件GPU
加速渲染,藉助使用系統GPU能夠在移動端中更流暢的展現動畫.java
CSS3的animation
,兼容性以下:
canvas
兼容性以下:
WebGL
兼容性以下:
能夠看到,CSS3的animation和canvas支持性比較好,只有WebGL在Android 4.4 Browser 徹底不支持,後續咱們會提到PixiJs庫,能夠採用WebGL渲染,也能夠優雅降級採用canvas渲染css3
適用場景:主要仍是展現型動畫git
簡介:經過
AE 上的 Bodymovin 插件
將 AE 中製做好的動畫導出成一個 json 文件,經過Lottie
對JSON
進行解析,最後以SVG/canvas/html
的方式渲染動畫。github
官方文檔:airbnb.io/lottie/ codepen倉庫:codepen.io/collection/…web
優勢:json
JSON
,最後經過lottie
渲染爲canvas/svg/html格式
After Effects
中建立的,使用Bodymovin
導出,而且本機渲染無需額外的工程工做。缺點:
Bodymovin
插件待完善,仍然有部分 AE 效果沒法成功導出Lottie
對 json
文件的支持待完善,目前有部分能成功導出成 json
文件的效果在移動端上沒法很好的展示適用場景: 強展現+弱交互性動畫
簡介:Anime.js是一個輕量級的js驅動的動畫庫,主要的功能有 - 支持keyframes,鏈接多個動畫 - 支持Timeline,爲實現更爲複雜的動畫提供了可能 - 支持動畫狀態的控制playback control,播放,暫停,從新啓動,搜索動畫或時間線。 - 支持動畫狀態的callback,在動畫開始,執行中,結束時提供回調函數 - 支持svg動畫 - 能夠自定義貝塞爾曲線 - 任何包含數值的DOM屬性均可以設置動畫
GitHub:github.com/juliangarni… codepen倉庫:codepen.io/collection/… 文檔演示:animejs.com/documentati…
功能介紹:
必定程度上,anime.js
也是一個CSS3動畫庫
,適用全部的CSS屬性
,而且實現的@keyframes
能更方便的實現幀動畫,替代CSS3複雜的定義方式。使用對象數組的形式定義每一幀
戳我:keyframes實例
anime({
targets: 'div',
translateX: [
{ value: 250, duration: 1000, delay: 500, elasticity: 0 }, //第一幀
{ value: 0, duration: 1000, delay: 500, elasticity: 0 } //第二幀
]
}) //這個例子實現了目標元素在兩幀中實現水平位移
複製代碼
提供的Timeline
能實現更爲複雜的動畫效果,經過這個Timeline
,咱們能夠維護不一樣的動畫之間的關係,進而經過多個不一樣的動畫組成一個更爲複雜的動畫。 戳我:Timeline實例
var myTimeline = anime.timeline();
//經過.add()方法添加動畫
myTimeline
.add({
targets: '.square',
translateX: 250
})
.add({
targets: '.circle',
translateX: 250
})
.add({
targets: '.triangle',
translateX: 250
});
複製代碼
動畫播放的控制,常見的有暫停,重播,繼續,動畫狀態的跟蹤,自動播放,循環次數,抖動效果 戳我:playback controls實例
爲動畫提供了回調函數,在動畫或時間線完成的開始,期間或之時執行回調函數。 戳我:callback實例
var myAnimation = anime({
targets: '#begin .el',
translateX: 250,
delay: 1000,
begin: function(anim) { // callback
console.log(anim.began); // true after 1000ms
}
});
複製代碼
支持promise
,動畫結束後,調用anime.finishe
d會返回一個promise對象
。 戳我:promise實例
支持svg
繪製路徑,目前不支持canvas繪製
戳我:SVG實例
對於input
這樣帶有數值的元素標籤,也能夠經過anime實例
來設置動畫 戳我:DOM ATTRIBUTES實例
anime({
targets: input,
value: 1000, // Animate the input value to 1000
round: 1 // Remove decimals by rounding the value
});
複製代碼
優勢:
anime.js
不只實現了CSS3動畫
的深度封裝,更多的是經過js驅動來實現操做動畫的狀態,timeline
實現了對於多個分支動畫的管理,對於實現更爲複雜的動畫提供了可能anime.js
提供的playback controls
和callback
,同時對於promise
的支持,讓咱們對於動畫的簡單交互有了操做的空間canvas
,可是支持svg繪製路徑
,我對svg還不是很瞭解,待以後深刻學習後,在作一個補充。Android 4
以上所有支持
缺點與不足:
anime.js
作展現型動畫是能夠勝任的,在作交互性動畫方面仍是須要看場景,它更多適合作一些小型的交互動畫,相似於經過觸摸屏幕踢足球這種強交互的,anime.js
就不是頗有優點了。適用場景:交互性動畫,動畫小遊戲
簡介:PixiJS是一個2D 渲染引擎, Pixi 主要負責渲染畫面。能夠建立豐富的交互式圖形,動畫和遊戲,而無需深刻了解WebGL API或處理瀏覽器和設備兼容性的問題。與此同時,PixiJS具備完整的WebGL支持,若是須要,能夠無縫地回退到HTML5的canvas。PixiJs默認使用WebGL渲染,也能夠經過聲明指定canvas渲染,WebGL在移動端Android 4.4 browser並不支持,不過可使用canvas優雅降級。
Github: github.com/pixijs/pixi… 官方文檔: pixijs.download/release/doc… 官方網站:www.pixijs.com/ Examples:pixijs.io/examples/#/…
特性(摘自官方DOCS):
WebGL渲染
canvas 渲染
(官方稱PixiJS在canvas渲染方面如今是最快的)API
Pixi
使用和 Canvas Drawing
幾乎一致的 api,但不一樣於Canvas
的繪畫 api,使用 Pixi 繪製的圖形是經過WebGL
在 GPU
上渲染優點:
WebGL
來調用GPU渲染動畫,這樣極大的提高了性能WebGL API
或者是瀏覽器兼容性
(由於下面這條緣由)canvas
回退,當前設備不支持WebGL
時,PixiJs
會使用canvas渲染
動畫DOCS
,比較活躍的社區,有利於深刻的學習。不過我感受PixiJs學習成本相對來講仍是很高的缺點:
Android 4.4
是不支持的,只能使用canvas進行降級性能:
Android4.4
以上的手機,除了代碼層面形成的性能不足,經過WebGL調用GPU渲染,性能仍是有保障的。然而對於Android4.4只能使用canvas渲染,性能仍是要看動畫的複雜度,以及代碼的優化針對不一樣的動畫需求,我總結了三種不一樣場景下的動畫庫。對於展現性的動畫,咱們徹底可使用第一種方案,讓設計同窗提供動畫,咱們利用動畫導出的JSON
,將動畫還原爲svg/canvas/html
。若是場景是交互型或者須要作一個小遊戲,能夠採用第三種方案PixiJs
,經過WebGL
來渲染,利用硬件資源,極大的提高性能,在兼容性方面,對於不支持WebGL
的瀏覽器,可使用canvas渲染
來平穩回退
。最後一種場景就是弱交互強展現,這種場景每每就是用戶點擊一下暫停執行相應操做,待操做完成繼續播放動畫,交互方面比較偏弱
,這種場景下能夠採用第二種方案 Anime.js
,Anime.js不只僅支持全部的css 屬性,並且能夠經過Timeline,callback, playback controls來控制動畫執行的各個狀態。並且兼容性知足咱們的需求,在性能方面,只要不過多的形成頁面迴流
,多使用transform操做複合層,性能仍是能夠的(待多多嘗試,就我看的幾個例子性能仍是不錯的)。最後,從需求角度分析以後,從學習成本作個簡單的小排名:PixiJs > Anime.js > lottie