<use>要素によるSVGスプライト

スプライトシンボルを参照するためのSVG <use>要素をマスターします。href vs xlink:href、サイジング、スタイル継承、モダンブラウザでのシャドウDOM動作について学びます。

Concepts

詳細な説明

SVG <use>要素

<use>要素はSVGスプライトを実用的にするメカニズムです。ドキュメント内または外部ファイルの他の場所で定義された<symbol>のレンダリングインスタンスを作成します。<use>の動作を理解することが効果的なスプライト使用に不可欠です。

基本構文

<svg width="24" height="24" aria-hidden="true">
  <use href="#icon-name"/>
</svg>

href属性は現在のドキュメント内の<symbol>idを指します。外側の<svg>タグがレンダリング寸法を制御します。

href vs xlink:href

歴史的に、SVGはXLink名前空間のxlink:hrefを使用していました。モダンブラウザ(2018年頃以降のすべてのエバーグリーンブラウザ)はよりシンプルなhref属性を直接サポートしています。ただし、最大限の互換性のために両方が見られることがあります:

<!-- モダン(推奨) -->
<use href="#icon-name"/>

<!-- レガシー互換 -->
<use xlink:href="#icon-name"/>

<!-- 両方(万全を期す) -->
<use href="#icon-name" xlink:href="#icon-name"/>

サイジングとスケーリング

<use>要素は参照された<symbol>からviewBoxを継承します。外側の<svg>のwidthとheightがレンダリングサイズを決定します。CSSでもサイジングを制御できます:

.icon {
  width: 1.5em;
  height: 1.5em;
}
<svg class="icon"><use href="#icon-name"/></svg>

スタイル継承

外側の<svg>または<use>要素に適用されたスタイルはクローンされたコンテンツにカスケードしますが、重要な注意点があります:<use>はシャドウDOMクローンを作成します。これは以下を意味します:

  • CSS currentColorは動作する — シンボルがfill="currentColor"を使用している場合、親要素にcolorを設定するとアイコンの色を制御できます
  • 直接CSSセレクタは貫通しない — 外部CSSから<use>参照内の個別のパスをターゲットにすることはできません
  • シンボルのプレゼンテーション属性が優先 — パスにfill="#ff0000"がハードコードされている場合、CSSは<use>を通じてそれをオーバーライドできません

これが、スプライトシステムではソースSVGからfillstroke属性を除去することが非常に重要な理由です。

外部ファイル参照

別のSVGファイルからシンボルを参照できます:

<svg width="24" height="24">
  <use href="sprites.svg#icon-name"/>
</svg>

これによりスプライトファイルのブラウザキャッシュが可能になります。外部参照はfile://プロトコルや一部のIE/Edgeレガシーブラウザでは動作しない場合があることに注意してください。

ユースケース

スタイリング、サイジング、クロスブラウザ互換性のニュアンスを理解する必要がある、SVGスプライトでアイコンシステムを実装する開発者。

試してみる — SVG Sprite Generator

フルツールを開く