お役立ちコラム
HTML

symbol・useタグを使ってSVGアイコンを使い回す方法

※本記事には広告が含まれます

SVGアイコンはインラインで表示すると、CSSで色を変えられたり色々便利です。

しかし、コードが長くなってしまうため、たとえばボタンの矢印部分をSVGアイコンで繰り返し使う場合などは、記述量が多くなってしまいソースが読み辛くなりがちです。

そこで、SVGアイコンを一箇所にまとめて定義しておき、useタグを使って必要な場所で呼び出す方法が便利です。

今回は、symbol・useタグを使って、HTMLを汚すことなく効率的にSVGアイコンを使い回す方法を解説します。

symbol・useタグを使ってSVGアイコンを使い回す方法

今回は、以下のようにページ内の複数箇所で利用される想定のボタンを用意しました。

<a href="#" class="btn">
  <span>ボタン</span>
  <svg width="70" height="8" viewBox="0 0 70 8">
    <polygon fill="#333" points="61 0 61 6 0 6 0 8 61 8 70 8 61 0" />
  </svg>
</a>
.btn {
  position: relative;
  z-index: 1;
  display: inline-block;
  border: 2px solid #333;
  width: 200px;
  padding: 10px 0;
  text-align: center;
  color: #333;
  background-color: #fff;
  text-decoration: none;
}

.btn svg {
  position: absolute;
  z-index: 1;
  bottom: 10px;
  left: calc(100% - 50px);
}

このボタンを毎回インラインSVGを含めて記述すると、HTMLコードが長くなってしまうため、symbolタグ内に一回だけSVGアイコンを定義し、useタグを使って呼び出せるようにします。

まず、bodyタグの開始直後にSVGコードを移動させます。

<body>
  <svg width="70" height="8" viewBox="0 0 70 8">
    <polygon fill="#333" points="61 0 61 6 0 6 0 8 61 8 70 8 61 0" />
  </svg>

  <a href="#" class="btn">
    <span>ボタン</span>
    <!-- 以下のコードをbodyタグ直下に移動 -->
    <!-- <svg width="70" height="8" viewBox="0 0 70 8">
        <polygon fill="#333" points="61 0 61 6 0 6 0 8 61 8 70 8 61 0" />
      </svg> -->
  </a>
</body>

続いてsvgコードの中に<symbol></symbol>タグを記述し、viewBoxをsymbolタグに移動させます。

symbolタグには後からuseタグを使ってSVGアイコンを呼び出せるように、id属性も付けておきます。

<body>
  <svg width="70" height="8">
    <symbol viewBox="0 0 70 8" id="arrow">
      <polygon fill="#333" points="61 0 61 6 0 6 0 8 61 8 70 8 61 0" />
    </symbol>
  </svg>

  <a href="#" class="btn">
    <span>ボタン</span>
  </a>
</body>

また、こちらはSVGアイコンの定義が目的で画面上には何も表示させないため、width属性とheight属性の値を0にし、display: noneとしておきます。

<body>
  <svg width="0" height="0" style="display: none">
    <symbol viewBox="0 0 70 8" id="arrow">
      <polygon fill="#333" points="61 0 61 6 0 6 0 8 61 8 70 8 61 0" />
    </symbol>
  </svg>

  <a href="#" class="btn">
    <span>ボタン</span>
  </a>
</body>

あとは、SVGアイコンを呼び出したい部分で<use />タグを使用します。

<svg></svg>タグで<use />タグを囲い、href属性の中に使用したいアイコンのid属性を指定すればOKです。

<body>
  <svg width="0" height="0" style="display: none">
    <symbol viewBox="0 0 70 8" id="arrow">
      <polygon fill="#333" points="61 0 61 6 0 6 0 8 61 8 70 8 61 0" />
    </symbol>
  </svg>

  <a href="#" class="btn">
    <span>ボタン</span>
    <svg width="70" height="8">
      <use href="#arrow" />
    </svg>
  </a>
</body>

useタグを利用すると、同じアイコンを複数箇所で繰り返し呼び出すことができます。

複数のSVGアイコンをまとめて定義したい場合は、1つのアイコンに対しsymbolタグを追加する

上の例では、矢印アイコンの1つのみsymbolタグを使って定義していますが、symbolタグを追加していくことで、複数のSVGアイコンを定義することができます。

<body>
  <svg width="0" height="0" style="display: none">
    <!-- 矢印アイコン -->
    <symbol viewBox="0 0 70 8" id="arrow">
      <polygon fill="#333" points="61 0 61 6 0 6 0 8 61 8 70 8 61 0" />
    </symbol>

    <!-- 丸アイコン -->
    <symbol viewBox="0 0 100 100" id="circle">
      <circle cx="50" cy="50" r="48" fill="#666" />
    </symbol>

    <!-- 四角アイコン -->
    <symbol viewBox="0 0 100 100" id="square">
      <rect x="10" y="10" width="80" height="80" fill="#999" />
    </symbol>
  </svg>
</body>

PHPが利用できる環境であれば、インラインSVGを別ファイルに分割しておくと便利

PHPが利用できる環境であれば、インラインSVGを別ファイルとして定義し、include_once() などを使って読み込むことで、ソースコードを煩雑にせずにインラインSVGを利用できます。

<body>
  <?php include_once('svg-symbol.php'); ?>

  <a href="#" class="btn">
    <span>ボタン</span>
    <svg width="70" height="8">
      <use href="#arrow" />
    </svg>
  </a>
</body>

まとめ

今回はsymbolタグとuseタグを使って、ソースコードを汚すことなくインラインSVGを使い回す方法を解説しました。

CSSで柔軟にスタイルを変更できるインラインSVGを活かしつつ、HTMLの記述量を減らしたい方は、ぜひ試してみて下さい。

今回は以上になります。最後までご覧頂き、ありがとうございました。

HOMEお役立ちコラムHTMLsymbol・useタグを使ってSVGアイコンを使い回す方法