【SVG】20パターン検証!svgのwidth・height属性を徹底分析!~前半~

前の記事でsvgの「width」「height」属性とcssで指定した基本的な場合を見ました。本記事ではsvgの「width」「height」属性についてピックアップします。「width」と「height」の組み合わせを20パターン試してみて理解を深めたいと思います。

目次(SVGについて複数ページ書いてます)

検証で使用するsvg(幅200px、高さ200px)

検証用に下記のような図形を使用します。
どの部分が抜き出されているか、拡大・縮小はどうなっているか、見た感じで分かりやすいように考えました。下記をご覧ください。一通り説明します。

  • SVGの幅・高さはともに200px
  • 4色の正方形。サイズは全て同じで幅100×高さ100
  • 左上に赤色の正方形(座標は x=0, y=0)
  • 右上に青色の正方形(座標は x=100, y=0)
  • 左下に黄色の正方形(座標は x=0, y=100)
  • 右下に黒色の正方形(座標は x=100, y=100)
  • 白い縦線・横線を10間隔で格子状の白い縦線・横線(各19本)

svgソースを見る[クリックすると開きます]

<svg class="square" width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg" version="1.1">
 <!-- 正方形 -->
 <rect x="0" y="0" width="100" height="100" fill="red" />
 <rect x="100" y="0" width="100" height="100" fill="blue" />
 <rect x="0" y="100" width="100" height="100" fill="yellow" />
 <rect x="100" y="100" width="100" height="100" fill="black" />
 <!-- 線(グリッド) --> 
 <line x1="0" y1="10" x2="200" y2="10" stroke="white" />
 <line x1="0" y1="20" x2="200" y2="20" stroke="white" />
 <line x1="0" y1="30" x2="200" y2="30" stroke="white" />
 <line x1="0" y1="40" x2="200" y2="40" stroke="white" />
 <line x1="0" y1="50" x2="200" y2="50" stroke="white" />
 <line x1="0" y1="60" x2="200" y2="60" stroke="white" />
 <line x1="0" y1="70" x2="200" y2="70" stroke="white" />
 <line x1="0" y1="80" x2="200" y2="80" stroke="white" />
 <line x1="0" y1="90" x2="200" y2="90" stroke="white" />
 <line x1="0" y1="100" x2="200" y2="100" stroke="white" />
 <line x1="0" y1="110" x2="200" y2="110" stroke="white" />
 <line x1="0" y1="120" x2="200" y2="120" stroke="white" />
 <line x1="0" y1="130" x2="200" y2="130" stroke="white" />
 <line x1="0" y1="140" x2="200" y2="140" stroke="white" />
 <line x1="0" y1="150" x2="200" y2="150" stroke="white" />
 <line x1="0" y1="160" x2="200" y2="160" stroke="white" />
 <line x1="0" y1="170" x2="200" y2="170" stroke="white" />
 <line x1="0" y1="180" x2="200" y2="180" stroke="white" />
 <line x1="0" y1="190" x2="200" y2="190" stroke="white" />
 <line x1="10" y1="0" x2="10" y2="200" stroke="white" />
 <line x1="20" y1="0" x2="20" y2="200" stroke="white" />
 <line x1="30" y1="0" x2="30" y2="200" stroke="white" />
 <line x1="40" y1="0" x2="40" y2="200" stroke="white" />
 <line x1="50" y1="0" x2="50" y2="200" stroke="white" />
 <line x1="60" y1="0" x2="60" y2="200" stroke="white" />
 <line x1="70" y1="0" x2="70" y2="200" stroke="white" />
 <line x1="80" y1="0" x2="80" y2="200" stroke="white" />
 <line x1="90" y1="0" x2="90" y2="200" stroke="white" />
 <line x1="100" y1="0" x2="100" y2="200" stroke="white" />
 <line x1="110" y1="0" x2="110" y2="200" stroke="white" />
 <line x1="120" y1="0" x2="120" y2="200" stroke="white" />
 <line x1="130" y1="0" x2="130" y2="200" stroke="white" />
 <line x1="140" y1="0" x2="140" y2="200" stroke="white" />
 <line x1="150" y1="0" x2="150" y2="200" stroke="white" />
 <line x1="160" y1="0" x2="160" y2="200" stroke="white" />
 <line x1="170" y1="0" x2="170" y2="200" stroke="white" />
 <line x1="180" y1="0" x2="180" y2="200" stroke="white" />
 <line x1="190" y1="0" x2="190" y2="200" stroke="white" />
</svg>

1.svgの「width」「height」属性の検証

まず、次の記事も含めた計20件の検証結果から分かったことを書いておきます。

  • 「width」「height」属性で指定したサイズがsvgの表示サイズとなる
  • 中の図(rectやline)のサイズは「width」「height」属性のうち小さい方に合わせて拡大縮小される
    ※svgの属性「preserveAspectRatio」の初期値が「xMidYMid meet」となっていて、その中の「meet」が設定されていることが上記のようになる理由です
  • 中の図(rectやline)の表示位置は縦横ともに中央表示される
    ※svgの属性「preserveAspectRatio」の初期値が「xMidYMid meet」となっていて、その中の「xMidYMid」が設定されていることが上記のようになる理由です
  • 「width」「height」属性の一方を指定していない場合、指定されている方に合わせて自動で拡大縮小される
  • 「width」「height」属性ともに指定されていない場合、表示可能な範囲いっぱいに拡大される

1-1.width=200、height=200(1倍)

引用:Firefoxの要素の検証
svg 中の図
200px 200px(設定は200)
高さ 200px 200px(設定は200)

「svg」と「中の図」が同じサイズです。値が同じなので当然の結果かと思います。

1-2.width=400、height=400(2倍)

引用:Firefoxの要素の検証
svg 中の図
400px 400px(設定は200)
高さ 400px 400px(設定は200)

「svg」と「中の図」が同じサイズです。中の図の指定は幅、高さともに「200px」ですがsvgに合わせて「400px」になりました。

1-3.width=100、height=100(0.5倍)

引用:Firefoxの要素の検証
svg 中の図
100px 100px(設定は200)
高さ 100px 100px(設定は200)

「svg」と「中の図」が同じサイズです。中の図の指定は幅、高さともに「200px」ですがsvgに合わせて「100px」になりました。

1-4.width=400、height=200(幅だけ2倍)

引用:Firefoxの要素の検証
svg 中の図
400px 200px(設定は200)
高さ 200px 200px(設定は200)

「svg」と「中の図」の高さは同じサイズで、幅はサイズが異なる結果になりました。中の図の指定は幅、高さともに「200px」ですがsvgの短い方(高さ)に合わせて「200px」のままでした。

1-5.width=200、height=400(高さだけ2倍)

引用:Firefoxの要素の検証
svg 中の図
200px 200px(設定は200)
高さ 400px 200px(設定は200)

「svg」と「中の図」の幅は同じサイズで、高さはサイズが異なる結果になりました。中の図の指定は幅、高さともに「200px」ですがsvgの短い方(幅)に合わせて「200px」のままでした。

1-6.width=100、height=200(幅だけ0.5倍)

引用:Firefoxの要素の検証
svg 中の図
100px 100px(設定は200)
高さ 200px 100px(設定は200)

「svg」と「中の図」の幅は同じサイズで、高さはサイズが異なる結果になりました。中の図の指定は幅、高さともに「200px」ですがsvgの短い方(幅)に合わせて「100px」になりました。

1-7.width=200、height=100(高さだけ0.5倍)

引用:Firefoxの要素の検証
svg 中の図
200px 100px(設定は200)
高さ 100px 100px(設定は200)

「svg」と「中の図」の高さは同じサイズで、幅はサイズが異なる結果になりました。中の図の指定は幅、高さともに「200px」ですがsvgの短い方(高さ)に合わせて「100px」になりました。

1-8.height=200(widthの指定なし)

引用:Firefoxの要素の検証
svg 中の図
200px(未設定) 200px(設定は200)
高さ 200px 200px(設定は200)

「svg」と「中の図」が同じサイズです。widthは指定していませんが、中の図が正方形ということでそれに合わせてsvgのwidthが自動設定されました。

1-8(追加検証1)viewBox、中の図の幅・高さを400pxにする

追加検証として、viewBox、中の図の幅・高さを400pxにしてみます(各正方形の大きさを幅200px、高さ200pxにします。格子状の線のサイズは変えていません)。よって、svgの幅が自動で200pxになれば、中の図に依存する可能性が高いというわけです。

引用:Firefoxの要素の検証
svg 中の図
200px(未設定) 200px(設定は400)
高さ 200px 200px(設定は400)

予想したとおり、中の図に合わせてsvgの幅は200に設定されました。

1-8(追加検証2)viewBox、中の図の幅だけ400pxにする

念のため、追加検証として、viewBox、中の図の幅だけを400pxにしてみます(各正方形の大きさを幅200px、高さ100pxにします。格子状の線のサイズは変えていません)。よって、svgの幅が自動で400pxになれば、こちらの検証も予想どおりの結果となります。

引用:Firefoxの要素の検証
svg 中の図
400px(未設定) 400px(設定は400)
高さ 200px 200px(設定は200)

予想したとおり、中の図に合わせてsvgの幅は400に設定されました。

1-9.width=200(heightの指定なし)

引用:Firefoxの要素の検証
svg 中の図
200px 200px(設定は200)
高さ 200px(未設定) 200px(設定は200)

「svg」と「中の図」が同じサイズです。heightは指定していませんが、中の図が正方形ということでそれに合わせてsvgのheightが自動設定されました。

1-9(追加検証1)viewBox、中の図の幅・高さを400pxにする

追加検証として、viewBox、中の図の幅・高さを400pxにしてみます(各正方形の大きさを幅200px、高さ200pxにします。格子状の線のサイズは変えていません)。よって、svgの幅が自動で200pxになれば、中の図に依存する可能性が高いというわけです。
※1-8の方でもやりましたが、一応高さの方も検証

引用:Firefoxの要素の検証
svg 中の図
200px 200px(設定は400)
高さ 200px(未設定) 200px(設定は400)

予想したとおり、中の図に合わせてsvgの高さは200に設定されました。

1-9(追加検証2)viewBox、中の図の高さだけ400pxにする

念のため、追加検証として、viewBox、中の図の高さだけを400pxにしてみます(各正方形の大きさを幅100px、高さ200pxにします。格子状の線のサイズは変えていません)。よって、svgの高さが自動で400pxになれば、こちらの検証も予想どおりの結果となります。
※1-8の方でもやりましたが、一応高さの方も検証

引用:Firefoxの要素の検証
svg 中の図
200px 200px(設定は200)
高さ 400px(未設定) 400px(設定は400)

予想したとおり、中の図に合わせてsvgの高さは400に設定されました。

svgの「width」「height」属性のいろいろな組み合わせを検証(後半)

少し長くなってきましたので、記事を分けます。引き続きsvgの「width」「height」属性について検証していきます。