svg.svg

【SVG】グループ化と画像読み込み

SVG

g

<g>の子要素を 1 つのまとまりとしてグループ化します。

<svg width="100" height="100">
  <g fill="blue" stroke="black">
    <desc>グループ化したよ</desc>
    <circle cx="20" cy="20" r="10" />
    <line x1="35" y1="5" x2="5" y2="35" />
  </g>
</svg>
グループ化したよ

<g>で設定した属性は、すべての子要素に反映されます。 そのため、同じスタイルをまとめて指定したい場合に使用できます。

<g>には<desc>を設定でき、アプリケーションによってはグループごとにその内容を読み取ってくれます。

use

<use>id属性で名前付けした図形をhref属性を用いることで再利用することができます。

SVG 2 ではhrefではなくxlink:hrefで参照していましたが、現在は非推奨となっています。

<svg width="100" height="100">
  <circle id="circle" cx="20" cy="20" r="10" stroke="black" />
  <use href="#circle" x="30" y="30" fill="blue" />
  <use href="#circle" x="10" y="60" fill="red" stroke="white" />
</svg>

<use>では、参照した値のxywidthheight属性を上書きします。 座標は、元の図形の位置を(0, 0)として考えます。

その他の属性は、設定していないものであれば設定可能です。 上の例では、元の図形にstrokeを設定しているため<use>で設定しても上書きされません。 fillは元の図形で設定していないため、<use>で設定可能です。

<g>id属性を設定すれば、図形をまとめて参照することができます。

<svg width="100" height="100">
  <g id="figs1" fill="blue" stroke="black">
    <circle cx="20" cy="20" r="10" />
    <line x1="35" y1="5" x2="5" y2="35" />
  </g>
  <use href="#figs1" x="40" y="40" />
</svg>

defs

<use>の例では、参照元の図形も表示されたままでした。 これを非表示にする場合に<defs>を使用します。

基本的に再利用する図形には、<defs>で囲むことが推奨されています。

<svg width="100" height="100">
  <defs>
    <circle id="circle" cx="20" cy="20" r="10" stroke="black" />
  </defs>
  <use href="#circle" x="30" y="30" fill="blue" />
  <use href="#circle" x="10" y="60" fill="red" stroke="white" />
</svg>

symbol

<symbol>は、<g>と同じくグループ化に使用しますが、<defs>を使用せずとも<symbol>の内容は表示されません。

さらに<g>と異なる点は、<symbol>だけでviewBoxpreserveAspectRatio属性を持ちます。 そのため実際に表示する大きさは、<use>widthheight属性で設定します。

viewBoxpreserveAspectRatioについてわからない方は、こちらの記事を参照してください。

<svg width="100" height="100">
  <symbol id="figs2" stroke="black" viewBox="0 0 40 40">
    <circle cx="20" cy="20" r="10" />
    <line x1="35" y1="5" x2="5" y2="35" />
  </symbol>
  <use href="#figs2" x="0" y="0" width="40" height="40" fill="blue" />
  <use href="#figs2" x="20" y="20" width="80" height="80" fill="red" />
</svg>

image

<image>は、他の SVG ファイルをhref属性によって読み込みます。 属性として位置(x, y)と大きさ(widthheight)を設定します。

<svg width="100" height="100" style="background: #ddd">
  <image href="<url>" x="10" y="10" width="30" height="30" />
  <image href="<url>" x="40" y="40" width="60" height="60" />
</svg>