整理整頓と再利用 - <g>
, <defs>
, <use>
, <symbol>
, <marker>
SVGで複雑なイラストやアイコンを作っていくと、たくさんの図形要素でコードがごちゃごちゃしてきたり、同じような部品を何度も書いたりすることがありますよね。そんなとき、SVGにはコードをスッキリ整理し、効率的に作業を進めるための便利な仕組みが用意されています。
このページでは、要素をグループ化する <g>
、図形を定義して貯めておく <defs>
、それを再利用する <use>
、テンプレートとして強力な <symbol>
、そして線やパスの端に印をつける <marker>
について学びます。これらを使いこなせば、SVGの管理がぐっと楽になり、ファイルサイズも小さくできるかもしれませんよ!
<g>
要素 - 要素をグループ化
<g>
(groupの略) 要素は、複数のSVG要素をひとまとめにするためのコンテナです。「フォルダ」のようなものだと考えてください。グループ化すると、以下のようなメリットがあります。
- 構造化: 関連する要素をまとめることで、SVGの構造が分かりやすくなります。
- スタイルの継承:
<g>
に指定したスタイル属性(例:fill
,stroke
,font-size
)は、グループ内の子要素に継承されます(子要素で個別に上書きされていない場合)。 - 変形の適用:
<g>
にtransform
属性(移動、回転、拡大縮小など)を適用すると、グループ全体がまとめて変形されます。 - id属性: グループに
id
を付けて、JavaScriptやCSSから操作しやすくできます。
<g>
グループ化と変形・スタイルデモ
簡単な「顔」を構成する円と四角をグループ化してみましょう。
<svg viewBox="0 0 250 150">
<g id="faceGroup" transform="translate(0 0) rotate(0)" fill="#cccccc">
<title>顔グループ</title>
<circle cx="75" cy="60" r="50" fill="yellow" stroke="orange" stroke-width="2"/>
<rect x="45" y="40" width="20" height="25" fill="white" stroke="black"/>
<circle cx="55" cy="52" r="5" fill="black"/>
<rect x="105" y="40" width="20" height="25" fill="white" stroke="black"/>
<circle cx="115" cy="52" r="5" fill="black"/>
<path d="M55 90 Q75 110 95 90" stroke="black" stroke-width="2" fill="none"/>
</g>
</svg>
グループのfill
を変更すると、個別にfill
が指定されていない要素(この例ではなし)の色が変わります。また、グループのtransform
で全体が動いたり回転したりします。
<defs>
と <use>
- 定義して再利用
同じ図形やパターンを何度も使いたい場合、毎回コードを書くのは非効率ですよね。そんなとき役立つのが <defs>
(definitionsの略) と <use>
です。
<defs>
: この要素の中に、再利用したいグラフィックオブジェクト(図形、パス、グラデーション、パターン、マーカーなど)を定義します。<defs>
内に書かれたものは、それだけでは画面に表示されません。「部品置き場」のようなものです。定義する各要素にはid
属性でユニークな名前を付けます。<use>
:<defs>
などで定義された要素を、SVGキャンバス上の特定の位置に「呼び出して表示」します。「部品をコピーして貼り付ける」イメージです。href
属性 (または古いSVGではxlink:href
): 再利用したい要素のid
を#
に続けて指定します (例:href="#myShape"
)。x
,y
: 呼び出す図形の基準点をどこに配置するかを指定します。width
,height
: 呼び出す図形(特に<symbol>
の場合)の表示サイズを指定できます。<use>
要素自体にスタイル(fill
,stroke
など)やtransform
を適用することも可能で、これは元の定義とは独立して、呼び出すインスタンスごとに設定できます。
<defs>
と <use>
デモ
星形を定義し、それを複数箇所に異なるスタイルで再利用してみましょう。
<symbol>
要素 - 高機能な再利用テンプレート
<symbol>
は、<use>
で再利用されるためのグラフィックテンプレートを定義する、もう一つの強力な要素です。<g>
に似ていますが、以下の特徴があります。
- それ自体は直接描画されません(通常は
<defs>
の中に置かれます)。 viewBox
属性とpreserveAspectRatio
属性を持つことができます。これにより、<symbol>
内部の座標系を定義し、<use>
で呼び出す際に、そのインスタンスのwidth
とheight
に合わせて適切にスケーリングさせることができます。アイコンシステムを作るのに非常に便利です。
<use>
で <symbol>
を参照する際、x
, y
, width
, height
属性を指定して、表示位置とサイズを制御します。
<symbol>
と <use>
アイコンデモ
簡単なアイコンを <symbol>
で定義し、異なるサイズと色で再利用してみましょう。
<symbol>
の viewBox
のおかげで、<use>
で指定した width
と height
に合わせてアイコンが歪まずにスケーリングされます。
<marker>
要素 - 線やパスの端点マーカー
<marker>
要素は、線 (<line>
)、折れ線 (<polyline>
)、多角形 (<polygon>
)、パス (<path>
) の端点や中間点に表示するグラフィック(矢印の先端、丸、四角など)を定義します。
<defs>
内に<marker>
要素を定義し、id
を付けます。- マーカーを適用したい線やパス要素に、
marker-start
(始点)、marker-mid
(中間点、角など)、marker-end
(終点) といった属性を使って、定義したマーカーのIDを参照します (例:marker-end="url(#myArrowHead)"
)。 <marker>
要素の主な属性:id
: マーカーの一意な名前。viewBox
,preserveAspectRatio
: マーカー自身の座標系とスケーリング。refX
,refY
: マーカー内のどの点が、パスの頂点に正確に接続されるかを指定します。markerWidth
,markerHeight
: マーカーのビューポートの幅と高さ。マーカーの描画領域のサイズです。orient
: マーカーの向き。auto
を指定すると線の方向に自動的に合わせます。auto-start-reverse
は始点マーカー用で、auto
と逆向きになります。角度(度単位)で固定することもできます。markerUnits
:strokeWidth
(マーカーのサイズが適用される線の太さに応じてスケーリングされる) またはuserSpaceOnUse
(マーカーのサイズは固定)。
<marker>
矢印デモ
Did you know? The SVG `<use>` element creates what's often referred to as an "instance" of the referenced element, and this behaves somewhat like a Shadow DOM. Styles applied to the original definition can be overridden by styles on the `<use>` element itself or its ancestors, but the internal structure of the used element is not directly part of the main DOM tree in the same way. This encapsulation is key to its reusability.
知っていましたか?SVGの<use>
要素は、参照される要素の「インスタンス」としばしば呼ばれるものを生成し、これはシャドウDOMのように振る舞います。元の定義に適用されたスタイルは、<use>
要素自身やその祖先のスタイルによって上書きできますが、使用される要素の内部構造は、同じようにはメインDOMツリーの直接的な一部にはなりません。このカプセル化が、その再利用性の鍵です。
まとめ
このページでは、SVGのコードを整理し、図形を効率的に再利用するための重要な要素 <g>
, <defs>
, <use>
, <symbol>
, <marker>
について学びました。これらのテクニックは、SVGで複雑なグラフィックを作成・管理する上で不可欠です。
<g>
: 複数の要素をグループ化し、まとめてスタイルや変形を適用。<defs>
: 再利用する要素を定義する「部品置き場」。直接は描画されない。<use>
:<defs>
などで定義した要素を呼び出して表示。インスタンスごとにスタイル変更可能。<symbol>
:viewBox
を持つ再利用可能なテンプレート。アイコンなどに最適。<marker>
: 線やパスの端点・中間点に矢印などのマーカーを付加。
これらの要素を使いこなすことで、より構造的でメンテナンスしやすく、そして軽量なSVGファイルを作成できるようになります。次のページ「変幻自在!- 移動・回転・拡大縮小」では、SVG要素を動かしたり、大きさを変えたり、回転させたりする「変形」について詳しく見ていきます。
このページの要約
日本語
SVGでは、<g>
要素で複数の図形をグループ化し、まとめてスタイルや変形を適用できます。<defs>
要素は、再利用したい図形やグラデーションなどを定義する場所で、ここにあるものは直接描画されません。<use>
要素は、<defs>
で定義された要素をIDで参照し、SVG上にインスタンスとして表示します。<symbol>
要素は、viewBox
を持つ再利用可能なテンプレートで、特にアイコン作成に便利です。<marker>
要素は、線やパスの端点・中間点に矢印などの記号を付加するために使われます。これらの機能により、SVGの構造化、再利用性、保守性が向上します。
English
In SVG, the <g>
element groups multiple shapes, allowing collective styling and transformations. The <defs>
element defines reusable graphics like shapes or gradients, which are not rendered directly. The <use>
element instances these definitions by referencing their IDs, displaying them on the SVG canvas. The <symbol>
element, a reusable template with its own viewBox
, is particularly useful for icons. The <marker>
element is used to attach symbols like arrowheads to the vertices of lines and paths. These features enhance the structure, reusability, and maintainability of SVG.
Español
En SVG, el elemento <g>
agrupa múltiples formas, permitiendo aplicar estilos y transformaciones colectivas. El elemento <defs>
define gráficos reutilizables como formas o degradados, que no se renderizan directamente. El elemento <use>
instancia estas definiciones referenciando sus IDs, mostrándolos en el lienzo SVG. El elemento <symbol>
, una plantilla reutilizable con su propio viewBox
, es particularmente útil para iconos. El elemento <marker>
se usa para adjuntar símbolos como puntas de flecha a los vértices de líneas y rutas. Estas características mejoran la estructura, reutilización y mantenibilidad de SVG.
中文
在SVG中,<g>
元素用于组合多个形状,允许集体应用样式和变换。<defs>
元素定义可重用的图形,如图形或渐变,这些图形不会直接渲染。<use>
元素通过引用其ID来实例化这些定义,并将它们显示在SVG画布上。<symbol>
元素是一个带有自己的viewBox
的可重用模板,特别适用于图标。<marker>
元素用于将箭头等符号附加到线条和路径的顶点。这些特性增强了SVG的结构、可重用性和可维护性。