做爲一名 H5 前端程序員,在一些包含動畫的項目中,設計師老是要來問一下你"這個動畫是要導出序列幀仍是 GIF","導出 GIF 可能會有白邊","不能再壓縮,再壓就糊了「…...javascript
使用序列幀的方式作動畫css
在以前的一些項目中,動畫通常都是讓設計師導出序列幀,而後在前端經過 css 來實現動畫,可是你知道的,序列幀文件比較大,並且我是本身把這些序列幀在 ps 上作成 sprite 的,無疑又增長了本身的工做量,若是使用 TexturePacker 自動生成 sprite,可是序列幀是沒有按順序排放的,TexturePacker 爲了充分利用圖片空間,有些幀還會旋轉,這樣就沒法使用 css 的 steps
直接作序列幀動畫。再者,對於一些有用戶的交互的序列幀,操做起來更加麻煩,序列幀在某些機型上還會出現跳幀的狀況。html
使用 GIF 作動畫前端
使用 GIF 作動畫,有着相同的一些問題,文件大,不可控,GIF 會一致循環播放,沒法作到單次播放,更不用說用戶交互了,有些 GIF 還會有白邊,顯示效果差。java
使用 svg 作動畫git
在前端本身用 svg 作動畫的方式只試過一次,設計師先在 AE 上導出 svg 的路徑座標,svg 的座標是根據設計畫的順序生成的,這就致使在一些路徑動畫中,維持成本至關大,並且前端直接使用 svg 作的一些動畫自己實現的成本也比較高。程序員
總的來講,以上的三種方法,都有這着各自的或多或少的一些缺點。github
最近在 GitHub 上發現了 airbnb 一個開源項目 lottie-web,試了一下,這個庫能夠很方便地對動畫進行操做,直接在 AE 上導出 json 文件操做。可是仍是發現了一個問題,對於一些把一些圖片導入 AE 作成的動畫,在 AE 上導出 json 文件時同時還有導出一個 images 文件夾,裏面存放了一些動畫中的圖片,這個文件夾的大小也是有點大的。然而,這個庫仍是值得去試一下的。下面對 lottie 的使用方法作一些記錄。web
首選項->常規
中勾選容許腳本寫入文件和訪問網絡
菜單窗口->擴展->Bodymovin
,選擇要輸出的動畫和存放路徑,點擊render
渲染輸出。你能夠在 html 頁面上直接調用靜態地址https://cdnjs.com/libraries/bodymovin
,你也能夠下載 bodymovin 的 js 源文件,在 AE 打開 bodymovin 插件時有個Get Player
按鈕,能夠點擊跳轉下載源文件。shell
<script src="js/bodymovin.js" type="text/javascript"></script> <!-- 或者 --> <script src="https://cdnjs.com/libraries/bodymovin" type="text/javascript"></script>
Bodymovin 在 npm 和 bower 上也可使用。
# NPM npm install lottie-web # Bower bower install lottie-web
另外,文件lottie.light.js
只支持播放以 svg 格式導出的動畫。
調用 lottie.loadAnimation()
方法啓動動畫。
var animation = bodymovin.loadAnimation({ container: document.getElementById('lottie'), // Required path: 'data.json', // Required renderer: 'svg/canvas/html', // Required loop: true, // Optional autoplay: true, // Optional name: "Hello World", // Name for future reference. Optional. })
動畫實例的主要方法
anim.play()
— 播放動畫。
anim.stop()
— 中止動畫。
anim.pause()
— 暫停動畫。
anim.setSpeed(speed)
— 設置播放速度,參數 speed 爲 Number ,1
爲正常速度。
$('.speed-slow').click(function () { anim.setSpeed(0.5); }); $('.speed-normal').click(function () { anim.setSpeed(1); }); $('.speed-fast').click(function () { anim.setSpeed(2); });
anim.goToAndStop(value, isFrame)
— 跳到某一幀並暫停播放。第一個參數是 Number 。第二個參數是 Boolean,設置true
則代表第一個參數表明的是幀數,false
表明第一個參數爲時間值(單位毫秒),默認 false。
$('.gostop').click(function () { anim.goToAndStop(3000, false); });
anim.goToAndPlay(value, isFrame)
— 跳到某一幀並播放。同上。
$('.goplay').click(function () { anim.goToAndPlay(1000, true); });
anim.setDirection(direction)
— 設置播放方向。1
爲正着播,-1
反着播。
$('.dirc').click(function () { anim.setDirection(-1); });
anim.playSegments(segments, forceFlag)
— 播放某一片斷。第一個參數爲一維數組或多維數組,每一個數組包含兩個值(開始幀,結束幀),第二個參數是一個 Boolean ,決定是否當即強制播放該片斷。
$('.seg1').click(function () { anim.playSegments([10, 20], false); }); $('.seg2').click(function () { anim.playSegments([[0, 10], [70, 80]], true); });
anima.destroy()
— 註銷動畫。
lottie 的主要方法
lottie.play(<name>)
— 播放全部動畫,name
爲動畫名稱,播放該動畫。
lottie.stop(<name>)
— 中止因此動畫,name
爲動畫名稱,中止該動畫。
lottie.setSpeed(speed, <name>)
— 設置動畫播放速度,speed
指定速度,1
爲正常值,name
爲動畫名稱,只設定該動畫的速度。
$('.lottie-slow').click(function () { lottie.setSpeed(0.5); }); $('.lottie-normal').click(function () { lottie.setSpeed(1); }); $('.lottie-fast').click(function () { lottie.setSpeed(2); });
lottie.setDirection(direction, <name>)
— 設置動畫播放方向,direction
指定方向,1
爲正向,-1
爲反向,name
爲動畫名稱,只設定該動畫。
lottie.loadAnimation(obj)
— 加載動畫
lottie.destroy()
— 註銷動畫釋放資源,同時清空 dom 節點。
lottie.registerAnimation()
— 能夠給一個節點直接註冊一個動畫,該節點必須包含有指向 json 文件的data-animation-path
屬性。
lottie.setQuality()
— 設置播放質量,默認 high,能夠設置爲 high、medium、low 或者一個大於 1 的數值。在有些動畫中,數值低於 2 時不會有區別。
事件監聽
complete
— 動畫播放結束時觸發(循環播放不會觸發)
anim.addEventListener('complete', function () { console.log('complete'); });
loopComplete
— 進入下一個循環時觸發
anim.addEventListener('loopComplete', function () { console.log('loop complete'); });
enterFrame
— 每進入一幀觸發一次
anim.addEventListener('enterFrame', function () { console.log('enter frame'); });
segmentStart
— 進入片斷播放時觸發
anim.addEventListener('segmentStart', function () { console.log('segment start'); });
config_ready
— 初始化配置完成時觸發
anim.addEventListener('config_ready', function () { console.log('config ready'); });
data_ready
— 動畫全部部分加載完成時觸發
anim.addEventListener('data_ready', function () { console.log('data ready'); });
DOMLoaded
— dom 元素加載完成時觸發
anim.addEventListener('DOMLoaded', function () { console.log('dom loaded'); });
destroy
— 註銷動畫時觸發
anim.addEventListener('destroy', function () { console.log('destroy'); });