【JS】手書き風アニメーションをVivus.jsで実装する方法

【JS】手書き風アニメーションをVivus.jsで実装する方法 JavaScript

こんにちは!さこちゃんです。

今回は「手書き風アニメーションをVivus.jsで実装する方法」について解説します。

まろんちゃん
まろんちゃん

Vivus.jsって聞くだけでなんか難しそうなんだが・・・

さこちゃん
さこちゃん

意外と簡単に実装できるよ〜

Vivus.jsとは?

Vivus.jsとは、SVG画像のパスをアニメーションで描画する際に使用できるJavaScriptライブラリです。
特に、手書き風の筆記体や線画アニメーションを簡単に作成できるのが特徴です。
SVG画像を1つずつ描画していくようなアニメーションを、比較的少ないコードで実現することができます。

公式サイトはこちら

CSSアニメーションで実装する方法も紹介しています。
ぜひチェックしてみてね。

デモ確認

今回のデモはこちら!
※すぐにアニメーションが開始します。

デモページを見る

さっそく手順を確認していきましょう〜

illustrationでSVG画像のパスを作成する

まずはSVG画像を用意し、illustrationで開きましょう。
ここでは「demo03_txt.svg」という名前にしています。

開いたらレイヤーをロックし、一つ上の階層に新規レイヤーを作成しましょう。

Sample

先ほど作成した新規レイヤー上で、手書き風テキストのパスを作成していきます。
ペンツールを使い、塗りはなし、線のみにして「Sample」の文字を下図のように上からなぞりましょう。

パスの色と太さは何でも構いません。
ここではパスは赤色、太さは1pxにしています。

Sample
さこちゃん
さこちゃん

ポイントは、一筆書きにすること!一筆書きにすることで、きれいなアニメーションが実現するよ〜

次に先ほど作ったパスを、SVG画像が全て隠れるまで太くします。
ここでは1px→6pxに変更しました。こんな感じになります。

Sample

次に、パスを塗りなし、線なしにします。こんな感じになります。
これを書き出し、「demo03_mask.svg」という名前でローカルに保存しておきましょう。

Sample


SVG画像のパス「demo03_mask.svg」が完成しました。
これでillustrationを使った作業は終了です。

HTML構造を作る

まずはこちらのHTMLをコピーし、手元のHTMLにペーストしましょう。
これをベースに作業を進めていきます。

<svg id="mask" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="ここに値を入れる" height="ここに値を入れる" viewBox="ここに値を入れる" xml:space="preserve">

    <image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="ここにSVG画像を入れる" width="ここに値を入れる" height="ここに値を入れる" mask="url(#clipmask)"></image>

    <mask id="clipmask">
        ここにSVG画像のパス<path>を入れる
    </mask>
</svg>

順に解説していきます。

STEP1 さっき作ったパスをエディタで開く

先ほどイラレで作ったパスをエディタで開きます。

すると下記のコードが出てきます。

<path d = "・・・・・〜 >」箇所をコピーし、「ここにSVG画像のパス<path>を入れる」箇所にペーストしましょう。

またその時、<path>に「class="st0"」というクラス名をつけておきます。
クラス名は任意で変えて構いません。

下記のようになればOKです。ハイライトが追記箇所です。

<svg id="mask" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="ここに値を入れる" height="ここに値を入れる" viewBox="ここに値を入れる" xml:space="preserve">

    <image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="ここにSVG画像を入れる" width="ここに値を入れる" height="ここに値を入れる" mask="url(#clipmask)"></image>

    <mask id="clipmask">
        <path class="st0" d="m43.384 10.19s19.827-18.025-35.449-3.305c0 0 36.65 11.716 29.74 27.638s-39.954 7.21-37.55-.901c0 0 .3-3.905 7.811-2.103 0 0 76.356-28.091 58.631-7.663 0 0 .913-11.917-21.982 13.671 0 0-.422 14.875 20.155-8.854 0 0-10.773 12.973-2.022 11.292s16.634-8.672 16.634-8.672l6.149-13.796-8.435 23.257s15.877-18.311 21.396-17.759-5.786 17.207-5.786 17.207 17.344-18.448 19.867-18.526-9.776 15.452-5.597 18.448 29.746-28.533 37.49-20.83c8.38 8.336-7.988 18.539-7.988 18.539s-9.338-4.211 1.357-15.676c12.081-12.952-35.058 47.258-34.457 47.56 0 0 4.055-29.097 30.583-46.582 0 0-7.936 22.837 11.658 11.532s13.921-2.412 13.921-2.412 30.899-20.649 25.171-32.255c0 0-29.844 20.197-26.98 41.6 0 0 11.907.151 20.348-9.646 0 0-2.11 3.467-.151 4.823s14.233-8.345 13.264-16.278c0 0-10.484 1.484-11.757 10.099 0 0-5.125 6.933 4.371 9.345 0 0 8.893.452 16.278-6.029" fill="none"/>
    </mask>
</svg>

STEP2 幅と高さの値を追記する

STEP1と同様、イラレで作ったパスをエディタで開きます。

viewBoxにある、「0 0 200.053 69.717」が必要な数値です。
幅 = 200.053、高さ = 69.717 を表します。

この数値をそれぞれ「ここに値を入れる」箇所にペーストしましょう。

下記のようになればOKです。ハイライトが追記箇所です。

<svg id="mask" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="201.428" height="74.064" viewBox="0 0 201.428 74.064" xml:space="preserve">

    <image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="ここにSVG画像を入れる" width="201.428" height="74.064" mask="url(#clipmask)"></image>

    <mask id="clipmask">
        <path class="st0" d="m43.384 10.19s19.827-18.025-35.449-3.305c0 0 36.65 11.716 29.74 27.638s-39.954 7.21-37.55-.901c0 0 .3-3.905 7.811-2.103 0 0 76.356-28.091 58.631-7.663 0 0 .913-11.917-21.982 13.671 0 0-.422 14.875 20.155-8.854 0 0-10.773 12.973-2.022 11.292s16.634-8.672 16.634-8.672l6.149-13.796-8.435 23.257s15.877-18.311 21.396-17.759-5.786 17.207-5.786 17.207 17.344-18.448 19.867-18.526-9.776 15.452-5.597 18.448 29.746-28.533 37.49-20.83c8.38 8.336-7.988 18.539-7.988 18.539s-9.338-4.211 1.357-15.676c12.081-12.952-35.058 47.258-34.457 47.56 0 0 4.055-29.097 30.583-46.582 0 0-7.936 22.837 11.658 11.532s13.921-2.412 13.921-2.412 30.899-20.649 25.171-32.255c0 0-29.844 20.197-26.98 41.6 0 0 11.907.151 20.348-9.646 0 0-2.11 3.467-.151 4.823s14.233-8.345 13.264-16.278c0 0-10.484 1.484-11.757 10.099 0 0-5.125 6.933 4.371 9.345 0 0 8.893.452 16.278-6.029" fill="none"/>
    </mask>
</svg>

STEP3 SVG画像のパスを記述する

最後にSVG画像のパスを記述します。
「ここにSVG画像を入れる」箇所に、SVG画像のパスを記述しましょう。
ここでは「demo03_txt.svg」としています。
※「demo03_mask.svg」ではないので、注意してください。

下記のようになればOKです。ハイライトが追記箇所です。

<svg id="mask" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="201.428" height="74.064" viewBox="0 0 201.428 74.064" xml:space="preserve">

    <image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="./assets/img/demo03_txt.svg" width="201.428" height="74.064" mask="url(#clipmask)"></image>

    <mask id="clipmask">
        <path class="st0" d="m43.384 10.19s19.827-18.025-35.449-3.305c0 0 36.65 11.716 29.74 27.638s-39.954 7.21-37.55-.901c0 0 .3-3.905 7.811-2.103 0 0 76.356-28.091 58.631-7.663 0 0 .913-11.917-21.982 13.671 0 0-.422 14.875 20.155-8.854 0 0-10.773 12.973-2.022 11.292s16.634-8.672 16.634-8.672l6.149-13.796-8.435 23.257s15.877-18.311 21.396-17.759-5.786 17.207-5.786 17.207 17.344-18.448 19.867-18.526-9.776 15.452-5.597 18.448 29.746-28.533 37.49-20.83c8.38 8.336-7.988 18.539-7.988 18.539s-9.338-4.211 1.357-15.676c12.081-12.952-35.058 47.258-34.457 47.56 0 0 4.055-29.097 30.583-46.582 0 0-7.936 22.837 11.658 11.532s13.921-2.412 13.921-2.412 30.899-20.649 25.171-32.255c0 0-29.844 20.197-26.98 41.6 0 0 11.907.151 20.348-9.646 0 0-2.11 3.467-.151 4.823s14.233-8.345 13.264-16.278c0 0-10.484 1.484-11.757 10.099 0 0-5.125 6.933 4.371 9.345 0 0 8.893.452 16.278-6.029" fill="none"/>
    </mask>
</svg>

CSSを調整する

次にCSSを調整しましょう。コードはこれだけです。

#mask .st0 {
  fill: none; /* 塗りの色 */
  stroke: #fff; /* 線の色 */
  stroke-width: 9; /* 線幅 */
  stroke-linecap: round; /* 線端の形状 */
  stroke-linejoin: round; /* 角の形状 */
  stroke-dasharray: 2000; /* 線の間隔を指定する */
  stroke-dashoffset: 2000; /* 線の位置を指定する */
}

Vivus.jsを導入する

続いてVivus.jsを設置します。

今回はCDNを使用します。下記のコードを</body>の直前に記述しましょう。

<script src="https://cdnjs.cloudflare.com/ajax/libs/vivus/0.4.4/vivus.min.js"></script>

公式ダウンロードページはこちらです。

JSを記述する

最後にJSを記述します。

JSファイルを作る場合は、先ほどのCDNの下にファイルを設置するようにしましょう。

完成コードはこちらです。

window.addEventListener('load', function () {
 new Vivus('mask', {
  start: 'manual',            // 自動再生をせずスタートをマニュアルに
    type: 'scenario-sync',      // アニメーションのタイプを設定
    duration: 150,              // アニメーションの時間設定(小さいほど速い)
    forceRender: false,         // パスが更新された場合に再レンダリングさせない
    animTimingFunction: Vivus.EASE // 加速・減速のタイミング設定
  }).play(); // SVGアニメーションを再生
});
まろんちゃん
まろんちゃん

ポイントは、「scenario-sync」を指定すること!これで手書き風が完成するのだ。

おわりに

手書き風アニメーションをVivus.jsで実装する方法を紹介しました。

CSSアニメーションでも実装は可能ですが、Vivus.jsを使うことで細かいタイミング制御や、アニメーション制御がより簡単に実装することができます。

ぜひ参考にしてみてくださいね。