前回はSVGの基本的な書き方を解説しました。今回は前回触れなかった座標変換・テキスト関連に、グラデーションを解説していきます。
座標とグループ化
SVGにはg要素という複数の要素をまとめるための要素があります。このg要素によってグループ化した要素に同じ色を適用したり、座標変換(後述)をすることなどができます。
Raphaelではsetを使うことでグループ化に近い処理が可能です。ただし、構築されるDOMを確認するとg要素は作られていないため、中身は異なることに注意が必要です。
グループ化のサンプル
(SVG)
このg要素にはx, y座標もありませんし、widthやheightなども持っていませんが、その代わりに、transform属性によって位置や形状を操作することができます。
Raphaelでは次のように、rotate、translate、scaleといったメソッドが用意されています。しかし、前述の通り、setはg要素に対応しているわけではないため、描画はSVG版と異なってしまいます。
transformのサンプル
(SVG)
transform属性にはtranslate(移動)、scale(拡大・縮小)、skewX(x方向の傾き)、skewY(y方向の傾き)、rotate(回転)に加えてmatrix(行列)を指定できます。translateはx軸、y軸をそれぞれ指定でき、y軸は省略できます。scaleは引数1つで比率を保ったままの拡大縮小、引数2つでx軸とy軸を個別に伸縮できます。skewX、skewYはそれぞれ引数を1つだけ持てます。matrixは移動・拡縮・傾き・回転を1つの行列で表現できます。matrixの引数は6つあり、
- matrix(x軸の伸縮, y軸の傾き, x軸の傾き, y軸の伸縮, x軸の移動, y軸の移動)
に対応します。matrixで回転させたい場合は、次のようにsin、cos関数から伸縮と傾きを求める必要があります。
なお、transformにおいて注意しなければいけないのが、
と
で結果が異なるという点です。移動後の回転と、回転後の移動では中心点との関係が変わるためです。transformは右側から順に適用されるので、上記のサンプルは次のように書いた場合と同じ描画になっています。可読性を優先してこのように要素を分けてもよいでしょう。
SVGとテキスト
SVGではtext要素で簡単に文字を表示することが可能です。ただし、折り返しなどはできないため、文字が切れたり重なったりしないように適切に配置する必要があります。
Raphaelもテキストを扱うことができます。ただし、Raphaelではデフォルトのスタイルがいくつか設定されているため、見た目や位置が少々異なります。
テキストのサンプル
(SVG)
tspan要素を使うことで、text要素内の任意の文字について文字色や大きさ・位置を調整することができます。
また、テキストはtextPath要素を使うことで特定のパスに沿って描画させることもできます。なお、パスの定義はdefs要素という描画しない要素を置くための要素(HTMLでいうhead要素と似ています)の中に記述します。
textPathのサンプル(SVG)
SVGのグラデーション
SVGではベタ塗りだけでなく、グラデーションも可能です。linearGradient(線形グラデーション)、radialGradient(円形グラデーション)という要素でグラデーションの塗り方を定義して、図形のfill属性にその定義のIDを指定します。
Raphaelもグラデーションを扱うことができます。
線形グラデーションのサンプル
(SVG)
円形グラデーションのサンプル
(SVG)
まとめ
今回は座標変換、テキスト、グラデーションなど、SVGのやや高度なAPIを紹介しました。やはり、DOMベースでの記述は長くなってしまう傾向があります。次回はそのあたりの解決方法など、SVGの応用的な処理を解説したいと思います。