シンボルベースのSVGスプライトを作成する

SVG <symbol>要素の仕組みと、現代的なSVGスプライトシートの基盤を形成する方法を学びます。id属性、viewBox、symbolとuseの関係を理解します。

Concepts

詳細な説明

シンボルベースのSVGスプライトを作成する

<symbol>要素はSVGスプライトの構成要素です。直接レンダリングされない再利用可能なグラフィックを定義し、<use>でどこにでもインスタンス化できます。これは<defs><g>要素を使用した古いアプローチや、単一のスプライト画像上のCSS背景位置設定とは異なります。

<symbol>の仕組み

<symbol>は独自のviewBoxと座標系を持つグラフィカルテンプレートを定義します。<svg>コンテナ内に存在しますが、単独では視覚的な出力を生成しません:

<svg xmlns="http://www.w3.org/2000/svg" style="display:none">
  <symbol id="icon-star" viewBox="0 0 24 24">
    <path d="M12 2l3.09 6.26L22 9.27l-5 4.87
             1.18 6.88L12 17.77l-6.18 3.25L7
             14.14 2 9.27l6.91-1.01L12 2z"/>
  </symbol>
  <symbol id="icon-heart" viewBox="0 0 24 24">
    <path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12
             5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78
             7.78l1.06 1.06L12 21.23l7.78-7.78
             1.06-1.06a5.5 5.5 0 0 0 0-7.78z"/>
  </symbol>
</svg>

id属性

すべてのシンボルには一意のidが必要です。これは<use href="#id">で使用する参照です。icon-{name}という命名規則がHTML内の他のIDとの競合を避けるのに適しています。一貫性のためにIDは小文字とハイフンを使用します。

viewBox属性

<symbol>は独自のviewBoxを持つことができ、内部のパスの座標系を定義します。つまり、異なるviewBox(例:0 0 24 240 0 16 160 0 512 512)を持つ異なるソースのアイコンを組み合わせても、参照時にすべて正しくスケーリングされます。

<use>でシンボルを参照する

シンボルをレンダリングするには、<svg>内で<use>要素を使用します:

<svg width="24" height="24">
  <use href="#icon-star"/>
</svg>

<svg width="48" height="48" class="text-red-500">
  <use href="#icon-heart"/>
</svg>

<use>要素は参照されたシンボルのディープクローンを作成します。外側の<svg>がレンダリングサイズを制御し、シンボルのviewBoxが内部のスケーリングを処理します。

なぜ<defs> + <g>ではないのか?

アイコンを<defs><g id="icon">でラップする古いパターンは機能しますが、重要な制限があります:<g>は独自のviewBoxをサポートしません。外側の<svg>コンテナにviewBoxを設定するか、手動でスケーリングを管理する必要があります。<symbol>はこのユースケース専用に設計されており、推奨されるアプローチです。

ユースケース

ゼロからSVGスプライトシートを作成するフロントエンド開発者、開発チーム向けにアイコンエクスポートを準備するデザイナー、アイコン管理のためにSVG仕様を学ぶすべての人。

試してみる — SVG Sprite Generator

フルツールを開く