JA EN

SVG の基礎と活用法 - ベクター画像の仕組みからアニメーションまで

· 約 9 分で読めます

SVG とは - ラスター画像との根本的な違い

SVG (Scalable Vector Graphics) は、XML ベースのベクター画像フォーマットです。JPEG や PNG などのラスター画像がピクセルの集合で画像を表現するのに対し、SVG は数学的な図形 (点、線、曲線、多角形) の記述で画像を定義します。この根本的な違いにより、SVG はどれだけ拡大しても画質が劣化しないという特性を持ちます。

SVG とラスター画像の比較:

SVG が適している用途: アイコン、ロゴ、図表、グラフ、地図、UI 要素、イラスト、アニメーション。SVG が不向きな用途: 写真、複雑なテクスチャ、グラデーションが多い自然画像。用途に応じてラスター画像と使い分けることが重要です。

SVG の基本構造 - 座標系と主要要素

SVG ファイルは XML 形式で記述され、<svg> ルート要素の中に図形要素を配置する構造です。座標系の理解が SVG を扱う上での基礎となります。

基本的な SVG の構造:

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="200" height="200">
<circle cx="50" cy="50" r="40" fill="#3498db" />
</svg>

viewBox 属性は SVG 内部の座標系を定義します。viewBox="0 0 100 100" は、左上が (0,0)、右下が (100,100) の座標空間を意味します。widthheight は実際の表示サイズです。viewBox と表示サイズが異なる場合、SVG は自動的にスケーリングされます。

主要な図形要素:

<g> 要素でグループ化し、transform 属性で移動・回転・拡大縮小を適用できます。<defs> 要素内に再利用可能な定義を配置し、<use> 要素で参照する設計パターンも重要です。

SVG パスの書き方 - d 属性のコマンド体系

<path> 要素の d 属性は、SVG で最も強力かつ複雑な機能です。一連のコマンドで任意の形状を描画でき、アイコンフォントやイラストの大部分はパスで構成されています。

主要なパスコマンド:

大文字コマンドは絶対座標、小文字コマンドは相対座標 (現在位置からの差分) を使用します。例えば l 10 20 は「現在位置から右に 10、下に 20」の意味です。

実践的なパスの例 (チェックマークアイコン):

<path d="M 20 50 L 40 70 L 80 30" fill="none" stroke="green" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" />

複雑なパスを手書きすることは稀で、通常は Figma、Illustrator、Inkscape などのベクターエディタで作成し、SVG としてエクスポートします。エクスポート後に SVGO で最適化することで、不要なメタデータや冗長な記述を削除し、ファイルサイズを削減します。

CSS と JavaScript による SVG の操作 - 動的なスタイリングとインタラクション

SVG を HTML にインラインで埋め込むことで、CSS と JavaScript から SVG の各要素を自由に操作できます。これにより、ホバーエフェクト、テーマ切り替え、データに基づく動的な描画など、インタラクティブなグラフィックスが実現します。

CSS による SVG スタイリング:

svg .icon-path {
fill: #333;
transition: fill 0.3s ease;
}
svg:hover .icon-path {
fill: #e74c3c;
}

SVG 固有の CSS プロパティ:

JavaScript での操作例:

const path = document.querySelector('.chart-bar');
path.setAttribute('d', `M 0 100 L 0 ${100 - value} L 20 ${100 - value} L 20 100 Z`);

データ可視化では、D3.js や Chart.js が SVG を動的に生成してグラフを描画します。SVG の DOM 操作は HTML と同じ API (querySelectorsetAttributeaddEventListener) で行えるため、Web 開発者にとって学習コストが低いのが利点です。

SVG アニメーション - SMIL と CSS アニメーションの使い分け

SVG アニメーションには、SMIL (SVG 固有のアニメーション記法)、CSS アニメーション、JavaScript (Web Animations API / GSAP) の 3 つの方法があります。それぞれに得意分野があり、用途に応じて使い分けます。

CSS アニメーション (推奨):

最も一般的で、Web 開発者に馴染みのある方法です。@keyframesanimation プロパティで SVG 要素をアニメーションさせます。GPU アクセラレーションが効く transformopacity を中心に使用すると、60fps の滑らかなアニメーションが実現します。

@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.loading-icon { animation: spin 1s linear infinite; }

SMIL アニメーション:

SVG 内に直接記述するアニメーションで、<animate><animateTransform><animateMotion> 要素を使用します。パスに沿った移動 (animateMotion) など、CSS では実現困難なアニメーションが可能です。ただし、Chrome が一時期 SMIL の廃止を検討した経緯があり、新規実装では CSS や JavaScript を優先することが推奨されます。

JavaScript アニメーション (GSAP / Web Animations API):

複雑なタイムライン制御、スクロール連動、ユーザー操作に応じた動的アニメーションには JavaScript が最適です。GSAP (GreenSock Animation Platform) は SVG アニメーションのデファクトスタンダードで、モーフィング (形状変化)、パス描画、スタガーアニメーションなど高度な表現が可能です。

パフォーマンスの観点では、アニメーションする要素数が多い場合 (100 要素以上)、SVG よりも Canvas の方が高速です。SVG は DOM ベースのため、要素数に比例して描画コストが増加します。

SVG の最適化とパフォーマンス - 実務での注意点

SVG ファイルはテキストベースのため、不要なメタデータや冗長な記述が含まれがちです。最適化により、ファイルサイズを 30-70% 削減できる場合があります。特にアイコンセットのように多数の SVG を使用するサイトでは、最適化の効果が累積して大きなパフォーマンス改善につながります。

SVGO (SVG Optimizer) による最適化:

インライン SVG vs 外部ファイルの判断基準:

パフォーマンス上の注意点として、複雑なフィルタ (<feGaussianBlur><feDropShadow>) は描画コストが高いため、多用を避けます。特にモバイルデバイスでは、フィルタ付き SVG がスクロールのカクつきの原因になることがあります。

関連記事

画像フォーマット比較表 - JPEG/PNG/WebP/AVIF/GIF/BMP の特徴と使い分け

主要な画像フォーマット 6 種類の技術的特徴を比較。圧縮方式、対応色深度、透過、アニメーション、ブラウザ対応状況を一覧表で整理し、用途別の最適な選択を解説します。

レスポンシブ画像の実装ガイド - srcset, sizes, picture 要素の完全解説

デバイスの画面サイズや解像度に応じて最適な画像を配信するレスポンシブ画像の実装方法を、コード例とともに詳しく解説します。

favicon の作り方完全ガイド - ICO, SVG, PNG の使い分け

favicon の仕組みから、ICO, SVG, PNG 各フォーマットの特徴、ダークモード対応、各ブラウザの対応状況まで実践的に解説します。

ベクター vs ラスター - 画像形式の使い分けガイド

ベクター画像とラスター画像の違いを仕組みから解説。ロゴ、写真、Web デザインなど用途別に最適な形式の選び方を具体的に紹介します。

ダークモード対応画像の実装ガイド - picture 要素と CSS による切り替え

ダークモードに最適化された画像の実装方法を解説。picture 要素の media 属性、CSS の prefers-color-scheme、SVG の色反転など具体的な手法を紹介します。

HTML イメージマップの作り方と代替手段 - クリッカブルマップの実装ガイド

HTML の map 要素と area 要素を使ったイメージマップの実装方法を解説。レスポンシブ対応の課題と、SVG や CSS を使ったモダンな代替手段を具体的なコード例とともに紹介します。

関連用語