超簡単!超軽量!LottieでWebアニメーションが捗る
こんにちは!新卒2年目、Paid開発担当の小川です!
今回ご紹介するのはWebアニメーションライブラリ「Lottie」です。
リッチなUXを実装したいけど、以下のようになかなか手が出せない方もいらっしゃるのではないでしょうか?
- デザイナーにはJavaScriptの学習コストが高い
- エンジニアにはデザイナーの求めるような動作をなかなか表現できない
- デザイナーとエンジニアの得意分野を切り分けるために動画で表現しようとするとどうしても重くなる
しかし、Lottieを使えば上記の悩みは全て解決してしまいます!!
本稿ではそんなLottieの紹介と使い方についてご紹介します。
Lottieとは?
Lottieは民泊で有名なAirbnbが開発したアニメーションライブラリです。
Adobe After Effectsで作ったアニメーションを簡単に制御することができます!
さっそく、そんなLottieのメリットを見ていきましょう。
Lottieのメリット
複数プラットフォームで活躍
Webをはじめ、iOSやAndroidのネイティブアプリでも使用できる。
超簡単
デザイナーが作ったアニメーションファイルを読み込ませるだけで簡単にエンジニアが実装できる。
デザイナーとエンジニアの切り分けができる。
超軽量
アニメーションをJSON形式で扱うため、mp4やmov形式の動画と比べて遥かに軽量。
リッチなUXの実装に遅延がほとんどない。
さて、実装するために用意するもの見ていきましょう。
用意するもの
lottie.js
- ダウンロードする方法
- GitHubからダウンロード
- CDN経由で読み込む
<script src="https://cdnjs.cloudflare.com/ajax/libs/bodymovin/5.5.9/lottie.min.js" type="text/javascript"></script>
アニメーションファイル(.json)
AdobeのAfter EffectsからBodymovinというプラグインを使用することで簡単に作成できます。
※本稿ではjson形式のアニメーションファイルの作成方法については記載しませんのでご了承ください。
Webサーバー
成果物を配置するWebサーバーをご用意ください。
※本稿では成果物をWebサーバーに配置する前提でお話させていただきます。
また、Webサーバーに配置するのがめんどうだなという方はこちらをご覧ください。
使用するファイル
本稿で使用するファイルはこちらからダウンロードできます。
記事内では一部省略している箇所がありますので、参考にしてみてください!
アニメーションを表示してみよう!
さて、実際にブラウザにアニメーションを表示してみましょう!
今回使用する画像はこちらです。
↑ラクーンホールディングスのロゴです!
これに対するアニメーションファイル(.json)を下記のように用意しました。(※After Effects + Bodymovinでアニメーションファイルをjson形式で出力した結果です)
- animation.json
{
"v": "5.5.8",
"fr": 60,
"ip": 0,
"op": 300,
"w": 640,
"h": 360,
"nm": "コンポ 1",
"ddd": 0,
"assets": [
{
"id": "image_0",
"w": 228,
"h": 108,
"u": "images/",
"p": "logo.png",
"e": 0
}
],
"layers": [
{省略},
{省略}
],
"markers": []
}
かなり長いファイルになるので一部省略しています。
また、assets内の
"u": "images/",
"p": "logo.png",
はそれぞれファイルのディレクトリとファイル名を表しているので、こちらは自分の環境にて適宜調整が必要です。
それでは、実際に動かす方法を見ていきましょう。
ディレクトリ構成
├── lottie.html
|
├── js
| └─ main.js
|
├── json
| └─ animation.json
|
└── css
└─ lottie.css
lottie.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Lottie</title>
<link href="css/lottie.css" rel="stylesheet" type="text/css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/bodymovin/5.5.9/lottie.min.js" type="text/javascript"></script>
</head>
<body>
<div id="lottie"></div>
<script src="js/main.js" type="text/javascript"></script>
</body>
</html>
main.js
var params = {
// アニメーションを表示したい要素(今回はlottieというidを付けて取得しています。)
container: document.getElementById('lottie'),
// アニメーションをsvg形式で出力
renderer: 'svg',
// アニメーションをループする
loop: true,
// アニメーションを読み込んだら自動で再生する
autoplay: true,
// アニメーションファイル(.json)のパス
path: "json/animation.json"
};
// アニメーションをロード
var anim = lottie.loadAnimation(params);
Lottieのドキュメントはこちら
lottie.css
cssは適当で大丈夫です。
@charset "utf-8";
body{
background-color:#fff;
margin: 0px;
height: 100%;
overflow: hidden;
}
#lottie{
background-color:#fff;
width: 35%;
height: 35%;
display: block;
overflow: hidden;
transform: translate3d(0,0,0);
margin: 0 auto;
opacity: 1;
}
これでlottie.htmlにブラウザからアクセスしてみると以下のようにアニメーションが表示されます。
JavaScriptでアニメーションを制御しよう!
今回はjQueryを使ってロゴをクリックしたらアニメーションを止めてみます。
lottie.htmlとmain.jsを以下のように変更しましょう!
lottie.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Lottie</title>
<link href="css/lottie.css" rel="stylesheet" type="text/css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bodymovin/5.5.9/lottie.min.js" type="text/javascript"></script>
</head>
<body>
<div id="lottie"></div>
<script src="js/main.js" type="text/javascript"></script>
</body>
</html>
7行目でjQueryを読み込んでいます。
main.js
var params = {
// アニメーションを表示したい要素(今回はlottieというidを付けて取得しています。)
container: document.getElementById('lottie'),
// アニメーションをsvg形式で出力
renderer: 'svg',
// アニメーションをループする
loop: true,
// アニメーションを読み込んだら自動で再生する
autoplay: true,
// アニメーションファイル(.json)のパス
path: "json/animation.json"
};
// アニメーションをロード
var anim = lottie.loadAnimation(params);
// ロゴをクリックしたらアニメーションを止める
$(function(){
$('#lottie').on('click',function(){
anim.pause();
});
});
これで再度lottie.htmlにブラウザからアクセスしてみましょう。
HOLDINGSの文字が表示される前にクリックすることでアニメーションが止まっていることがわかります。
これでアニメーションをJavaScriptで制御することができました!
Webサーバーなしで動作検証する方へ
本稿に記載の内容は、Webサーバーに配置されたファイル(lottie.html)にブラウザからアクセスすることで動作します。
しかし、ブラウザからファイルに直接アクセスするだけでは動作しません。
それはブラウザのセキュリティ制約によってローカルファイルの読み込みがブロックされてしまうためです。
この問題を解決するためにはいくつかの方法があります。
- 今まで説明してきたファイル群をWebサーバーに配置(本稿ではこちらを前提に説明をしています)
- ローカルファイルの読み込みを許可する
- 「cross origin ローカル」で検索するといくつか対応策等が出てくると思うのでお試しを
- JavaScript内で直接アニメーションデータを読み込む
- アニメーションファイル(.json)を読み込む方法ではなく、変数にそのままアニメーションデータを格納し、Lottieでロードする
- 本稿では「Webサーバーなしで動作検証する方へ」というフォルダ内に、ブラウザからファイルに直接アクセスして動作するファイル群を用意しています(「main.js」内で直接アニメーションデータを読み込んでいます)
※本稿で使用するファイルはこちらからダウンロードしてください。
デザイナーとエンジニアの作業を切り分けるというメリットを生かすためにはやはりWebサーバーに置くことを推奨します
まとめ
「Lottie」は学習コストもとても低く、これといったデメリットが見当たらない気がします。
今後どんどんリッチなUXが増えてくると思うのでみなさんも是非試してみてください!