最適化と注意点

SVG ファイルサイズの圧縮、アクセシビリティ、CSS 連携、セキュリティ、 アイコン管理、パフォーマンスまで運用観点。

SVG の最適化

1. SVGO / SVGOMG

npm install -g svgo
svgo input.svg -o output.svg
svgo --pretty -i ./icons -o ./optimized

ブラウザ版: SVGOMG

2. 不要 ID / class を消す

Figma / Illustrator から書き出すと id="Layer_1" などが大量に。SVGO で自動削除。

3. viewBox を正規化

24x24 や 16x16 などキレイな数字に揃える(アイコン)。

4. fill/stroke を継承

fill="currentColor" にすると CSS で色変えできる。

サイズ感の目安

用途典型サイズ
アイコン0.3〜2 KB
ロゴ1〜5 KB
イラスト5〜30 KB
これ以上PNG / WebP / 別フォーマット検討

アクセシビリティ

装飾的 SVG

<svg aria-hidden="true" focusable="false">...</svg>

意味のある SVG

<svg role="img" aria-labelledby="title desc">
  <title id="title">Bar chart</title>
  <desc id="desc">月別売上の推移</desc>
  ...
</svg>

img として使う SVG

<img src="logo.svg" alt="Acme Inc" />

インタラクティブ SVG

セキュリティ

import DOMPurify from "dompurify"

const clean = DOMPurify.sanitize(userSvg, { USE_PROFILES: { svg: true, svgFilters: true } })

CSS との連携

アイコン管理

1. インライン JSX(React)

2. SVG スプライト

<svg width="0" height="0" style="position:absolute">
  <defs>
    <symbol id="home" viewBox="0 0 24 24">...</symbol>
    <symbol id="user" viewBox="0 0 24 24">...</symbol>
  </defs>
</svg>

<svg width="24" height="24"><use href="#home" /></svg>

3. アイコンライブラリ

レスポンシブ SVG

方法 1: width / height を 100% に

<svg viewBox="0 0 800 400" style="width: 100%; height: auto">...</svg>

方法 2: aspect-ratio

.svg-wrap { aspect-ratio: 2 / 1; width: 100%; }

パフォーマンス

サニタイズ vs use の罠

<use href="https://other.com/x.svg#foo"> はクロスオリジンで弾かれる場合あり。 スプライトは同一オリジンに置く。

SVG vs Lottie の使い分け

選択条件
SVG(CSS / JS)シンプルなアニメ、UI
LottieAfter Effects 由来、複雑な演出
Rive状態遷移、ゲーム的
動画 (MP4 / WebM)実写素材
Canvas / WebGL大量要素・パーティクル

ダークモード対応

<svg fill="currentColor" stroke="currentColor">...</svg>

<style>
  body { color: #111; background: #fff; }
  @media (prefers-color-scheme: dark) {
    body { color: #eee; background: #111; }
  }
</style>

SVG を使うべきでない時

失敗パターン

症状対処
ファイルが大きいSVGO / 不要 metadata 削除
色が変えられないcurrentColor / インライン化
img で SMIL が動かない仕様。インライン or object
外部 use がブロック同一オリジン化 / CORS 設定
ロード後の表示が崩れるpreserveAspectRatio / 明示サイズ
SVG アップロードで XSSDOMPurify でサニタイズ

関連リソース

本セクションの総まとめ

  1. viewBox / preserveAspectRatio で座標系を理解
  2. 基本図形 + path で何でも描ける
  3. fill / stroke / グラデ / フィルタ で見た目を制御
  4. transform で位置と回転
  5. text / textPath でテキストも自由に
  6. CSS / JS でアニメーション
  7. SVGO で最適化、A11y も忘れずに
最後に

SVG は「画像」と「コード」の中間。コードとして扱うほど可能性が広がる。 まずアイコンを 1 個自作してみるところから始めると感覚が掴める。