1、緣由
- 前端動畫場景需求多
- 對衆多動畫場景的技術實現方案選擇上比較模糊
- 現有動畫庫太多,不知道選哪一個
2、分類
動畫用途
- 展現型的動畫,相似於一張GIF圖,或者一段視頻
- 交互型的動畫:用戶自已參與的
繪製技術
- Canvas
- div
- SVG
PS:爲了簡單也能夠用視頻,但除非動畫的播放場景固定,否則移動端視頻在不一樣app、不一樣機型、不一樣系統的播放顯示都不太同樣,容易踩很多坑。css
動畫類型
- Tween動畫
- 序列幀動畫
- 骨骼動畫
- SVG動畫
- 3D動畫
維度
- 2D
- 3D
3、繪製技術的差別
無論採用什麼方式來製做動畫,最終呈現到前端頁面的無非三種形式:canvas、div、SVG。html
特色比較
- canvas
- 效率高、性能好、可控性高,只能處理位圖,內存佔用恆定
- 依賴分辨率
- 不支持事件處理器
- 弱的文本渲染能力
- 可以以 .png 或 .jpg 格式保存結果圖像
- 最適合圖像密集型的遊戲,其中的許多對象會被頻繁重繪
- SVG
- 處理矢量圖,不失真
- 不依賴分辨率
- 支持事件處理器
- 最適合帶有大型渲染區域的應用程序(好比谷歌地圖)
- 複雜度高會減慢渲染速度(任何過分使用 DOM 的應用都不快)
- 不適合遊戲應用
- div
- 包括CSS控制的DOM動畫、JS控制的DOM動畫
- 比較適合簡單的數量較少的複雜度較低的動畫
性能差別
- 通常狀況下:JS+Canvas > CSS + DOM > JS + DOM
示例代碼(直觀效果)前端
- canvas和svg比較:
- 通常狀況下,隨着屏幕大小的增大,canvas將開始降級,由於須要繪製更多的像素。
- 隨着屏幕上的對象數目增多,SVG 將開始降級,由於咱們正不斷將這些對象添加到 DOM 中。
- 這些度量不必定準確,如下方面的不一樣必定會引發變化:實現和平臺、是否使用徹底硬件加速的圖形,以及 JavaScript 引擎的速度。
4、動畫實現方式
前端動效開發,首先應該肯定的是動畫用途->確認動畫類型->確認繪製技術->確認動畫的實現方式。html5
雖然最終呈現動畫的載體(繪製技術)就三種,但實現動畫的方式卻不少,得從動畫類型出發討論動畫的實現方式:git
- Tween。補間動畫,涉及到一些緩動函數(如:經常使用的緩動函數)
- CSS實現(transition、animation等)
- Js實現
- 序列幀動畫
- CSS實現(animation)
- JS+DOM實現
- JS+canvas實現
- 骨骼動畫
- 通常採用Spine、DragonBones等工具導出相應資源圖片和JSON動畫配置資源後使用。
- SVG動畫
- 使用 XML 格式定義圖形
- 能夠用AI等SVG編輯工具生成SVG圖片後,配合anime.js等現有庫進行動畫製做
- 3D動畫
- DOM操做用CSS 3D實現。(
perspective
屬性等)
- 場景搭建用webGL(Three.js等)
- 3D模型動畫用Blender或maya等製做完成後導出使用
上面列出的動畫類型對應的實現策略,從開發角度來說,能夠:github
- 本身實現
- 選擇現有輪子:
本身實現
爲了減小外部依賴,簡單的不復雜的動畫通常選擇本身實現。可參考下面的實現方式選擇思路:web
動畫庫
這邊儘量的收集了網上的動畫庫,並對其信息進行了簡單介紹,篇幅問題,另起一篇文章:多是最全的前端動效庫彙總canvas
遊戲引擎/渲染引擎
動畫從維度上分,3D動畫通常採用諸如Three.js的渲染引擎或者遊戲引擎來實現。2D動畫在某些場景也會採用引擎。segmentfault
如今都有些什麼遊戲框架能夠看這裏:遊戲/渲染框架導航瀏覽器
5、主流動畫解決方案
-
Tween動畫
-
序列幀動畫
- 本身實現(CSS、JS+canvs、JS+DOM)
- SVGA
- Lottie(AE製做完動畫後經過Bodymovin導出使用)
- apng配合控制庫(如:apng-js)
-
骨骼動畫
-
SVG動畫
-
3D動畫
-
經常使用動畫庫(適用、強大)
-
經常使用渲染引擎:
6、主流產品動畫方案
- 網易噠噠工做室H5:序列幀動畫->cavans實現
- 各類「一鏡到底」類H5:序列幀動畫->canvas實現
參考文檔
- W3school--HTML 5 Canvas vs. SVG
- 前端動畫技術的研究和比較
- 阿里巴巴 前端專家金擘(渚薰) - 漸進式動畫解決方案
- canvas和svg性能方面選擇