SVGの基礎 4
g要素 グループ化
いくつかの要素をグループ化して属性を共通にすることができる。
<g fill="grey" stroke="green" stroke-width="3">
<circle cx="40" cy="40" r="30" />
<circle cx="70" cy="60" r="15" />
</g>
</svg>
width="200" は、これが無かったら画面いっぱいに描画するが、これを入れると全体表示サイズを指定できる。 widthとheight両方入れると、どちらか小さい方のパラメータで倍率が決まる。 横幅に合わせたい場合はwidthを高さを合わせたい場合はheightを指定するとよい。
use要素
複製を作る。
<circle id="myCircle" cx="5" cy="5" r="4" stroke="blue"/>
<use href="#myCircle" x="10" fill="yellow" />
<use href="#myCircle" x="20" y="2" fill="white" stroke="red" />
</svg>
元の要素(図形)に属性が指定されていればその属性が使われ、変更不可になる。 そのため、最後のstroke="red"は無視されていることがわかる。 また、<use>はx,yで相対的位置座標を与えることになっていることに注意。 y="2"は、元図から2だけ下にずれることを意味している。
グループ要素も参照できる。
<g id="myGroup" fill="grey" stroke-width="3">
<circle cx="40" cy="40" r="30" />
<circle cx="70" cy="60" r="15" />
</g>
<use href="#myGroup" x="80" stroke="red" />
</svg>
ここでも、変更したい属性は元データから削除しておく必要がある。 def要素を使えば、元データを表示しないようにもできる。
<def>
<g id="myGroup2" stroke-width="3">
<circle cx="40" cy="40" r="30" />
<circle cx="70" cy="60" r="15" />
</g>
</def>
<use href="#myGroup2" x="10" stroke="red" fill="white"/>
<use href="#myGroup2" x="90" stroke="blue" fill="yellow"/>
<use href="#myGroup2" x="170" stroke="green" fill="orange"/>
</svg>
座標変換
拡大縮小
拡大縮小は基本的に2通り存在する。 viewBoxを使う方法とtransform属性のscaleパラメータを使う方法である。
<rect width="50" height="50" />
</svg>
<svg width="100" height="150" viewBox="0 0 50 50">
<rect width="50" height="50" />
</svg>
<svg width="100" height="80">
<g transform="scale(2)">
<rect width="50" height="50" />
</g>
</svg>
上記のように3つのSVGを記述すると、
のように表示される。最初の図形は拡大縮小なしであり、widthとheightで描画領域を指定している。 heightが不足しているため、図形の下部分が切れている。 2番目はviewBoxを使って2倍に拡大されている。 widthとheightのどちらか小さい方で、拡大率が決定されている。 たまたまwidthの方が小さいので、それに合わせた拡大率はちょうど2倍になる。 表示領域はwidthとheightで決まるため、heightが大きすぎる分、上に表示がずれている。 3番目はscaleパラメータで拡大率を2倍にしている。 width,heightは表示領域を決めるだけに使われ、heightが不足しているため下の部分が切れている。
縦横の拡大縮小率を変える場合は、scaleパラメータで設定する。
<text style="fill:red; stroke:black; font-size:40px;"
x="30" y="100" transform="scale(1.1 0.4)">
今日はいい天気ですね。</text>
</svg>
座標変換
移動はtransform="translate(30,40)"、回転はtransform="rotate(45)"のように記述する。
これと拡大縮小を組み合わせれば、多くの座標変換は可能になる。
その他、skewX() と skewY() を使って図形を歪めることもできる。
ひし形はこれを使って正方形を変形するとできる。
matrix(a, b, c, d, e, f)で、一般的な座標変換も可能である。
詳細は割愛する。
参考:
Web上に座標変換の詳しい解説がある。
作成日: 更新日: