SVGとは

SVG(Scalable Vector Graphics)は、XMLベースのベクター画像フォーマットです。ラスター画像(JPEG、PNG)と異なり、どれだけ拡大しても画質が劣化しません。

SVGが適している用途

用途理由
ロゴ拡大してもシャープ
アイコン小さいファイルサイズで高品質
イラスト色変更やアニメーションが容易
チャート・グラフテキストが検索可能
地図インタラクティブな操作が可能

SVGが適さない用途

  • 写真(JPEG/WebP/AVIFの方が圧倒的に効率的)
  • 複雑なグラデーションや質感のある画像
  • 大量のパスポイントを含む複雑なイラスト

なぜSVG最適化が必要なのか

デザインツール(Illustrator、Figma、Sketch等)から書き出したSVGには、多くの不要な情報が含まれています。

デザインツールが出力する不要なデータ

  • エディタ固有のメタデータ — Illustratorのレイヤー情報など
  • 未使用のネームスペースxmlns:xlink など
  • 冗長な属性 — デフォルト値と同じ属性
  • 不要な空白・改行 — 人間の可読性のためのインデント
  • 精度過剰な座標値12.345678 のような不要な小数点以下

最適化により、30〜70% のファイルサイズ削減が可能です。

SVGOによる自動最適化

SVGOとは

SVGO(SVG Optimizer)は、最も広く使われているSVG最適化ツールです。Node.jsベースのCLIツールで、多くのビルドツールやデザインツールに統合されています。

インストールと使い方

# インストール
npm install -g svgo

# 基本的な使い方
svgo input.svg -o output.svg

# ディレクトリ内の全SVGを最適化
svgo -f ./icons/ -o ./icons-optimized/

# 最適化結果を表示
svgo input.svg -o output.svg --pretty

SVGOのデフォルトプラグイン

SVGOはプラグインベースで動作し、デフォルトで以下の最適化が有効です。

プラグイン効果
removeDoctypeDOCTYPE宣言を削除
removeXMLProcInstXML処理命令を削除
removeCommentsコメントを削除
removeMetadataメタデータ要素を削除
removeEditorsNSDataエディタ固有のネームスペースを削除
cleanupAttrs属性の空白を正規化
mergeStylesスタイル要素をマージ
minifyStylesCSSを最小化
removeUselessDefs未使用のdefs要素を削除
cleanupNumericValues数値の精度を最適化
convertColors色を短縮形に変換
removeEmptyAttrs空の属性を削除
removeEmptyContainers空のコンテナ要素を削除
mergePathsパスをマージ
convertPathDataパスデータを最適化
convertTransformtransform属性を最適化

SVGOの設定ファイル

プロジェクトルートに svgo.config.js を作成して設定をカスタマイズできます。

module.exports = {
  plugins: [
    'preset-default',
    'removeDimensions',    // width/heightを削除してviewBoxのみにする
    {
      name: 'removeAttrs',
      params: {
        attrs: ['data-name']  // 特定の属性を削除
      }
    }
  ]
};

手動で行うSVG最適化テクニック

自動ツールだけでは対応しきれない最適化もあります。

1. viewBoxの設定

width / height 属性を削除し、viewBox のみにすると、CSSでサイズを制御でき、レスポンシブ対応が容易になります。

<!-- Before -->
<svg width="100" height="100" viewBox="0 0 100 100">

<!-- After -->
<svg viewBox="0 0 100 100">

2. 不要なグループの削除

単一の子要素しか持たない <g> タグは不要です。

<!-- Before -->
<g>
  <path d="M10 10 L90 90"/>
</g>

<!-- After -->
<path d="M10 10 L90 90"/>

3. パスの簡素化

デザインツールが出力するパスには、不要なアンカーポイントが含まれることがあります。Illustratorの「オブジェクト」→「パス」→「単純化」で削減できます。

4. シンボルの活用

同じ図形を複数回使う場合は <symbol><use> を活用します。

<svg>
  <symbol id="icon-star" viewBox="0 0 24 24">
    <path d="M12 2L15 8.5 22 9.3 17 14 18.2 21 12 17.5 5.8 21 7 14 2 9.3 9 8.5Z"/>
  </symbol>

  <use href="#icon-star" x="0" y="0" width="24" height="24"/>
  <use href="#icon-star" x="30" y="0" width="24" height="24"/>
  <use href="#icon-star" x="60" y="0" width="24" height="24"/>
</svg>

5. CSSクラスの活用

インラインスタイルをCSSクラスに置き換えると、同じスタイルを使い回せます。

<!-- Before -->
<circle cx="50" cy="50" r="40" fill="#F97316" stroke="#EA580C" stroke-width="2"/>
<circle cx="150" cy="50" r="40" fill="#F97316" stroke="#EA580C" stroke-width="2"/>

<!-- After -->
<style>.brand{fill:#F97316;stroke:#EA580C;stroke-width:2}</style>
<circle cx="50" cy="50" r="40" class="brand"/>
<circle cx="150" cy="50" r="40" class="brand"/>

SVGスプライトの作成

複数のアイコンを1つのSVGファイルにまとめる「SVGスプライト」は、HTTPリクエスト数を削減する効果的な手法です。

スプライトファイルの構成

<!-- icons.svg -->
<svg xmlns="http://www.w3.org/2000/svg" style="display:none">
  <symbol id="icon-home" viewBox="0 0 24 24">
    <path d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"/>
  </symbol>
  <symbol id="icon-search" viewBox="0 0 24 24">
    <path d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/>
  </symbol>
</svg>

HTMLでの使用

<svg width="24" height="24">
  <use href="icons.svg#icon-home"/>
</svg>

Gzip / Brotli 圧縮との組み合わせ

SVGはXML(テキスト)ベースのため、Gzip/Brotli圧縮と非常に相性が良いです。

状態ファイルサイズ(例)
元のSVG50KB
SVGO最適化後20KB(60%削減)
SVGO + Gzip6KB(88%削減)
SVGO + Brotli5KB(90%削減)

Webサーバー(Nginx、Apache、Cloudflare等)でSVGのGzip/Brotli圧縮を有効にしましょう。

SVG最適化のチェックリスト

  • SVGOで自動最適化を実行した
  • 不要なメタデータ・コメントが削除されている
  • 座標値の精度が必要最小限になっている
  • 色が短縮形(#fff 等)になっている
  • 未使用の要素・属性がない
  • viewBoxが正しく設定されている
  • 同じ図形はsymbol/useで再利用している
  • サーバーでGzip/Brotli圧縮が有効になっている

よくある問題と対処法

最適化後に表示が崩れる

SVGOの一部プラグイン(convertPathDatamergePaths)が原因のことがあります。svgo.config.js で該当プラグインを無効にしましょう。

アニメーションが動かなくなる

SVGO がアニメーション関連の属性を削除することがあります。removeHiddenElemsremoveUselessStrokeAndFill を無効にすると解決する場合があります。

テキストがアウトライン化されている

フォントのライセンス問題を避けるためにテキストをアウトライン化することがありますが、ファイルサイズが大幅に増えます。可能であればWebフォントを使い、テキスト要素のまま残しましょう。

まとめ

SVG最適化の基本は3ステップです。

  1. SVGOで自動最適化 — まずはこれだけで30〜70%削減
  2. 手動で微調整 — viewBox設定、不要グループ削除
  3. サーバーでGzip/Brotli圧縮 — テキストベースなので効果大

画像フォーマットの変換や最適化には Assistyの画像変換ツール をご活用ください。SVGからPNG/JPEGへの変換もブラウザ上で安全に行えます。