BLOGブログ

SVGとGSAPで手書き風アニメーションを実装する方法

kitazawa / 2025.01.16

Web関連 Web制作・ホームページ制作

手書きしているように筆記体の文字などをアニメーションさせる方法をご紹介します。今回アニメーションさせるのは以下の文字です。

SVG、Figma、GSAP(https://gsap.com/の3つを使って簡単に実装できます。

1.Figmaで下準備(SVGの作成)

Figma で好きな文字を入力したあと、線のアウトライン化を行います。

次に筆記体の文字を、書き順通りまた一筆書きになるよう、ペンツールを使ってベジェ曲線でなぞっていきます。
下記のように一筆書きになるように留意しましょう。※途切れているとうまくアニメーションされません。

このとき、元の文字が完全に隠れるように線の太さを調整します。
※あとでマスクとして使用するため

元の文字(アウトライン化済み)となぞったベジェ曲線を選択し、マスクとして使用を選びます。
下記のようなレイヤーが作成されていればOKです。

最後にマスクした要素全体(ここではレイヤー名「Mask group」の要素)ごと、SVGとしてコピー※します。
※右クリック→「コピー/貼り付けオプション」→「SVGとしてコピー」を選びます。

2.コピーしたSVGをHTMLに貼り付け

maskのidは任意のものを設定してください。なお、idとmask="url(#~~)"は同じになるように留意してください。
下記の例だと、id="cursiveMask" 、mask="url(#cursiveMask)"のような形になります。

3.GSAPで手書き風にアニメーションさせてみる

完成形はこちら↓

3-1.マスク(mask)の長さを取得

getTotalLength()を使って下記のように文字のパスの長さを取得します。

const maskLen = document.querySelector("#cursiveMask path").getTotalLength();

3-2.GSAPのfromToでアニメーションをセット

最初にfrom(開始状態)をセットします。
strokeDasharray、strokeDashoffsetを3-1で取得したmaskの長さ(maskLen)にセットしておきます。

stroke-dasharrayは、破線の長さを指定するCSSプロパティです。値をmaskLen(デフォルト値)にしておくことで、1本の破線で構成されている状態になります。

stroke-dashoffsetは、パスの描画開始位置を指定するCSSプロパティです。値をmaskLen(デフォルト値)に設定すると、破線の描画開始位置がパスの長さ分「先送り」されるため、パスが完全に見えなくなります

次にto(変化後の状態)を設定します。
strokeDashoffset: 0にセットします。これによってパスがすべて描画されている状態となります。
あとはdurationやeaseでアニメーションのタイミングやイージングを調整して完成です!

gsap.fromTo('#cursiveMask path', 
 {
   strokeDasharray: maskLen,
   strokeDashoffset: maskLen,
 },
 {
   strokeDashoffset: 0,
   duration: 2,
   ease: "power1.inOut" 
 });

まとめ

今回はSVGとGSAPで手書き風アニメーションを実装する方法をご紹介しました。

GSAPとFigmaを使えば簡単に実装できるので、ぜひオープニングアニメーションなどで使ってみてください。

/ / /