【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>
では、参照した値のx
、y
、width
、height
属性を上書きします。
座標は、元の図形の位置を(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>
だけでviewBox
とpreserveAspectRatio
属性を持ちます。
そのため実際に表示する大きさは、<use>
のwidth
とheight
属性で設定します。
viewBox
とpreserveAspectRatio
についてわからない方は、こちらの記事を参照してください。
<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)
と大きさ(width
、height
)を設定します。
<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>