前回はSVGの概要を解説したので、今回はSVGの具体的な書き方をざっくりと見ていきます。
と、その前に前回のおさらいとして、SVGをウェブページで用いる方法を2つにまとめます。
- SVGをXMLとして記述し、svgファイル(もしくはdataスキームなど)をobjectタグなどで埋め込むか、もしくはXHTMLを用いてHTMLに埋め込む(Firefox 4.0betaやIE9ppなどはHTML(XHTMLでない)に直接記述することも可能)
- JavaScriptから動的にSVGを作る
SVGをXMLとしてあらかじめ記述しておく方法は画像フォーマットとしても利用できますし、InkScapeのようなグラフィカルなインターフェースで作成したものを表示するのに向いています。一方、JavaScriptでSVGを描画する方法は動的に図を描けるので、データを元にグラフを描くといったケースに適していますし、Raphaelを用いることでIE 6~8にも対応することができます。
この特集では、svg単体の書き方、JavaScriptから動的にSVGを描く方法、さらにRaphaelで描く方法という順番で見ていきます。まずはSVGを単体で描くときの決まりごとを見ていきます。
文書型とルート要素
SVG文書はXML文書でもあるので、XML宣言、文書型宣言、ルート要素の3つを軸に構成されます。XML宣言は文書の文字コードがUTF-8かUTF-16で、XMLのversionが1.0、スタンドアロン文書宣言がnoという条件を満たしていれば省略が可能です。
続いて、SVGの文書型宣言は次のとおりです。
そしてルート要素はsvgです。svg要素に指定できる属性はDocument Structure - SVG 1.1 (Second Edition) で定義されているように数多くありますが、特に重要なのは名前空間の宣言です。
このように、svgの名前区間と、必要に応じてxlinkの名前空間などを定義します。また、width属性とheight属性では図形の基本サイズを定義します。width="32px" height="32px" のように指定すれば、32×32pxのキャンバスに図形を書く事になります。
以上を元に、骨組みとなるSVGの基本構造は次のとおりです。
なお、svg要素にはviewBoxという属性を指定できます。このviewBoxは原点の座標と1pxの長さを定義することができます。例えば、上記のようにwidth、heightを32pxに設定したSVG文書をブラウザなどで表示すると画面右上に32pxのサイズでSVGが表示されますが、ここでwidth、heightの指定を100%に変え、viewBox="0 0 32 32" という指定を加えると、画面にいっぱいにSVGが表示されるようになります。
width="32px" height="32px"
viewBox="0 0 32 32"
XLinkとは
ここで簡単にXLinkについて説明します。XLinkとはXML文書間のリンクを実現するための仕様です。文書間のリンクというとHTMLのaタグ(ハイパーリンク)が思い浮かぶかと思いますが、その機能拡張版と言えます。
その機能・仕様の詳細な説明は長くなってしまうので省略しますが、SVGでのXLinkの主な使い方は、あるところで定義した要素などの対象を別の場所からそこにあるかのように使いまわすといったケースによく用いられます。
XLinkのサンプル
このように、要素や自体を使いまわすことができるのがXLinkの特徴の1つです。
SVGの基本図形
大まかに外枠を抑えたので、ここからはSVGでの描画方法の具体例を見ていきます。まずは基本的な図形のサンプルです。
四角形の描画
rectという要素で四角形を描画することができます。x,y属性で座標を、width,height属性で大きさを定義します。
rectのサンプル(SVG)
円の描画
circleという要素では円を描画することができます。cx,cy属性で円の中心の座標を、r属性で円の半径を定義します。なお、以降のコードはrectのサンプルコードと重複する部分(文書型宣言、名前区間宣言、SVG要素の作成など)を省略します。
circleのサンプル(SVG)
楕円の描画
ellipseという要素では楕円を描画することができます。cx,cy属性で円の中心の座標を、rx,ry属性で円の半径を定義します。
ellipseのサンプル(SVG)
直線の描画
lineという要素では直線を描画することができます。x1,y1属性で線を開始する座標を、x2,y2で線を終了する座標を指定します。線なので、塗りつぶしはありません。なお、Raphaelではlineが定義されていないので、pathで代替しています(pathのほうが高機能なので困ることはありません。pathについては後述します)。
lineのサンプル(SVG)
折れ線と多角形の描画
polylineとpolygonという要素ではそれぞれ折れ線と多角形を描画することができます。両者の違いは開始点と終点を繋ぐかどうかという違いです。どちらもpoints属性に座標を指定します。なお、やはりRaphaelではpolylineとpolygonは定義されていないので、pathで代替しています。
このように、points属性を直接指定する方法のほかに、createSVGPointでPointを作り、appendItemでポイントを追加するという方法もあります。createSVGPointを使うことでより動的に図形を書くことが可能です。
polylineのサンプル(SVG)
パスによる描画
path要素は様々な図形を描画することができます。実はここまでに出てきた基本的な図形はすべてパスを使っても描くことが可能です。ただし、パスの指定方法は少々わかり難いところがあります。
pathはコマンドと座標の組み合わせで図形を描画します。[コマンド][引数1] [引数2]… を1セットとして、これを組み合わせていきます。引数と引数の間はスペースでもカンマでも構いません。コマンドには位置を移動するM(moveTo)、直線を描くL(lineTo)、曲線を描くC(curveTo)、(楕)円弧を描くA(arcTo)に、パスを閉じるZなどがあります。コマンドは大文字で絶対座標、小文字で相対座標として解釈されます。
path要素(SVGPathElement)はPaths - SVG 1.1 (Second Edition) で定義されている通り、Path Segmentを作るメソッドを持っています。これらの要素を組み合わせることで複雑な描画を動的に作ることも可能です。
pathのサンプル(SVG)
まとめ
今回はSVGの描画方法の実例をざっくりと紹介しました。こういったシンプルな図形ではRaphaelの簡潔さに歩があるようです。次回は座標変換やSVGでのテキストの扱い、装飾関連などを中心に解説したいと思います。