この記事の対象: SVGアニメーションを実装したいフロントエンドエンジニア
読了時間: 約7分
ロゴが描かれるように表示される。アイコンが滑らかに変形する。SVGアニメーションは、GIFやLottieと比べて圧倒的に軽量でありながら、解像度に依存しない美しい演出を実現します。
この記事では、SVGアニメーションの3つの実装方法と、実践的なコード例3選を解説します。
SVGアニメーションとは
SVGアニメーションは、ベクターグラフィック(SVG)にモーションを加える技術です。
| フォーマット | ファイルサイズ | 解像度 | インタラクション | 適したケース |
|---|---|---|---|---|
| GIF | 大きい | 固定 | 不可 | シンプルなループ |
| Lottie | 中程度 | 可変 | 可能 | 複雑なアニメーション |
| SVG | 非常に小さい | 可変 | 可能 | アイコン、ロゴ、図形 |
SVGはテキストベースのXMLフォーマットであるため、gzip圧縮が効き、ファイルサイズが極小です。
SVGアニメーションの作り方3パターン
CSS animation + SVG
SVGの各要素にCSSアニメーションを適用する方法。最も手軽でブラウザ対応も完璧です。
/* SVG要素にCSSアニメーションを適用 */
.svg-icon path {
transition: fill 0.3s ease;
}
.svg-icon:hover path {
fill: #3b82f6;
}
SMIL(SVGネイティブアニメーション)
SVGの内部に<animate>タグでアニメーションを記述する方法です。JavaScriptもCSSも不要で、SVGファイル単体でアニメーションが動作します。
<circle cx="50" cy="50" r="20" fill="#3b82f6">
<animate attributeName="r" from="20" to="30" dur="1s"
repeatCount="indefinite" />
</circle>
JavaScript(GSAP + SVG)
GSAPを使えば、SVGのパス、変形、色などをタイムラインで精密に制御できます。最も柔軟な方法です。
実装例3選
ラインアニメーション(stroke-dasharray)
ロゴやアイコンが「描かれるように」表示されるアニメーションです。
<svg viewBox="0 0 200 200" class="line-draw">
<path d="M10,80 Q95,10 180,80 Q95,150 10,80"
fill="none" stroke="#000" stroke-width="2" />
</svg>
.line-draw path {
stroke-dasharray: 500;
stroke-dashoffset: 500;
animation: draw 2s ease forwards;
}
@keyframes draw {
to {
stroke-dashoffset: 0;
}
}
仕組み: stroke-dasharrayでパスを破線にし、stroke-dashoffsetで破線の開始位置をずらすことで、パスが描かれる効果を作ります。
モーフィング(パスの変形)
1つの形から別の形へ滑らかに変形するアニメーションです。
<svg viewBox="0 0 100 100">
<path d="M25,50 a25,25 0 1,1 50,0 a25,25 0 1,1 -50,0" fill="#3b82f6">
<animate attributeName="d"
to="M10,10 L90,10 L90,90 L10,90 Z"
dur="1s" fill="freeze"
begin="click" />
</path>
</svg>
円から四角形へのモーフィング。GSAPのMorphSVGPluginを使えばより複雑な変形も可能です。
マスクアニメーション
SVGのマスクを使って、コンテンツが段階的に表示される効果です。
<svg viewBox="0 0 400 200">
<defs>
<mask id="reveal-mask">
<rect x="0" y="0" width="0" height="200" fill="white">
<animate attributeName="width"
from="0" to="400" dur="1.5s" fill="freeze" />
</rect>
</mask>
</defs>
<text x="20" y="120" font-size="48" mask="url(#reveal-mask)">
Hello World
</text>
</svg>
マスクのwidthをアニメーションさせることで、テキストが左から順に現れる効果を作ります。
SVGの最適化(SVGO)
SVGファイルはIllustratorやFigmaから書き出すと、不要なメタデータや冗長な属性を含んでいることが多いです。SVGOを使って最適化しましょう。
npx svgo input.svg -o output.svg
SVGOの最適化で30〜70%のファイルサイズ削減が期待できます。
注意: アニメーションに使用するid属性やclass属性がSVGOで削除されないよう、設定でそれらを除外する必要があります。
まとめ
SVGアニメーションのポイントをまとめます。
- GIFやLottieより軽量でリッチな演出が可能
- CSS animationで手軽に、GSAPで高度に実装
- ラインアニメーション(stroke-dasharray)はロゴ表示の定番
- SVGOで最適化してファイルサイズを削減
- アクセシビリティ:
prefers-reduced-motionでの停止対応を忘れずに
