SVGの記述方法を調べてみたのでまとめておきます。
基本的な記述
SVGで200px×100pxの四角形を描画してみます。
HTML
<svg> <rect width="200" height="100" fill="#999"/> </svg>
SVGの基本的な記述のデモページ1
svgタグの中に四角形を描画するrectタグを記述して、widthとheightでサイズ指定、fillで塗りつぶしの色を指定しています。
次に、上記の四角形を画面幅に引き延ばしてみます。
HTML
<svg width="100%" viewBox="0 0 200 100"> <rect width="200" height="100" fill="#999"/> </svg>
SVGの基本的な記述のデモページ2
rectタグはそのままで、svgタグにwidthとviewBoxを指定しました。
widthはSVG自体のサイズを指定するもので、viewBoxはSVGに表示する領域を指定します。
上記の場合、座標0,0の位置から200,100の位置までをSVGに表示させるようになります。
viewBox="X軸開始位置 Y軸開始位置 X軸終了位置 Y軸終了位置" | SVGに描画する範囲を指定。 SVGのサイズに合わせて中身を拡大・縮小できる。 |
---|
色々な描画する記述
直線や円形などを描画する記述を見てみます。
rect
四角形を描画します。
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <rect width="100" height="200" x="20" y="50" fill="blue"/> <rect width="300" height="150" x="150" y="50" rx="50" ry="30" fill="green"/> </svg>
width | 幅の指定。 |
---|---|
height | 高さの指定。 |
x | 四角形の左上のX座標を指定。 |
y | 四角形の左上のY座標を指定。 |
rx | 四隅を角丸にする際のX方向のサイズを指定。 |
ry | 四隅を角丸にする際のY方向のサイズを指定。 |
line
2つの座標から直線を描画します。
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <line x1="50" y1="50" x2="350" y2="200" stroke="blue"/> </svg>
x1 | 直線開始位置のX座標を指定。 |
---|---|
y1 | 直線開始位置のY座標を指定。 |
x2 | 直線終了位置のX座標を指定。 |
y2 | 直線終了位置のY座標を指定。 |
circle
円を描画します。
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <circle cx="150" cy="150" r="100" fill="blue"/> </svg>
cx | 円の中心のX座標を指定。 |
---|---|
cy | 円の中心のY座標を指定。 |
r | 円の半径を指定。 |
ellipse
楕円を描画します。
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <ellipse cx="250" cy="150" rx="200" ry="100" fill="blue"/> </svg>
cx | 円の中心のX座標を指定。 |
---|---|
cy | 円の中心のY座標を指定。 |
rx | 円のX方向の半径を指定。 |
ry | 円のY方向の半径を指定。 |
polyline
複数の座標から直線を描画します。
主にパスが開いた図形を描画したいときに使用します。
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <polyline points="40,40 200,140 160,180 120,160" stroke="blue" fill="none"/> </svg>
points="X1,Y1 X2,Y2 …" | 座標を複数指定。 座標の値の間は,で、各座標の間は半角スペースで区切る。 |
---|
polygon
複数の座標から直線を描画します。
polylineと違い、開始の座標と終了の座標を自動で繋げるので、パスが閉じた図形を描画したいときに使用します。
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <polygon points="40,40 200,140 160,180 120,160" stroke="blue" fill="none"/> </svg>
points="X1,Y1 X2,Y2 …" | 座標を複数指定。 座標の値の間は,で、各座標の間は半角スペースで区切る。 |
---|
path
主に複雑な図形を描画したいときなどに使用します。
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <path d="M100,50 l-75,75 h50 v50 h50 v-50 h50 l-75,-75" stroke="blue" fill="none"/> <path d="M300,50 L250,100 300,150 C350,150 250,150 200,100 S200,150 200,50 a20,20 -30 0 1 50,-25 z" stroke="green" fill="none"/> </svg>
d | パスの座標などを複数指定。 先頭につける半角英字によって内容が異なり、座標の値の間は,で、各座標の間は半角スペースで区切る。 半角英字の種類はMoveto, Lineto, Curveto, Arcto, ClosePathがあり、大文字の場合は絶対座標、小文字の場合は相対座標となる。
|
---|
text
textタグ内に描画したいテキストを指定して、テキストを描画します。
任意のテキストをtspanタグで括ることで、別の見た目や位置などに調整できます。
また、textPathタグを使用することで、テキストを指定したパスに沿って配置することもできます。
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <text x="50" y="50" id="text">サンプルテキスト</text> <text x="50" y="100" id="text" font-size="24" font-weight="bold" font-family="serif" font-style="italic">フォントの装飾</text> <text x="50" y="150">サン<tspan dy="-5">プ</tspan><tspan dy="10">ル</tspan><tspan dy="-5">テキスト</tspan></text> <text x="240" y="40" text-anchor="start">ABC</text> <text x="240" y="80" text-anchor="middle">ABC</text> <text x="240" y="120" text-anchor="end">ABC</text> <text x="300" y="50" rotate="45">文字の回転</text> <text x="50" y="200" textLength="200">文字の間隔</text> <defs> <path id="path" d="M50,250 h50 l50,20 50,-20 h100"> </defs> <text> <textPath xlink:href="#path">テキストのパスを指定するサンプル</textPath> </text> </svg>
x | テキスト左上のX座標を指定。 |
---|---|
y | テキスト左上のY座標を指定。 |
dx | X座標を移動。 |
dy | Y座標を移動。 |
text-anchor | 指定した方法でテキストを整列させる。 startは指定座標からテキスト開始、middleは指定座標をテキスト中央に、endは指定座標でテキストが終わるようにする。 |
rotate | テキストを1文字ずつ回転する。 |
textLength | 文字間の間隔を調整 |
xlink:href | textPathタグに使用して、パスを指定する。 |
image
画像を描画します。
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <image xlink:href="01.jpg" width="200" height="150" x="0" y="0" /> </svg>
width | 幅の指定。 |
---|---|
height | 高さの指定。 |
x | 画像左上のX座標を指定。 |
y | 画像左上のY座標を指定。 |
xlink:href | ファイルパスの指定。 |
少し特殊な描画の記述
上記と少し異なる描画の記述を見てみます。
g
オブジェクトをグループ化します。
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <g stroke="red" stroke-width="5"> <rect width="100" height="280" x="20" y="50" fill="blue"/> <rect width="300" height="100" x="150" y="50" fill="green"/> <rect width="300" height="150" x="150" y="180"/> </g> </svg>
use
図形のコピーを別の場所に描画します。
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <rect id="rect" width="50" height="50" x="50" y="20" fill="blue"/> <use xlink:href="#rect" x="100"/> <g id="g"> <rect width="50" height="100" x="20" y="100" fill="blue"/> <rect width="100" height="50" x="100" y="100" fill="green"/> </g> <use xlink:href="#g" y="120"/> </svg>
xlink:href | コピー元の指定。 |
---|
symbol
図形をシンボルとして定義します。
定義した時点ではSVGに表示されないので、useを使って呼び出して描画します。
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <symbol id="symbol" viewBox="0 0 200 100"> <circle cx="50" cy="50" r="50" fill="blue"/> <circle cx="150" cy="50" r="50" fill="green"/> </symbol> <use xlink:href="#symbol" x="0" y="0" width="200" height="100"/> <use xlink:href="#symbol" x="0" y="100" width="100" height="50"/> </svg>
viewBox | 描画する範囲を指定。 |
---|
pattern
単体または複数の図形をパターンとして定義して、指定した図形の塗りや線として繰り返し描画することができます。
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <pattern id="pattern" x="0" y="0" width="20" height="20" patternUnits="userSpaceOnUse"> <rect width="5" height="5" x="5" y="5" fill="blue"/> <rect width="5" height="5" x="15" y="5" fill="green"/> <rect width="5" height="5" x="5" y="15" fill="red"/> <rect width="5" height="5" x="15" y="15" fill="yellow"/> </pattern> <rect width="200" height="100" fill="url(#pattern)"/> <pattern id="pattern2" width="10" height="10" patternUnits="userSpaceOnUse"> <polygon points="5 0 10 10 0 10"/> </pattern> <circle cx="60" cy="180" r="50" fill="url(#pattern2)"/> </svg>
xlink:href | 定義したパターンを使用する図形に対して指定。 |
---|
marker
line,polyline,polygon,pathタグに対して、markerタグで定義した矢印などを付けることができます。
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <marker id="arrow" viewBox="0 0 10 10" refX="1" refY="5" markerWidth="6" markerHeight="6" orient="auto"> <path d="M0,0 L10,5 0,10 z"/> </marker> <line x1="20" y1="80" x2="80" y2="20" stroke="black" stroke-width="2" marker-start="url(#arrow)" marker-end="url(#arrow)"/> <polyline points="100,80 150,20 200,20" fill="none" stroke="black" stroke-width="2" marker-mid="url(#arrow)"/> </svg>
markerWidth | マーカーの幅を指定。 |
---|---|
markerHeight | マーカーの高さを指定。 |
refX | マーカーを配置する際の中心になるX座標を指定。 |
refY | マーカーを配置する際の中心になるY座標を指定。 |
markerUnits |
strokeWidth:strokeの幅に合わせてマーカーを拡大・縮小する。初期値。 userSpaceOnUse:markerタグで指定したサイズで描画する。 |
orient | マーカーを回転させるかを指定。 数値で角度を指定するか、autoにして線の向きによって自動で回転させるかを指定できる。 |
marker-start | 最初の座標に配置するmarkerタグを指定。 |
marker-mid | 途中(最初と最後以外)の座標に配置するmarkerタグを指定。 |
marker-end | 最後の座標に配置するmarkerタグを指定。 |
linearGradient・radialGradient
linearGradientタグで線形、radialGradientタグで円形のグラデーションの塗りや線を指定します。
stopタグで途中の色などを指定します。
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <defs> <linearGradient id="sample1" x1="0" y1="0" x2="1" y2="1"> <stop offset="0" stop-color="#ff0000"/> <stop offset="0.5" stop-color="#00ff00"/> <stop offset="1" stop-color="#0000ff"/> </linearGradient> <radialGradient id="sample2" cx="0.5" cy="0.5" r="0.5"> <stop offset="0" stop-color="#ff0000"/> <stop offset="0.5" stop-color="#00ff00"/> <stop offset="1" stop-color="#0000ff"/> </radialGradient> </defs> <rect width="200" height="200" fill="url(#sample1)"/> <rect width="200" height="200" x="250" y="0" fill="url(#sample2)"/> </svg>
x1 | グラデーション開始位置のX座標を指定。 linearGradientに使用。 |
---|---|
y1 | グラデーション開始位置のY座標を指定。 linearGradientに使用。 |
x2 | グラデーション終了位置のX座標を指定。 linearGradientに使用。 |
y2 | グラデーション終了位置のY座標を指定。 linearGradientに使用。 |
cx | グラデーションの中心のX座標を指定。 radialGradientに使用。 |
cy | グラデーションの中心のY座標を指定。 radialGradientに使用。 |
r | グラデーションの半径を指定。 radialGradientに使用。 |
fx | グラデーションの焦点のX座標を指定。 radialGradientに使用。 |
fy | グラデーションの焦点のY座標を指定 radialGradientに使用。 |
xlink:href | すでに作成しているグラデーションを参照。 linearGradient・radialGradientに使用。 |
offset | stop-colorやstop-opacityを適用する位置を指定。 stopに使用。 |
stop-color | 色を指定。 stopに使用。 |
stop-opacity | 透明度を指定。 stopに使用。 |
塗りや線の属性の記述
すでに今まででも使っていますが、塗り(fill)や線(stroke)を指定する記述を見てみます。
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <rect width="100" height="100" x="20" y="20" fill="#0000ff"/> <rect width="100" height="100" x="140" y="20" fill="#0000ff" stroke="#ff0000" stroke-width="10"/> <rect width="100" height="100" x="260" y="20" fill="#0000ff" fill-opacity="0.5" stroke="#ff0000" stroke-width="10"/> <rect width="100" height="100" x="380" y="20" fill="#0000ff" stroke="#ff0000" stroke-width="10" stroke-opacity="0.5"/> <rect width="100" height="100" x="20" y="140" fill="#0000ff" stroke="#ff0000" stroke-width="4" stroke-dasharray="10,2"/> <rect width="220" height="100" x="140" y="140" fill="#0000ff" stroke="#ff0000" stroke-width="4" stroke-dasharray="10,2,10,15"/> <line x1="380" y1="140" x2="480" y2="140" stroke="blue" stroke-width="10" stroke-linecap="butt"/> <line x1="380" y1="170" x2="480" y2="170" stroke="blue" stroke-width="10" stroke-linecap="round"/> <line x1="380" y1="200" x2="480" y2="200" stroke="blue" stroke-width="10" stroke-linecap="square"/> <path d="M380,140 h100 M380,170 h100 M380,200 h100" stroke="white"/> <rect width="100" height="100" x="20" y="260" fill="#0000ff" stroke="#ff0000" stroke-width="10" stroke-linejoin="miter"/> <rect width="100" height="100" x="140" y="260" fill="#0000ff" stroke="#ff0000" stroke-width="10" stroke-linejoin="round"/> <rect width="100" height="100" x="260" y="260" fill="#0000ff" stroke="#ff0000" stroke-width="10" stroke-linejoin="bevel"/> </svg>
fill | 塗りつぶしの色を指定。 |
---|---|
fill-opacity | 塗りつぶしの透明度を指定。 |
stroke | 枠線の色を指定。 |
stroke-width | 枠線の幅を指定。 |
stroke-opacity | 枠線の透明度を指定。 |
stroke-dasharray | 枠線を点線にする際の点線の間隔を指定。 stroke-dasharray=”10,2″ で点線の長さ10px、点線の間隔2pxになる。 |
stroke-linecap | 線の端をどう処理するか指定。 butt:図形の端で終了する。 round:図形の端から線幅の半分だけ伸ばす。 square:端を丸める。 |
stroke-linejoin | 多角形の角をどう処理するか指定。 miter:尖らせる。 round:丸める。 bevel:面取り。 |
styleやscriptをSVG内で使用する
各図形に適用する塗りや線はstyleで指定することもできます。
styleやscriptをSVG内で使用する場合、defsタグの中に記述していきます。
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <defs> <style type="text/css"> /* <![CDATA[ */ #sample { fill: red; stroke: blue; stroke-width: 5; stroke-dasharray: 10,4; } /* ]]> */ </style> <script type="text/javascript"> // <![CDATA[ window.onload = function() { var sample = document.getElementById('sample'); setInterval(function() { var sampleW = parseFloat(sample.getAttribute('width')); if(sampleW <= 480) { sample.setAttribute('width', sampleW + 1); } else { sample.setAttribute('width', 150); } }, 20); }; // ]]> </script> </defs> <rect width="150" height="150" x="10" y="10" id="sample"/> </svg>
defsタグの中でstyle・scriptタグを記述し、その中を
defsタグはstyle・scriptだけでなく、linearGradientやmarker、patternなどを定義する場合にも中に記述できます。
リンクの指定
SVG内でリンクを設定します。
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <a xlink:href="https://www.google.co.jp/" target="_blank"> <text x="50" y="50">サンプルテキスト</text> </a> </svg>
図形の変形
transformを使って図形を変形します。
使い方はCSS3のtransformとほぼ同じですが、基準座標が図形の左上ではなくSVGの左上?のようなので、XやYで位置をしている場合は位置の調整がしにくいかもしれません。
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <rect width="100" height="100" fill="red" transform="translate(20,20)"/> <rect width="100" height="100" x="100" y="20" fill="blue" transform="skewX(30)"/> <rect width="100" height="100" x="20" y="100" fill="green" transform="skewY(30)"/> <rect width="100" height="100" x="100" y="100" fill="yellow" transform="rotate(45)"/> <rect width="100" height="100" x="100" y="100" fill="black" transform="scale(1.5,2)"/> </svg>
transform="translate(X[,Y)"] | 図形をX,Yの値だけ移動する。 |
---|---|
transform="skewX(a)" | X軸を基準にaの角度傾いた平行四辺形状に変形する。 |
transform="skewY(a)" | Y軸を基準にaの角度傾いた平行四辺形状に変形する。 |
transform="rotate(a)" | aの角度回転する。 |
transform="scale(X[,Y])" | 図形をX,Yだけ拡大・縮小する。 |
アニメーションの記述
図形をアニメーションさせる記述を見てみます。
animate
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <rect width="0" height="20" fill="red"> <animate attributeName="width" attributeType="XML" from="0" to="200" dur="2s" repeatCount="indefinite"/> </rect> <rect id="animate" width="50" height="20" y="40" fill="blue"/> <animate xlink:href="#animate" attributeName="width" attributeType="XML" from="50" by="150" dur="2s" begin="1s" repeatCount="indefinite"/> <rect width="60" height="60" x="220"> <animate attributeName="fill" attributeType="XML" values="red; blue; green; red" dur="6s" repeatCount="indefinite"/> </rect> <path d="M20,80 l40,0 0,40 -40,0 0,-40" fill="green"> <animate attributeName="d" attributeType="XML" values="M20,80 l40,0 0,40 -40,0 0,-40; M40,80 l20,20 -20,20 -20,-20 20,-20; M20,80 l40,0 0,40 -40,0 0,-40" dur="4s" repeatCount="indefinite"/> <animate attributeName="fill" attributeType="XML" values="green; red; green" dur="4s" repeatCount="indefinite"/> </path> <rect width="0" height="20" y="140" fill="#000000"> <animate attributeName="width" attributeType="XML" values="0; 20; 100; 140; 200" dur="4s" repeatCount="indefinite"/> </rect> <rect width="0" height="20" y="180" fill="#333333"> <animate attributeName="width" attributeType="XML" values="0; 20; 100; 140; 200" dur="4s" repeatCount="indefinite" calcMode="discrete"/> </rect> <rect width="0" height="20" y="220" fill="#666666"> <animate attributeName="width" attributeType="XML" values="0; 20; 100; 140; 200" dur="4s" repeatCount="indefinite" calcMode="linear"/> </rect> <rect width="0" height="20" y="260" fill="#999999"> <animate attributeName="width" attributeType="XML" values="0; 20; 100; 140; 200" dur="4s" repeatCount="indefinite" calcMode="paced"/> </rect> <rect width="0" height="20" y="300" fill="#cccccc"> <animate attributeName="width" attributeType="XML" values="0; 20; 100; 140; 200" dur="4s" repeatCount="indefinite" keyTimes="0; 0.1; 0.5; 0.7; 1"/> </rect> <circle cx="320" cy="20" r="10" fill="red"> <animate id="animate2" attributeName="cy" attributeType="XML" from="20" to="100" begin="0s; animate3.end" dur="2s"/> </circle> <circle cx="350" cy="100" r="10" fill="blue"> <animate id="animate3" attributeName="cy" attributeType="XML" from="100" to="20" begin="animate2.end" dur="2s"/> </circle> <circle cx="380" cy="40" r="10" fill="green"> <animate id="animate4" attributeName="cy" attributeType="XML" from="40" to="100" begin="indefinite" dur="2s" restart="whenNotActive"/> </circle> <a xlink:href="#animate4"> <text x="365" y="20">移動</text> </a> <circle cx="425" cy="40" r="10" fill="yellow"> <animate attributeName="cy" attributeType="XML" from="40" to="100" begin="text.mouseover" dur="2s"/> </circle> <text id="text" x="410" y="20">移動</text> <rect width="50" height="50" x="300" y="150" fill="red"> <animate attributeName="fill" begin="mouseover" end="mouseout" fill="freeze" values="red; blue; green; red" dur="4s"/> </rect> </svg>
パスをアニメーションさせる場合、頂点の数は同じにする必要があります。
attributeName | アニメーションさせる属性を指定。 |
---|---|
attributeType | attributeNameで指定した属性がXMLかCSSかを指定。 |
from | アニメーション開始時の値を指定。 |
to | アニメーション終了時の値を初期値からの差分で指定。 |
by | アニメーション終了時の値を指定。 |
values | アニメーションの通過地点を複数指定したい場合に使用。 値の間は「;」で区切る。 |
begin | 何秒後にアニメーションを開始するかを指定。 指定は数値+sでマイナスの値も指定できる。 mouseoverやmouseoutなど、イベントでも開始タイミングを指定できる。 id.beginやid.endとすることで、指定したidのアニメーション開始時や終了時にアニメーションを実行。 id.eventとすることで、idにJavaScriptでのeventが発生したときにアニメーション実行。 indefiniteを指定しておき、aタグに対してxlink:href=”#id”のようにアニメーションのidを指定することで、aタグをクリックで実行。 |
end | 何秒後にアニメーションを終了するかを指定。 mouseoverやmouseoutなど、イベントでも終了タイミングを指定できる。 |
fill | アニメーション終了後の状態を指定。 removeで開始時の状態に戻す、freezeで終了時の状態を保持する。 |
dur | アニメーションさせる時間を指定。 |
repeatCount | アニメーションを何回繰り返すか指定。 ループさせる場合はindefiniteを指定する。 |
xlink:href | アニメーションする図形を指定。 |
calcMode | valuesでのアニメーションの際、間のアニメーションをどうするか指定。 discrete:アニメーションしない。 linear:各値の間を一定の時間にする。初期値。 paced:各値の間を一定の速度にする。 spline:不明。 |
keyTimes | valuesでの各値の間のアニメーション速度を個別に指定。 |
restart | 再度アニメーションを開始するタイミングを指定。 always:いつでも再開できる。初期値。 whenNotActive:アニメーション中でない時のみ再開できる。 never:1回のみのアニメーション? |
animateTransform
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <rect id="animate" width="50" height="50" fill="red"/> <animateTransform xlink:href="#animate" attributeName="transform" attributeType="XML" type="skewX" from="0" to="45" dur="2s" repeatCount="indefinite"/> <rect width="50" height="50" x="100" y="20" fill="blue"> <animateTransform attributeName="transform" attributeType="XML" type="rotate" from="0 125 45" by="360" dur="2s" begin="1s" repeatCount="indefinite"/> </rect> <rect width="50" height="50" x="20" y="70" fill="green"> <animateTransform attributeName="transform" attributeType="XML" type="translate" values="0,0; 50,50; 100,0; 150,50" dur="2s" repeatCount="indefinite"/> </rect> </svg>
attributeName | アニメーションさせる属性を指定。 |
---|---|
attributeType | attributeNameで指定した属性がXMLかCSSかを指定。 |
type | transformの種類を指定。 |
from | アニメーション開始時の値を指定。 |
to | アニメーション終了時の値を初期値からの差分で指定。 |
by | アニメーション終了時の値を指定。 |
values | アニメーションの通過地点を複数指定したい場合に使用。 値の間は「;」で区切る。 |
begin | 何秒後にアニメーションを開始するかを指定。 指定は数値+sでマイナスの値も指定できる。 mouseoverやmouseoutなど、イベントでも開始タイミングを指定できる。 id.beginやid.endとすることで、指定したidのアニメーション開始時や終了時にアニメーションを実行。 id.eventとすることで、idにJavaScriptでのeventが発生したときにアニメーション実行。 indefiniteを指定しておき、aタグに対してxlink:href=”#id”のようにアニメーションのidを指定することで、aタグをクリックで実行。 |
end | 何秒後にアニメーションを終了するかを指定。 mouseoverやmouseoutなど、イベントでも終了タイミングを指定できる。 |
fill | アニメーション終了後の状態を指定。 removeで開始時の状態に戻す、freezeで終了時の状態を保持する。 |
dur | アニメーションさせる時間を指定。 |
repeatCount | アニメーションを何回繰り返すか指定。 ループさせる場合はindefiniteを指定する。 |
xlink:href | アニメーションする図形を指定。 |
calcMode | valuesでのアニメーションの際、間のアニメーションをどうするか指定。 discrete:アニメーションしない。 linear:各値の間を一定の時間にする。初期値。 paced:各値の間を一定の速度にする。 spline:不明。 |
keyTimes | valuesでの各値の間のアニメーション速度を個別に指定。 |
restart | 再度アニメーションを開始するタイミングを指定。 always:いつでも再開できる。初期値。 whenNotActive:アニメーション中でない時のみ再開できる。 never:1回のみのアニメーション? |
animateMotion
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <path d="M10,110 A120,120 -45 0 1 110,10 A120,120 -45 0 1 10,110" stroke="black" stroke-width="2" fill="none" id="path"/> <circle cx="0" cy="0" r="6" fill="blue"> <animateMotion dur="4s" repeatCount="indefinite"> <mpath xlink:href="#path"/> </animateMotion> </circle> <rect width="10" height="10" x="0" y="0" fill="red"> <animateMotion path="M150,110 A120,120 -45 0 1 250,10 A120,120 -45 0 1 150,110" dur="4s" rotate="auto" repeatCount="indefinite"/> </rect> <circle cx="0" cy="0" r="6" fill="green"> <animateMotion path="M290,110 A120,120 -45 0 1 390,10 A120,120 -45 0 1 290,110" dur="4s" repeatCount="indefinite" calcMode="linear" keyPoints="0; 0.5; 1" keyTimes="0; 0.2; 1"/> </circle> </svg>
path | 図形が移動するパスを指定。 |
---|---|
begin | 何秒後にアニメーションを開始するかを指定。 指定は数値+sでマイナスの値も指定できる。 mouseoverやmouseoutなど、イベントでも開始タイミングを指定できる。 id.beginやid.endとすることで、指定したidのアニメーション開始時や終了時にアニメーションを実行。 id.eventとすることで、idにJavaScriptでのeventが発生したときにアニメーション実行。 indefiniteを指定しておき、aタグに対してxlink:href=”#id”のようにアニメーションのidを指定することで、aタグをクリックで実行。 |
end | 何秒後にアニメーションを終了するかを指定。 mouseoverやmouseoutなど、イベントでも終了タイミングを指定できる。 |
fill | アニメーション終了後の状態を指定。 removeで開始時の状態に戻す、freezeで終了時の状態を保持する。 |
dur | アニメーションさせる時間を指定。 |
rotate | 図形を回転させるかを指定。 autoの場合はパスの向きに合わせて自動で回転、auto-reverseの場合は反対を向くように回転。 |
repeatCount | アニメーションを何回繰り返すか指定。 ループさせる場合はindefiniteを指定する。 |
xlink:href | 図形が移動するパスを指定。 |
keyPoints | pathで指定しているパス全体を1として、パスを分割する。 |
calcMode | keyPointsを指定している際、間のアニメーションをどうするか指定。 discrete:アニメーションしない。 linear:各値の間を一定の時間にする。 paced:各値の間を一定の速度にする。初期値。 spline:不明。 |
keyTimes | keyPointsでの各値の間のアニメーション速度を個別に指定。 |
restart | 再度アニメーションを開始するタイミングを指定。 always:いつでも再開できる。初期値。 whenNotActive:アニメーション中でない時のみ再開できる。 never:1回のみのアニメーション? |
clipPathの指定
クリッピングパスを指定してみます。
HTML
<svg width="500" height="500" viewBox="0 0 500 500"> <clipPath id="sample1"> <circle cx="100" cy="75" r="50"/> </clipPath> <image xlink:href="01.jpg" width="200" height="150" x="0" y="0" clip-path="url(#sample1)"/> <clipPath id="sample2"> <text x="250" y="70" font-size="30px" font-weight="bold">サンプル</text> <text x="250" y="100" font-size="30px" font-weight="bold">テキスト</text> </clipPath> <image xlink:href="01.jpg" width="200" height="150" x="200" y="0" clip-path="url(#sample2)"/> <mask id="sample3"> <circle cx="50" cy="200" r="50" fill="#cccccc"/> <rect width="150" height="100" x="50" y="200" fill="#333333"/> </mask> <image xlink:href="01.jpg" width="200" height="150" x="0" y="150" mask="url(#sample3)"/> </svg>
clip-path | クリッピングマスクで使用する要素の指定。 |
---|---|
mask | マスクで使用する要素の指定。 |
filterの指定
フィルターは量が多そうなので、いくつかピックアップして試してみます。
HTML
<svg width="650" height="500" viewBox="0 0 650 500"> <image xlink:href="01.jpg" width="200" height="150" x="0" y="0" /> <filter id="sample1" x="0" y="0" width="200" height="150"> <feGaussianBlur stdDeviation="3" /> </filter> <image xlink:href="01.jpg" width="200" height="150" x="220" y="0" filter="url(#sample1)" /> <filter id="sample2" x="0" y="0" width="200" height="150"> <feColorMatrix type="hueRotate" values="30" /> </filter> <image xlink:href="01.jpg" width="200" height="150" x="440" y="0" filter="url(#sample2)" /> <filter id="sample3" x="0" y="0" width="200" height="150"> <feColorMatrix type="saturate" values="0" /> </filter> <image xlink:href="01.jpg" width="200" height="150" x="0" y="170" filter="url(#sample3)" /> <filter id="sample4" x="0" y="0" width="200" height="150"> <feComponentTransfer> <feFuncR type="linear" slope="0.5" intercept="0.6"/> <feFuncG type="linear" slope="0" intercept="0"/> <feFuncB type="linear" slope="0.5" intercept="0.25"/> </feComponentTransfer> </filter> <image xlink:href="01.jpg" width="200" height="150" x="220" y="170" filter="url(#sample4)" /> <filter id="sample5" x="0" y="0" width="200" height="150"> <feComponentTransfer> <feFuncR type="gamma" amplitude="2" exponent="4" offset="0"/> <feFuncG type="gamma" amplitude="2" exponent="2" offset="0"/> <feFuncB type="gamma" amplitude="2" exponent="1" offset="0"/> </feComponentTransfer> </filter> <image xlink:href="01.jpg" width="200" height="150" x="440" y="170" filter="url(#sample5)" /> <filter id="sample6" x="0" y="0" width="200" height="150"> <feMorphology operator="erode" in="SourceGraphic" radius="3"/> </filter> <image xlink:href="01.jpg" width="200" height="150" x="0" y="340" filter="url(#sample6)" /> <filter id="sample7" x="0" y="0" width="200" height="150"> <feMorphology operator="dilate" in="SourceGraphic" radius="3"/> </filter> <image xlink:href="01.jpg" width="200" height="150" x="220" y="340" filter="url(#sample7)" /> <filter id="sample8" x="0" y="0" width="200" height="150"> <feTurbulence type="turbulence" baseFrequency="0.05" numOctaves="2"/> </filter> <image xlink:href="01.jpg" width="200" height="150" x="440" y="340" filter="url(#sample8)" /> </svg>
filter | フィルターで使用する要素の指定。 |
---|---|
stdDeviation | ぼかしを指定。 |
type | フィルターの種類を指定。 |
最後の方力尽きてしまいましたが、そのうち残っているSVGの要素や属性も試してみたいと思います。
【参考サイト】
- SVG 要素リファレンス – SVG | MDN
- SVG 属性リファレンス – SVG | MDN
- SVG入門 (全14回) – プログラミングならドットインストール
- パス – SVG 1.1 (第2版)
- Webグラフィックをハックする(3):SVGで図形やアニメを描画してみよう (1/5) – @IT
- SVGモーフィングで、図形を徐々に変化させてみよう | Webクリエイターボックス
コメントが承認されるまで時間がかかります。