前回はSVGの概要を解説したので、
と、
- SVGをXMLとして記述し、
svgファイル (もしくはdataスキームなど) をobjectタグなどで埋め込むか、 もしくはXHTMLを用いてHTMLに埋め込む (Firefox 4. 0betaやIE9ppなどはHTML (XHTMLでない) に直接記述することも可能) - JavaScriptから動的にSVGを作る
SVGをXMLとしてあらかじめ記述しておく方法は画像フォーマットとしても利用できますし、
この特集では、
文書型とルート要素
SVG文書はXML文書でもあるので、
続いて、
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
そしてルート要素はsvgです。svg要素に指定できる属性はDocument Structure - SVG 1.
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
このように、
以上を元に、
<?xml version="1.0" standalone="no" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="32px" height="32px"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
</svg>
なお、
<?xml version="1.0" standalone="no" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 32 32"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<svg:circle cx="16" cy="16" r="16" style="fill:red;" />
</svg>
XLinkとは
ここで簡単にXLinkについて説明します。XLinkとはXML文書間のリンクを実現するための仕様です。文書間のリンクというとHTMLのaタグ
その機能・
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="200" height="200"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<circle id="C" cx="20" cy="20" r="20" style="fill:red;" />
</defs>
<use xlink:href="#C" x="20" y="20" />
<use xlink:href="#C" x="80" y="80" />
<use xlink:href="#C" x="140" y="140" />
</svg>
このように、
SVGの基本図形
大まかに外枠を抑えたので、
四角形の描画
rectという要素で四角形を描画することができます。x,y属性で座標を、
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
<rect x="20" y="20" width="160" height="160" style="fill:skyblue;" />
</svg>
var root = document.getElementById('S-sample4');
var SVG = 'http://www.w3.org/2000/svg';
// svg要素を作る
var svg = document.createElementNS(SVG,'svg');
svg.setAttribute('width', '120');
svg.setAttribute('height', '120');
// rect要素を作成
var rect = document.createElementNS(SVG,'rect');
rect.setAttribute('x', '20');
rect.setAttribute('y', '20');
rect.setAttribute('width', '80');
rect.setAttribute('height', '80');
// 塗りつぶし色を指定
rect.setAttribute("fill", "lightpink");
// 文書に追加
svg.appendChild(rect);
root.appendChild(svg);
var root = document.getElementById('R-sample4');
// ベースとなる要素を作る
paper = Raphael(root, 120, 120);
// rectを作成
var rect = paper.rect(20, 20, 80, 80);
// 塗りつぶし色を指定
rect.attr("fill", "greenyellow");
// 枠線をなしに
rect.attr("stroke", "none");
円の描画
circleという要素では円を描画することができます。cx,cy属性で円の中心の座標を、
<circle cx="60" cy="60" r="40" style="fill:skyblue;" />
// circle要素を作成
var circle = document.createElementNS(SVG,'circle');
circle.setAttribute('cx', '60');
circle.setAttribute('cy', '60');
circle.setAttribute('r', '40');
// circleを作成
var circle = paper.circle(60, 60, 40);
楕円の描画
ellipseという要素では楕円を描画することができます。cx,cy属性で円の中心の座標を、
<ellipse cx="60" cy="60" rx="40" ry="10" style="fill:skyblue;" />
// ellipse要素を作成
var ellipse = document.createElementNS(SVG,'ellipse');
ellipse.setAttribute('cx', '60');
ellipse.setAttribute('cy', '60');
ellipse.setAttribute('rx', '40');
ellipse.setAttribute('ry', '10');
// ellipseを作成
var ellipse = paper.ellipse(60, 60, 40, 10);
直線の描画
lineという要素では直線を描画することができます。x1,y1属性で線を開始する座標を、
<line x1="10" y1="20" x2="100" y2="80" style="fill:skyblue;" />
// line要素を作成
var line = document.createElementNS(SVG,'line');
line.setAttribute('x1', '10');
line.setAttribute('y1', '20');
line.setAttribute('x2', '100');
line.setAttribute('y2', '80');
// lineを作成(pathで代替)
var line = paper.path("M10 20L100 80");
折れ線と多角形の描画
polylineとpolygonという要素ではそれぞれ折れ線と多角形を描画することができます。両者の違いは開始点と終点を繋ぐかどうかという違いです。どちらもpoints属性に座標を指定します。なお、
<polyline points="15,15 15,95 95,95 95,15 35,15 35,75 75,75 75,35 55,35 55,55"
stroke="blue" stroke-width="3" fill="none" />
<polygon points="25,25 25,105 105,105 105,25 45,25 45,85 85,85 85,45 65,45 65,65"
stroke="red" stroke-width="3" fill="none" />
// polyline要素を作成
var polyline = document.createElementNS(SVG,'polyline');
polyline.setAttribute('points', '10,15 10,95 90,95 90,15 30,15 30,75 70,75 70,35 50,35 50,55');
// polygon要素を作成
var polygon = document.createElementNS(SVG,'polygon');
var points = [{x:25,y:25}, {x:25,y:105}, {x:105,y:105}, {x:105,y:25}, {x:45,y:25}, {x:45,y:85}, {x:85,y:85}, {x:85,y:45}, {x:65,y:45}, {x:65,y:65}];
for (var i = 0;i < points.length;i++){
// SVGPoint要素作成
var p = svg.createSVGPoint();
p.x = points[i].x;
p.y = points[i].y;
// pointsにPointを追加
polygon.points.appendItem(p);
}
このように、
// polyline,polygonを作成(pathで代替)
var polyline = paper.path("M10 20L100 80");
パスによる描画
path要素は様々な図形を描画することができます。実はここまでに出てきた基本的な図形はすべてパスを使っても描くことが可能です。ただし、
pathはコマンドと座標の組み合わせで図形を描画します。[コマンド][引数1] [引数2]… を1セットとして、
<path d="M25 25L25 105L105 105L105 25L45 25L45 85L85 85L85 45L65 45L65 65 z" stroke="red" stroke-width="3" fill="none" />
// path要素を作成
var path = document.createElementNS(SVG,'path');
path.setAttribute('d', 'M10,15L10,95L90,95L90,15L30,15L30,75L70,75L70,35L50,35L50,55');
var path2 = document.createElementNS(SVG,'path');
var paths = [{x:25,y:25}, {x:25,y:105}, {x:105,y:105}, {x:105,y:25}, {x:45,y:25}, {x:45,y:85}, {x:85,y:85}, {x:85,y:45}, {x:65,y:45}, {x:65,y:65}];
for (var i = 0;i < paths.length;i++){
var x = paths[i].x;
var y = paths[i].y;
var p = (i === 0) ?
path2.createSVGPathSegMovetoAbs(x,y) :
path2.createSVGPathSegLinetoAbs(x,y);
path2.pathSegList.appendItem(p);
}
// path2を閉じる
path2.pathSegList.appendItem(path2.createSVGPathSegClosePath());
path要素
// pathを作成
var path = paper.path("M10 15L10 95L90 95L90 15L30 15L30 75L70 75L70 35L50 35L50 55");
var path2 = paper.path("M25 25L25 105L105 105L105 25L45 25L45 85L85 85L85 45L65 45L65 65 z");
まとめ
今回はSVGの描画方法の実例をざっくりと紹介しました。こういったシンプルな図形ではRaphaelの簡潔さに歩があるようです。次回は座標変換やSVGでのテキストの扱い、