Lottieで簡単にSVGアニメーションを実装!After Effects初見からWEBページ設置までの流れをまとめました

昨年開催された「Adobe MAX 2021」にて、Adobe XDのLottieアニメーションの再生サポートが発表されました。

当時セッションを見ていた私は、「Lottie」ってなぁに?(*゚o゚*)ポケー...という感じでふわっと認識している程度で、Webアニメーションについて知りたいと思ってはいたものの、後回しになっている状況でした。

しかし事態は一転!昨今のウェブサイトには、アニメーションでの表現が不可欠。
SVGとCSSアニメーションを少しずつ勉強し始めたところですが、複雑な表現には対応できず、デザイナーの私にとって、javascriptでガリガリコードを書いて実装するのは夢のまた夢...。

そこで、頭の片隅にあった「Lottie」アニメーションを思い出し、実装の検証をスタートしました。

そもそも「Lottie」って?

「Lottie」(公式サイト:https://airbnb.design/lottie/ )とは、Airbnbが開発したアニメーション用ライブラリです。
After Effectsで作成したアニメーションを、JSONファイルで書き出すことができます。

After Effectsをインストール&プラグインの導入

早速After Effectsをインストールし、Bodymovinプラグインを導入します。
Adobe Exchange からインストールする方法が簡単でした。(使用するAfter Effectsと同じAdobe IDでログインします)

インストール後、After Effectsを起動し、メニュー[ウィンドウ]-[エクステンション]-[Bodymovin]で、Bodymovinのパネルが表示されることを確認します。
lottie①.jpg

また、ファイルを書き出す際には、環境設定の[スクリプトとエクスプレッション]-[スクリプトによるファイルへの書き込みとネットワークへのアクセスを許可]にチェックを入れておくことで、ファイル出力が可能になります。
lottie②.jpg

チュートリアルの実施

After Effects完全初見のためウィンドウやパネルを見ても何もかもさっぱり...。
ひとまず「After Effectsへようこそ」のチュートリアルを一通り行いました。
lottie③.jpg

基本的な機能やパネルの使い方を理解し、いざ動画づくりへ!

Illustratorにてベクターデータを用意

SVGアニメーションのため、ベクター形式のイラストを用意します。
(イラストAC様 の素材をお借りしました)
動かしたい部品ごとにグループ化&レイヤーを分けておきます。
lottie④.jpg

After Effectsにてアニメーションを付けて保存

用意したaiファイルをAfter Effectsに取り込み、表現したいアニメーションを作成します。
lottie⑤.jpg

アニメーションの作り方は割愛しますが、一旦MP4で書き出すところまでできました。 lottie_animation.gif
※MP4をGIFアニメーションに変換したものです

After Effects Bodymovinにてアニメーションを書き出す

アニメーションが作れたら、ファイルを書き出します。
[ウィンドウ]-[エクステンション]-[Bodymovin]を選択します。
lottie⑥.jpg

画像のような画面が起動したら、変換するファイルを選択(Selectedのチェック)、保存場所を設定し、[Render] → [Done]でJSONファイルが書き出されます。

htmlの準備

headタグ内でlottie.jsまたはlottie.min.jsを読み込みます。こちら からLottieを取得できます。

<head>
  <script src="lottie.min.js"></script>
</head>

bodyタグの中には、Lottieアニメーションを表示できるようにします。ここでは、id名を「mainvisual」としています。

<body>
  <div id="mainvisual"></div>
</body>

javascriptでLottieの呼び出し処理を行います。

<script>
var animation = lottie.loadAnimation({
  container: document.getElementById("mainvisual"), //呼び出し位置の要素に入れたIDを指定
  renderer: "svg", // svg・canvas・htmlの3種類から機能に応じて指定(省略可、デフォルトはsvg)
  loop: false, // ループの有無を指定(省略可、デフォルトはtrue)
  autoplay: true, // 自動再生の有無を指定(省略可、デフォルトはtrue)
  path: "animation01.json" //使用するJSONファイルがある実際のディレクトリ名・ファイル名を入れる
});
</script>

あとはWebサーバーにアップすればOK!( ˘ω˘ )
...とそんなに簡単ではありませんでした。

Lottieで使える表現には制限がある

作成したファイルには、いくつかLottieで対応していない内容があったため、htmlに反映しても正しく表示しない状態に。
なんでやー!となりながら調べたところ、以下の表現が未対応だそうです。

[〇使用可]
・単色で構成されたオブジェクト
・パスのトリミング
・不透明度、スケール、回転など、基本的なアニメーション
・背景透過

[×使用不可]
・グラデーション(塗り・線)
・複雑なエフェクト(After Effects標準装備のエフェクト全般)
・リッチな画像効果
・3D表現
・マスク
・BGMなど音をつける

■今回の失敗例

・イラストにグラデーションを使っていた
・そもそも取り込んだイラストがaiデータのままだとダメ
・After Effects標準機能のエフェクト(リニアワイプ)を使っていた

グラデーションが使えないため、aiファイルを修正し単色塗りに変更、タイムラインパネルに取り込んだaiファイルは、右クリックのメニューから[作成]-[ベクトルレイヤーからシェイプを作成]でシェイプレイヤーへの変換を行い、アニメーションで使用していたエフェクトは使わずに、対応範囲内でできる表現にそれぞれ変更。

再度JSONファイルを書き出し、反映したところ無事htmlに表示することができました!

おまけ アニメーション実行のタイミング調整

今回はスクロールした表示時に発動させたいため、jQueryでタイミングをコントロールしました。

<script src="jquery-3.5.1.min.js"></script>
<script>
$(function(){
  var animation = lottie.loadAnimation({
    container: document.getElementById("mainvisual"),
    renderer: "svg",
    loop: false,
    autoplay: false,
    path: "animation01.json"
  });
  window.addEventListener('scroll', event => {
    var windowHeight = window.innerHeight;
    var targetTop = document.getElementById('mainvisual').getBoundingClientRect().top;
    if(0 < targetTop && targetTop <= windowHeight - 200) {
    animation.play();
    window.removeEventListener('scroll');
    }
  });
});
</script>

実装のサンプルページはこちら

最後に

まだまだ表現の制限がかかるものの、Webアニメーション実装へのハードルはグンと下がりました。
特に、動きの部分をスクリプトではなく、After Effects上で作ることができるので、私を含めコードが書けないデザイナーさんにとって大きなメリットに感じます。今後開発が進み、エフェクトなども対応されるようになると、さらに表現の幅が広がりそうです。
これを機にAfter Effectsの勉強も頑張っていこうと思います。

お気軽にご依頼・ご相談ください

前へ

エンジニア2年目となったので通信の仕組みについて体系的に整理してみた。

次へ

GitHubでウェブサイト開発のコーディングワークフローを見直した話。