SVG オプティマイザ

SVGO で SVG をミニファイ。エディタのメタデータ削除、座標丸め、サイズ削減を行いつつ描画は維持。

Loading…

すべての処理はブラウザ内で実行されます — ファイルや入力はサーバへ送信されません。

使い方

SVG(ファイルパスではなく `<svg>...</svg>` ブロック全体)を貼り付けると、SVGO がブラウザ内で既定のプラグインチェーンを実行します。エディタメタデータ(Figma・Illustrator・Sketch がエクスポートする `<sodipodi:...>` / `<inkscape:...>` / `<adobe-...>` 名前空間)を除去し、座標を妥当な精度に丸め、無用なグループを畳み、パスを統合し、描画結果をピクセル単位で保ったまま出力をミニファイします。横並びプレビューで元と最適化済みの SVG、加えてバイト数の差分が表示されます。Figma の典型的なエクスポートは 60〜80% 縮むのが一般的です。

デザインツールからアイコンやロゴをエクスポートするたびに使ってください。エクスポートされるファイルは通常、必要な 5〜10 倍の大きさになります。デザインツールが編集可能性を残す方向に倒すからです。最適化された SVG が、リポジトリにコミットしたり、スプライトとして配信したり、HTML にインライン化するべき形です。最適化は SVGO の WASM ビルドを使ってブラウザ内で完結します — デザインアセットがマシン外に出ないため、機密ロゴや未公開のアイコノグラフィを含むファイルでも安心です。

Figma エクスポート → 最適化

入力
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-check" data-figma-node="123:456">
  <!-- Generator: Figma 117.5.4 -->
  <metadata>
    <rdf:RDF xmlns:rdf="...">...</rdf:RDF>
  </metadata>
  <path d="M20.000000 6.000000 L9.000000 17.000000 L4.000000 12.000000"/>
</svg>
出力
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" viewBox="0 0 24 24"><path d="m20 6-11 11-5-5"/></svg>

Bytes: 489 → 198 (-59%)

典型的なアイコンエクスポートです。最適化はメタデータブロックを除去し、Figma 固有の属性(`data-figma-node`、エディタコメント)を削除し、座標の末尾ゼロを落とし(`20.000000` → `20`)、絶対移動を相対移動に統合し(`L9 17` を `-11 11` に)、1 行に整形します。描画結果は元とピクセル単位で同一です — 最適化は出力が同じピクセルを生むことを保証します。

アクセシビリティ用メタデータの保持

入力
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" role="img">
  <title>Settings</title>
  <desc>A gear icon representing settings</desc>
  <path d="M..."/>
</svg>
出力
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" role="img"><title>Settings</title><desc>A gear icon representing settings</desc><path d="M..."/></svg>

`<title>` と `<desc>` は SVG のアクセシブル名と長い説明として、スクリーンリーダに読み上げられます(SVG における `alt` 相当)。最適化は既定でこれらを保持します。`<title>` が落とされる場合は、SVGO の `removeTitle` と `removeDesc` プラグインが無効化されているか確認してください。現代の SVGO 設定はこれらを無効で配布しますが、Figma の組み込み最適化はもっと積極的で、設定の上書きが必要なこともあります。

精度損失とファイルサイズのトレードオフ

入力
<svg viewBox="0 0 100 100">
  <path d="M50.123456 25.987654 C 50.123456 12.987654 39.123456 2.987654 25.987654 2.987654"/>
</svg>

precision: 2
出力
<svg viewBox="0 0 100 100"><path d="M50.12 25.99 50.12 12.99 39.12 2.99 25.99 2.99"/></svg>

(precision: 2 → ~50% fewer bytes per path point)

既定の小数 3 桁精度は安全なスイートスポットです。小さなアイコン(16×16・24×24)では画面上でサブピクセル精度が無駄になるため、2 に下げるとさらにバイト数を削れます。1 未満まで下げると、ロゴ品質の SVG では高ズーム時にアーティファクトが見えてきます。盲目的に精度を下げないでください。コミット前に 2 倍・4 倍ズームで結果を確認してください。

よくある質問

SVGO は実際に何を除去しますか?

既定のプラグインセットが除去するものは、XML コメント、エディタ固有の名前空間(`sodipodi:`・`inkscape:`・`adobe-`)、空の `<defs>` / `<g>`、未使用の ID、重複した `<filter>` / `<gradient>` 定義、冗長な属性(行き先のない `xmlns:xlink` など)、そして `viewBox` が設定されている場合の `width` / `height` です。書き換えとしては、数値を N 桁(既定 3)に丸める、`M...M` を連鎖した `M` コマンドにまとめる、絶対パスコマンドを短くなる場合に相対に変換、パスデータをミニファイなどがあります。完全な一覧は SVGO の `default-preset`(`preset-default` という名前)にあり、約 30 プラグインで個別に設定可能です。

最適化された SVG がブラウザと Figma で違って見えるのはなぜですか?

原因はいくつかあります。**Figma は追加要素を描画**します — ガイド・非表示レイヤー・キャンバス背景など、エクスポート後の SVG には存在しないものです。そのため「Figma での見え方」と「エクスポート後の見え方」は元の SVG でも違っていることがあります。**CSS からの継承** — ブラウザはインライン SVG に `currentColor`・`fill: var(...)`・外部フォントファミリーをカスケードしますが、Figma は SVG 内に焼き込まれた値を使います。最適化後、Figma 内では冗長だがブラウザでは必要だった `fill` 属性が削除されると、アイコンが黒で表示されることがあります。塗りを戻すか、色相を継承するアイコンには `currentColor` を使ってください。

インライン SVG・`<img src="...">`・スプライト — どれを使うべきですか?

**インライン**(HTML / JSX に SVG を直接貼る)は、CSS でスタイリングしたりアニメーションさせたい場合に向きます — `currentColor` で色制御、ホバーでの変形、テーマ切り替えなどです。**`<img src="icon.svg">`** は、動的スタイリングのない静的画像として扱う場合に向きます — シンプルで、ブラウザがページをまたいでファイルをキャッシュし、現代の画像読み込み最適化(遅延・デコード)が適用されます。**スプライト**(`<symbol id="x">` + `<use href="#x">`)は、Lucide や Heroicons のような大きなアイコンライブラリで 30 個の個別ファイルを読むより、1 つにまとめたほうが速い場合に向きます — ネットワークリクエストが 1 回で、定義は重複排除されます。Vite・Webpack・Next.js にはビルド時にスプライトを組み立てるプラグインがあります。

SVGO は通常どれだけファイルを縮めますか?

ソースに大きく依存します。**Figma・Sketch・Illustrator のエクスポート**: 60〜80% 削減が典型的です — これらのツールは冗長な属性とフル編集メタデータを出力します。**手書きの SVG**: 10〜30% — すでに簡潔です。**クリップアートコレクション由来の古い XML 的 SVG**: 70〜90% — 何十年分も積み上がったゴミがついていることが多いためです。5 KB のアイコンが 1 KB に縮むのは現実的、500 KB のイラストが 100 KB になるのも現実的です。サーバの gzip がさらに伝送バイトを半分にするため、最適化と HTTP 圧縮はうまく重なります。

SVGO は何かを壊すことがありますか?

はい、3 つのパターンがあります。**要素間の ID 参照**(`<use href="#foo">` や CSS の `#foo` セレクタ)は、SVGO が ID を改名・削除すると壊れます。原因は通常 `cleanupIds` プラグインで、外部参照に関わる SVG では無効化してください。**アニメーション**(`<animate>` や SMIL)で特定要素をセレクタで指定している場合、SVGO が要素を統合・再構成すると失敗します。**SVG への外部 CSS / JS フック**(`<path data-name="logo">` を探すスクリプトなど)は、`data-*` 属性が削除されると壊れます。そうしたケースでは `removeUnknownsAndDefaults` を無効化してください。最適化は既定では保守的ですが、コミット前に必ず結果をプレビューしてください。

アイコンには SVG・PNG・WebP のどれが良い?

**SVG** はシンプルな形状のアイコンに向きます — 任意のサイズで鮮明、CSS でテーマ化可能、PNG より小さいことが多いです。**PNG** は複雑なテクスチャ(スキューモーフィック、写真クロップなど)のアイコンに向きます。ベクター表現ではファイルが肥大化するためです。**WebP** はアイコンではあまり使われません — PNG はアイコンサイズで十分小さく、WebP のアルファチャンネルの癖(古い Safari など)を管理する価値がないからです。現代のアイコン中心のデザインシステム(Lucide・Heroicons・Material Symbols・Phosphor など)は SVG 専用です。ベクターのワークフローに踏み切るとファイルサイズ論争は決定的に SVG に有利になります。

関連する概念

SVG(Scalable Vector Graphics、1999 年以来の W3C 標準で、現行は 2.0 候補勧告)は XML ベースのベクター画像形式で、ピクセルグリッドではなく数学的プリミティブ(パス・円・矩形など)で形状を記述します。ラスターに対する利点は解像度独立性で、同じ SVG を 16 ピクセルでも 256 ピクセルでもレンダリングでき、どのサイズでもシャープに保たれます。代償はファイルの複雑さで、写真を SVG で表現すると(各ピクセルを小さな `<rect>` として)膨大になるため、SVG はシンプルなグラフィック用途(ロゴ・アイコン・チャート)を支配し、写真的用途には踏み込みません。

**SVGO(SVG Optimizer)** は SVG を縮小する事実上の JavaScript ツールチェーンで、2012 年に Kir Belevich が書き、現在は npm の `svgo` として保守されています。プラグインパイプラインとして動作し、各プラグインが SVG AST(`xml-parser` 流のトラバーサルでパース)を変換し再出力します。注目すべきプラグインは `removeComments`・`removeMetadata`・`cleanupIds`・`mergePaths`・`convertColors`(`#FFFFFF` を `#FFF` や `white` に)・`removeUselessStrokeAndFill` などです。既定プリセットでは約 30 個が有効で、プロジェクトごとにカスタマイズできます。SVGO はビルドツールに統合されたステップとしても動作し、`vite-plugin-svgr`・`@svgr/webpack`・アイコンコンポーネント用の `next/dynamic` などを通じて、コミットごとに自動的に最適化が走ります。

SVG ワークフローを形作る隣接概念が 3 つあります。**`viewBox` と `width`/`height`**: `viewBox` は SVG 内部の座標系を定め、`width`/`height` は表示サイズを定めます。`viewBox` のみの SVG はコンテナに合わせてスケールし、両方ある SVG は固定されます。多くのアイコンライブラリは `viewBox` を設定して `width`/`height` を省くため、CSS の所有者がアイコンのサイズを決められます。**`currentColor`**: `fill="currentColor"` を設定すると SVG が周囲のテキスト色を継承し、テーマ化可能なアイコンが実現します。**SMIL アニメーション** は SVG ネイティブ(`<animate>`・`<animateTransform>` など)ですが、2015 年に Chrome が deprecation を進めたため CSS アニメーションや Lottie へ移行する流れができ、現在の主要ブラウザでも動きますが書かれることはまれです。複雑なアニメーション付きイラストには Lottie(JSON ベースで、After Effects から Bodymovin エクスポート)が主流で、SVG は静的および CSS アニメーションのケースを担います。

関連ツール