SVG

SVG(Scalable Vector Graphics)は、XMLベースのベクター画像フォーマットであり、Webページやアプリケーションなどで利用されます。SVGは、HTMLと同様にブラウザで表示され、CSSやJavaScriptなどと連携して操作することができます。本チュートリアルでは、SVGの基礎的な使い方を紹介します。
本チュートリアルに進む前に、以下の前提条件を満たしている必要があります。
SVGは、座標系を利用してベクター画像を表現します。座標系において、原点(0, 0)からx軸正方向に正の値を持つ座標が増加する右手系が一般的です。
SVGでは、以下のような要素を使用して図形を描画します。
これらの要素には、座標やサイズ、色などの属性を設定することができます。
SVGはXMLベースの言語であるため、HTMLと同様にタグと属性を使用して要素を定義します。以下は、簡単なSVGファイルの例です。
これらの属性を組み合わせることで、SVG画像を複雑な図形にすることができます。
以下は、SVGを使用した簡単な例です。
この例では、円、矩形、直線、パスを使用して図形を描画しています。それぞれの要素には、cx、cy、r、x、y、width、height、x1、y1、x2、y2、dなどの属性が設定されています。
「※」がついている単元はサブページ未作成。 (編集者へ: サブページが出来たら、更新して「※」を除去してください。)
SVGは規格と実装との間に差があり、 外部ファイルとしてSVGファイルを読み込ませる場合のプログラミングがやや面倒です。(JavaScriptのよう簡単にはいきません。)
ウェブブラウザに外部ファイルとしてSVGファイルを読み込ませたい場合、Firefoxの場合なら、その外部SVGファイルに冒頭に、下記コードのように
こういった必要があります。(Windows版のFirefoxの場合、キャンバスサイズをGoogle Chrome と同様に省略できるが(標準設定のサイズになる)、Linuxなど他OSの場合ではキャンバスサイズが必要になる場合もある。ブラウザが同じ「Firefox」でもOSごとに実装が微妙に違う。)
Google Chrome および Microsoft Edge の場合も同様に、名前空間 xmlns="http://www.w3.org/2000/svg" の指定が必要です。(なお Google Chrome および Microsoft Edge の場合、キャンバスサイズの指定がなくても自動でキャンバスサイズの設定が行われる。)
この様に、名前空間などを記述が欠落するとSVGファイルであることがブラウザに伝わらず。希望通り表示できなかったりエラーメッセージを伴う結果と成る。
なお、キャンバスサイズを図形より小さい場合にはハミだしている部分は非表示になります(上記コードでは意図的にハミ出しています)。上記コードは縦長の長方形を表示するコードですがキャンバスサイズをハミ出た下半分は非表示になります。
上記の外部SVGファイルを呼び出すHTMLファイル側は使う要素によって下記のようにマークアップが異なる。
SVGファイルは画像ファイルなので、IMAGE要素で読み込めます。IMAGE要素ではsrc属性で外部ファイルを指定します。
もしWindowsで、上記コードを実行した場合にブラウザの要素などのタイトルが文字化けする場合、<meta charset="utf-8">を除去してください(Windowsではバージョンによっては文字コードがUTF-8ではなくShift_JISなので)。以下のOBJECT要素などでも同様です。
OBJECT要素は、オブジェクトデータを記述するためのHTML要素です。 OBJECT要素ではsrc属性に代わってdata属性で外部ファイル指定します。。
このほか、EMBED要素を使う方法もある。
EMBED要素は、埋め込み外部コンテンツ要素を記述するためのHTML要素である。 EMBED要素ではsrc属性で外部ファイル指定します。
rect要素で表します。
改行をする必要はありませんが、上記コードでは見やすさを重視してfill属性の手前で改行してあります。
rect要素で最低限必要なのは、位置と幅を指定するための次の4要素です。
rectの不等号のペア(<rect ... >)の最後に、下記のように/が必要です。(下記コードの場合、 stroke-width="5" の次の部分。 )
もし、この/が終わりに無いと、ファイルの終端まで</rect>を探すことになります。(長方形以外の、円や線分など他の静止図形のタグでも同様、最後に「/」が必要です。)
なお、下記のように、付随的な要素をstyleでまとめても良い。なお、下記のようにstyleでまとめる記法はCSSに由来するものであり、インラインCSSという記法です。(fillの次の点々はセミコロン、#FFFFFFの次の点々はコロンです。混同しないよう、注意しましょう。)
なお、fillは閉じた領域の塗りつぶしの色です。strokeは、境界線など線分の色です。 fill="#FFFFFF;のFFは16進数です(十進数の255に相当)。
fillを指定しない場合、noneと書いても良いです。
なお、noneの代わりにblueやredと書くと、それぞれの色になります(つまり、HTMLカラーが使えます)。たとえば青色に内側を塗りつぶすなら
とも書けます。
色については rgb(11,11,11)のように0~255の十進数の数値指定で書いてもよいでしょう。つまり、
とも書ける。この場合、水色(うすめの青)で塗りつぶしています。
rectに限らず、円や線分など他の図形でも同様に、styleやrgbを使うことができます。
色の指定は%単位でも可能ですが、rgbの3色すべてに%をつける必要があります。
色はさらに、不透明度アルファを追加したrgba()を使える。ただし、不透明度の値の指定は 0.0 ~ 1.0 の間の数値で行わなければならない。SVGの不透明度は 0 で完全に不透明であり、1 で完全に透明である。

rgbaの第4引数は不透明度である。0から1の間で指定する。不透明にしたい場合には値を1にする。この不透明の数値の指定方法は、CSSに由来する方法である。(Inkscapeなどのドローソフトでは不透明度を0~255の数値で指定するものもあるが、ブラウザ版SVGの仕様とは異なるので注意。)
rgba()関数は、0~255までの定義域と、0~1までの定義域とが混在しているので、あまりメンテナンスがしやすくないかもしれません。
rgb()関数でも透明の処理もできるように、属性で fill-opacity という塗りつぶし領域の不透明度を 0.0 ~ 1.0 で指定できる属性がありますので、メンテナンスのしやすさから、不透明度の指定には fill-opacity を使うほうがいいかもしれません。
fill-opacity は 0 で完全に不透明であり、1 で完全に透明である。

なお、ストロークの不透明度を指定できる stroke-opacity という属性もあるのですが、あまり実装の性能がよくありません。ハードウェアの事情により、太いストロークを描画する場合に、微妙に表示が崩れてしまう場合があります。
図形のカドを丸まらせたい場合(製図の用語で言う「フィレット」)、rxおよびryで丸めの半径を指定できる。
この他、transfrom属性とrotate()関数を使って、斜めに傾いた長方形などの図形を書けます。長方形以外の図形や文字列もrotate()関数に対応しています。
詳しくは、回転の単元で説明します。
circle要素で表します。circleでは、円の形を中心点の座標位置と半径のペアで表します。
polygon要素で表します。英語の polygon ポリゴンとは、日本語で「多角形」を意味します。
下記のコード例では座標 (0,100)、(50,0)、(100,100) を結んだ三角形を表示します。
の書式です。
なお、閉じていない単なる折れ線を描画したい場合には、polygon 要素ではなく polyline (ポリライン)要素を使います。

polyline (ポリライン)要素で折れ線を書けますが、fill属性およびstroke属性が必要です。 どのブラウザでも、fillの指定が無いと、塗りつぶしをしてしまいます。
また、fillをnoneにしたあとは、strokeが設定の無い限りストローク色も無しになってしまい描画されない状態なので、strokeも再設定する必要があります。
折れ線の内部の、それぞれの曲がりのある角の箇所での描画方法を指定できます。
線の太さ(stroke-width)の範囲内で、角を丸めるか(round)、尖らすか(miter)、面取り(bevel)をするかを指定できます。
何も指定ない場合には、miterで描画するように設定されています。
SVGのこれらの機能は、あくまで線の太さの範囲内でしか、処理を行えません。(つまり、たとえば製図ソフト AutoCAD のような面取り・フィレットは、SVGのこれらの指定では出来ないです。) また、その折れ線の内部のすべての曲がり箇所で、同様の曲がり具合(あるいは尖り具合)で描画します。

stroke-linejoin属性によって、"round"または"miter"または"bevel"を指定します。

stroke-dasharray(ストローク・ダッシュ アレイ)属性を使って、破線などを描くことができます。
書式は
といったふうに、描く部分と描かない部分との繰り返しです。

SVGのTEXT要素は、テキストを描画するために使用されます。具体的には、SVGにテキストを配置するために使用され、さまざまなスタイル、フォント、配置オプションを指定することができます。
以下は、TEXT要素の使い所の例です。
文字列の開始位置は、左下です。左上ではないので、注意してください。
追加の属性として、
など、設定できます。

まず、基準の図形として、回転していない図形の描画をしましょう。
この図形をたとえば斜めに傾かせたい場合、回転させる図形のタグの属性において
の書式で属性を追記することで、回転を指定できます。
角度の単位は、直角を90度とする「度」単位です。(日本なら、小学校で習う角度の単位と同じです。)
なお、座標を指定しない場合、原点を中心として回転します。
たとえば上記コードなら、長方形の右上が10度持ちあがった図形になります。
長方形だけでなく、楕円や折れ線や多角形など他の図形でも、この方法で回転が可能です。
また、textタグの文字列も同様に、この方法で回転が可能です。
g タグを用いて、gタグ内のオブジェクトに共通する属性を一括で記述できます。このような仕組みをSVG用語では一般に「グループ化」といいます。
たとえば上のコードの場合、長方形と円との両方に、ストロ-ク色を青に指定し、内側の塗りつぶし色を白に指定と、一括で指定しています。
なお、各オブジェクトにgタグの指定内容と矛盾する属性がある場合、普通は各オブジェクト側の指定が優先されます。たとえばcircleタグで stroke="red" という指定と、gタグの開始タグで stroke="blue" があれば、円のストローク色は赤色で表示されます。(Firefox, google Chrome, Microsoft Edge どれも結果は同じく、円ストロークだけ赤色の結果です。WindowsだけでなくLinuxでも同様の結果です。 )

SVGとCSSは、Webページで視覚的なデザインを行うために広く使用されています。CSSは、HTML要素のスタイルを設定することができますが、SVG要素にも同様のスタイルを設定することができます。SVG要素にCSSを適用するには、SVG要素にIDやクラスを割り当て、それらをCSSセレクタで参照する必要があります。
例えば、以下のSVGファイルは、<circle>要素にIDを割り当て、CSSセレクタで参照して、円の色や大きさを変更しています。
この例では、CSSのセレクタ #myCircle が、IDが myCircle である要素に適用されています。fill プロパティは円の内部の色を設定し、r プロパティは円の半径を変更しています。
SVG要素に適用できるCSSプロパティは、HTML要素に適用できるCSSプロパティと同様です。しかし、SVG要素にはHTML要素にはない独自のプロパティもあります。例えば、stroke-dasharray プロパティは、SVGの線要素に適用することができ、線の点線や破線を設定することができます。
また、SVG要素にCSSを適用することで、SVG要素をアニメーションさせることもできます。例えば、以下のSVGファイルは、RECT要素にクラスを割り当て、CSSでアニメーションを設定しています。
SVGでは、要素に対してタイトルや解説などの情報を付加することができます。例えば、以下のように記述します。
タイトルは、title要素で記述します。一方、解説はdesc要素で表します。これらの要素は、SVG内のどこにでも記述することができますが、一般的にはsvg開始タグの直後に記載するのが慣例です。
ただし、ブラウザによっては、title要素の内容が表示されない場合があります。また、ファイル名に対する情報として表示される場合もあります。

SVGは、XMLベースのベクター画像フォーマットであり、Webページやアプリケーションなどで利用されます。SVGを使用することで、高品質でスケーラブルな図形を簡単に作成することができます。SVGはHTMLと同様にタグと属性を使用して要素を定義し、CSSやJavaScriptと組み合わせて操作することができます。