SVG最適化:品質を損なわずにファイルサイズを削減する

· 12分で読めます

目次

SVG最適化を理解する

スケーラブル・ベクター・グラフィックス(SVG)は、JPGやPNGなどの従来のラスター画像とは根本的に異なる画像形式です。SVGはXMLベースのベクターデータを利用してグラフィックを表示し、品質を損なうことなく無限に拡大縮小できます。これにより、レスポンシブWebデザイン、高解像度ディスプレイ、あらゆるサイズで画像の鮮明さが最も重要なアプリケーションに最適です。

固有の利点があるにもかかわらず、Adobe Illustrator、Figma、Sketch、InkscapeなどのデザインツールからエクスポートされたSVGには、ファイルサイズを肥大化させる不要なデータが含まれていることがよくあります。この余剰データには、エディタ固有のメタデータ、冗長な属性、過度に正確な座標、本番環境では何の目的も果たさない構造的な非効率性が含まれます。

SVGを最適化することは、視覚的な品質を維持しながらWebページの読み込み時間を短縮するためにファイルサイズを削減するために不可欠です。適切に最適化されたSVGは、最適化されていないものと比較して40〜80%小さくなり、First Contentful Paint(FCP)やLargest Contentful Paint(LCP)などのページパフォーマンス指標に直接影響します。

プロのヒント:低速接続のモバイルユーザーにとって、すべてのキロバイトが重要です。50KBのSVGを15KBに最適化することは、スムーズな体験とイライラする待ち時間の違いを意味する可能性があります。

SVGファイルの構造

最適化テクニックに入る前に、SVGファイルを構成するものを理解することが重要です。SVGファイルは本質的に、ブラウザが解釈してグラフィックとしてレンダリングできる特定の構造を持つXMLドキュメントです。

SVGのコアコンポーネント

典型的なSVGファイルには、いくつかの重要な要素が含まれています:

SVGが肥大化する理由

デザインツールは、ファイルサイズよりも編集可能性と互換性を優先します。SVGをエクスポートすると、これらのツールには次のものが含まれることがよくあります:

これらのコンポーネントを理解することで、最適化中に何を削除し、何を保持するかについて情報に基づいた決定を下すことができます。

削除可能な要素

すべてのSVGコンテンツが同じように作成されているわけではありません。多くの要素はデザイン段階で目的を果たしますが、本番環境では無駄になります。安全に削除できるものの包括的な内訳は次のとおりです。

不要なメタデータ

多くのデザインツールは、Web上でSVGをレンダリングするために必要のないメタデータを挿入します。sodipodi:inkscape:などのタグは、多くの場合、Inkscape固有のエディタメタデータを示します。同様に、Illustratorは、ブラウザが無視するxmlns:xおよびxmlns:i名前空間を追加します。

削除する一般的なメタデータ要素には次のものがあります:

これらのタグを削除しても、グラフィックの外観には影響しませんが、場合によってはファイルサイズを10〜20%削減できます。

古いコメント

<!-- example comment -->のようなコメントは、SVGを文書化するための開発またはデザインプロセス中に役立ちますが、最終製品には不可欠ではありません。レイヤー名、デザインの決定、またはバージョン情報を説明するコメントは、エンドユーザーに価値を追加することなくバイトを追加します。

これらのコメントを削除すると、特に広範なドキュメントを含む複雑なSVGでファイルサイズを削減する簡単な方法が提供されます。

非表示のレイヤーと要素

編集目的で意図されたレイヤーや要素が非表示のままであるにもかかわらず、エクスポートされたファイルの一部である場合があります。display:nonevisibility:hidden、またはopacity:0の属性を持つものを探し、これらの非表示要素を削除します。

SVGが複数レイヤーのデザインから作成された場合、このような精査によりファイルサイズを大幅に削減できます。非表示の要素には次のものが含まれる場合があります:

クイックヒント:非表示要素を削除する前に、アプリケーションでJavaScriptまたはCSSによって切り替えられていないことを確認してください。一部のインタラクティブSVGは、アニメーション目的で意図的に非表示要素を含んでいます。

未使用および冗長な定義

SVGファイルには、未使用のグラデーション、フィルター、パターン、クリップパスなどの残された定義が含まれていることがよくあります。これらの定義は<defs>セクションにありますが、表示される要素によって参照されることはありません。

これらの未使用の定義を見つけて削除すると、特にアイコンセットや複雑なデザインファイルからエクスポートされたグラフィックでファイルサイズを劇的に削減できます。次のものを探してください:

デフォルト属性値

SVG要素には、多くの属性のデフォルト値があります。これらのデフォルトを明示的に記述すると、バイトが無駄になります。例えば:

これらの明示的なデフォルトを削除すると、要素ごとに数バイト節約でき、複雑なグラフィックではすぐに積み重なります。

過度な小数精度

デザインツールは、過度な小数精度で座標と値をエクスポートすることがよくあります。123.456789123のような座標は、人間の目には知覚できず、レンダリングには不要な誤った精度を提供します。

座標を2〜3桁の小数点以下に丸めることは通常十分であり、視覚的な品質の損失なしにファイルサイズを15〜30%削減できます。123.456789123.46の差は0.003ピクセル未満であり、実用的な表示サイズでは完全に見えません。

SVGOを使用した最適化

SVGO(SVG Optimizer)は、自動化されたSVG最適化の業界標準ツールです。プラグインアーキテクチャを通じて数十の最適化テクニックを適用するNode.jsベースのツールであり、強力でカスタマイズ可能です。

SVGOのインストールと使用

ワークフローに応じて、いくつかの方法でSVGOを使用できます:

コマンドラインインストール:

npm install -g svgo
svgo input.svg -o output.svg

バッチ処理:

svgo -f ./input-folder -o ./output-folder

ビルドツールとの統合:

SVGOは、専用プラグインを通じてwebpack、Gulp、Grunt、その他のビルドシステムとシームレスに統合されます。これにより、ビルドプロセス中にSVGを自動的に最適化できます。

SVGO設定オプション

SVGOの力は、その設定可能性にあります。svgo.config.jsファイルを作成して、適用される最適化をカスタマイズできます:

module.exports = {
  plugins: [
    {
      name: 'preset-default',
      params: {
        overrides: {
          removeViewBox: false,
          cleanupIds: {
            minify: false
          }
        }
      }
    }
  ]
}

理解すべき主要なプラグイン:

プロのヒント:設定で常にremoveViewBox: falseを保持してください。viewBox属性はレスポンシブSVGに不可欠であり、SVGOのデフォルトの動作にもかかわらず、決して削除すべきではありません。

オンラインSVGOツール

コマンドラインツールを使用したくない場合は、いくつかのWebベースのインターフェイスがSVGO最適化を提供します:

これらのツールは、1回限りの最適化や、ビルドプロセスを設定せずにいくつかのファイルをすばやく最適化する必要がある場合に最適です。

SVGO出力の理解

SVGOを実行した後、通常、ファイルサイズが大幅に削減されます。典型的な最適化レポートは次のようになります:

指標 最適化前 最適化後 削減率
ファイルサイズ 48.3 KB 12.7 KB 73.7%
要素 342 298 12.9%
属性 1,247 856 31.4%
パスコマンド 2,891 2,891 0%

パスコマンドは変更されていないことに注意してください。SVGOはその表現を最適化しますが、実際の描画命令は変更せず、視覚的な忠実度を保持します。

手動最適化テクニック

自動化ツールはほとんどの最適化タスクを処理しますが、手動テクニックは、特にアイコンやシンプルなグラフィックに対してさらに良い結果を達成できます。これらのテクニックを理解することは、最初からより効率的なSVGを作成するのにも役立ちます。

パスの簡素化

パスデータは、多くの場合、SVGファイルの最大のコンポーネントです。視覚的な品質を失うことなくパスを簡素化することは、技術的な知識と視覚的な判断を組み合わせた芸術形式です。

パス簡素化のテクニック:

たとえば、パスで描かれた円は<circle>要素に置き換えることができ、コードを数十文字からわずか数個の属性に削減できます。

相対パスコマンドの使用

SVGパスは、絶対コマンドと相対コマンドの両方をサポートしています。相対コマンド(小文字)は、現在の位置に対して相対的に小さい数値を使用するため、多くの場合、より短い出力を生成します。

これらの同等のパスを比較してください:

<!-- 絶対コマンド -->
<path d="M 10 10 L 100 10 L 100 100 L 10 100 Z"/>

<!-- 相対コマンド -->
<path d="M 10 10 h 90 v 90 h -90 Z"/>

相対バージョンは短く、多くの場合より読みやすいです。SVGOのconvertPathDataプラグインはこれを自動的に処理しますが、原理を理解することは、SVGを手動でコーディングする際に役立ちます。

スタイルの統合

複数の要素にわたってインラインスタイルを繰り返す代わりに、CSSクラスまたは親グループのプレゼンテーション属性を使用してそれらを統合します。

最適化前:

<circle cx="10" cy="10" r="5" fill="#4f46e5" stroke="#000" stroke-width="2"/>
<circle cx="30" cy="10" r="5" fill="#4f46e5" stroke="#000" stroke-width="2"/>
<circle c
We use cookies for analytics. By continuing, you agree to our Privacy Policy.