JINMUSOFTWARE

SVGのサイズの知識

SVG(Scalable Vector Graphics)タグの簡単なお勉強

SVGタグの使い方

次のようなコードを書くと青い丸が表示されます。

<svg width="100" height="100" viewBox="0 0 100 100" style="background: #eee">
    <circle cx="50" cy="50" r="50" fill="blue" />
</svg>

ちなみにsvgタグはインライン要素です。

width, height

width, height は、ブラウザに表示するサイズの大きさを定義します。

viewbox

viewBox=”基点X 基点Y サイズX サイズY”

viewbox は、SVGで描画されている空間からどの範囲をClipするかを指定します。

viewBoxの数字の区切りは空白、カンマを使用できます。sampleを見ると空白を使用しているほうが多い印象ですね。

viewBoxとは

表示域をClipします。

<svg width="300" height="300" viewBox="0 0 300 300" style="background: #eee">
    <circle cx="50" cy="50" r="50" fill="blue" />
</svg>

width=”300″ height=”300″ …300pxの表示するサイズです。

viewBox=”0 0 300 300″ …0~300の範囲を表示します。

circle cx=”50″ cy=”50″ r=”50″ …x:50,y:50 に、半径50の円を描きます。

50pxでブラウザに描画されるかは、表示サイズやviewBox次第。

viewBox=”0 0 100 100″ に変更。

viewBox=”0 0 50 50″ に変更。

見える範囲が狭くなりましたね。円の左上部だけ見えています。

viewBox=”50, 50, 200, 200″…円の中心座標から200pxの大きさの窓です。円の右下が小さく見えています。

もう一つの例は、viewBox=”50, 50, 2000, 2000″です。

viewBoxを動かしてみる

x座標の基点を動かしてみました。

viewBox=”x 0 200 200″ …xを変更します。

viewBoxが、右シフトしていますね。円は左に見切れていっています。カメラを右にパンした感じですね。

0 0 200 200 10 0 200 200 50 0 200 200 100 0 200 200 100 0 200 200

ちょっと関係無いんですけど、ソースコードも見ていください。textタグもviewBoxに合わせて移動させています。移動させないとtextも見切れてしまいます。

viewBoxを10px右に移動したSample

<svg width="200" height="200" viewBox="10 0 200 200" style="background: #eee">
  <circle cx="50" cy="50" r="50" fill="blue" />
  <text x="10" y="90%" font-size="1rem" fill="green">10 0 200 200</text>
</svg>

width,heightとは

表示されるサイズを定義します。

20px, 50px 100pxで表示してみました。

Aspect比の確認。中央寄りに配置されますね。

width, height, viewboxが未定義の場合

自動で300×150のサイズになるようです。FirefoxもChromeも同じサイズでした。

width, heightのみ定義

表示サイズが決まります。viewBoxは同じ範囲になります。

width=”100″ height=”100″

width=”200″ height=”200″

viewBoxのみ定義

viewBox=”0 0 100 100″

表示サイズは決まらずにStrechします。親要素の大きさまで伸縮します。

レスポンシブルでしょうか。

viewBox=”50 50 100 100″

percent

widthの指定に%は使えます。viewBoxには使用できないようです。

親divコンテナのサイズを適当に決めて、svgタグのサイズは100%を指定した例です。

親divにpadding:1remを指定しています。

.test-box1 {
    box-sizing: border-box;
    width: 100%;
    height: 20vh;
    padding: 1rem;
    background-color: cadetblue;
}
</style>
<div class="test-box1">
<svg
    width="100%"
    height="100%"
    viewBox="0 0 100 100"
    style="background: #eee"
>
    <circle cx="50" cy="50" r="50" fill="blue" />
</svg>

viewBoxのサイズが小さいと中央よりになるようですね。

viewBoxの拡縮

width=200 height=200 / cx=50 cy=50 r=50

viewBox=0 0 400 400 viewBox=0 0 200 200 viewBox=0 0 100 100 viewBox=0 0 100 200 中心に寄る viewBox=0 0 200 100 中心に寄る viewBox=10 10 80 80

viewBoxが小さい場合は中央に寄るようです。

ただし、viewBoxのサイズが小さいときは、そんなに直感的な配置でないと感じます。

viewBoxのサイズが小さい時

viewBoxのサイズが小さいと中央に寄ります。

width=”200″ height=”200″ / viewBox=”0, 0, x, 200″

viewBoxのx値を変更してみた。x : 200 → 0.1

200 150 100 50 10 1 0.1

viewBoxのxの幅が50より狭くなったときの挙動がよくわかりませんでした。

viewBoxのy座標の変更もx軸に影響したりするように見えてします。

そもそもよくわかないviewBoxの設定をしないようにしようと思います。

preserveAspectRatio

https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio

width=”200″ height=”200″ viewBox=”0, 0, 100, 200″

preserveAspectRatioを適当に設定してみます。

なし none xMinYMin xMaxYMax xMidYMid

viewBoxの比が、座標に影響しているかもしれません。

まぁでも、しっかりと理解できるサイズを設定すればいいですね。

preserveAspectRatio をSVGタグに付加するとアスペクトは保持されるようですね。

そもそも、viewBoxの比を保てばいいのだが、そうできないときもあるのかな?

memo

svgはinline。並べたときに隙間が出来たら、きっとそれは改行です。

svgは、ちょっと難しいかなと感じました。

link

SVG mdn

SVG教本 mdn

SCALABLE VECTOR GRAPHICS (SVG) w3c

An SVG Primer for Today’s Browsers w3c

Learning Inkscape Inkscapeはオープンソースで開発されているベクター画像編集ソフトウェアです。SVG関連の記述もあり。