ビューポート
図形を描画する領域のサイズです。
一番外側のsvgタグのwidth、heightで指定します。
(svgタグにposition:absoluteやposition:fixedが指定されていればpositionが優先されます)
ビューポートの単位
長さの単位は em, ex, px, pt, pc, cm, mm, in, %を利用できます。
単位を省略した場合はpxになります。
ビューボックス
viewBox属性
SVGの描画領域の定義に使います。
viewBoxで指定できる値は4つです。
viewBox="x, y, width, height"
(カンマか、半角スペースで区切る)
値 | 内容 |
---|---|
x | 左からのx座標の位置 |
y | 上からのy座標の位置 |
width | ビューポートの幅 |
height | ビューポートの高さ |
ビューポートとビューボックス
特別に理由が無ければビューポートとビューボックスのwidth, heightは揃えておいた方が扱いやすいです。
svgタグにwidth,height属性を指定せずviewBox属性のみを指定した場合、viewBoxのwidthとheightを、ビューポートのwidth、heightとして扱います。
<svg width="400" height="400" viewBox="0, 0, 400, 400" xmlns="http://www.w3.org/2000/svg">
<circle cx="50" cy="50" r="50" fill="blue" />
</svg>
preserveAspectRatio
preserveAspectRatio属性
preserveAspectRatio="align [meet|slice]"
svgタグには、何も指定しなくてもデフォルトで、preserveAspectRatio="xMidYMid meet"
が指定されています。
preserveAspectRatioの値
値 | 内容 |
---|---|
xMinYMin | 要素のviewBoxのxとviewportの最小のX値を揃える 要素のviewBoxのyとviewportの最小のY値を揃える |
xMidYMin | 要素のviewBoxの中間点のX値とviewportの中間点のX値を揃える 要素のviewBoxのyとviewportの最小のY値を揃える |
xMaxYMin | 要素のviewBoxのx+widthとviewportの最大のX値を揃える 要素のviewBoxのyとviewportの最小のY値を揃える |
xMinYMid | 要素のviewBoxのxとviewportの最小のX値を揃える 要素のviewBoxの中間点のY値とviewportの中間点のY値を揃える |
xMidYMid(デフォルト) | 要素のviewBoxの中間点のX値とviewportの中間点のX値を揃える 要素のviewBoxの中間点のY値とviewportの中間点のY値を揃える |
xMaxYMid | 要素のviewBoxのx+widthとviewportの最大のX値を揃える 要素のviewBoxの中間点のY値とviewportの中間点のY値を揃える |
xMinYMax | 要素のviewBoxのxとviewportの最小のX値を揃える 要素のviewBoxのy+heightとviewportの最大のY値を揃える |
xMidYMax | 要素のviewBoxの中間点のX値とviewportの中間点のX値を揃える 要素のviewBoxのy+heightとviewportの最大のY値を揃える |
xMaxYMax | 要素のviewBoxのx+widthとviewportの最大のX値を揃える 要素のviewBoxのy+heightとviewportの最大のY値を揃える |
none | 不均等にスケーリングし、ビューボックスをビューポートの四角形に一致させる オプションは無視される |
preserveAspectRatioのオプション
値 | 内容 |
---|---|
meet(デフォルト) | ビューポートとビューボックスの幅と高さを大きい方に合わせる(viewboxはviewport内に収まる) |
slice | ビューポートとビューボックスの幅と高さの小さい方に合わせる(viewboxがviewportからはみ出す場合がある) |
描画範囲の設定例
サンプル画像について
- 2つの円は半径50、中心点はそれぞれ(0,0)、(400,200)
- オレンジの四角はviewBoxのwidth、heightの指定と同じの幅と高さ
ビューポートとビューボックスの幅と高さが同じ場合
width | height | |
---|---|---|
ビューポート | 400 | 200 |
ビューボックス | 400 | 200 |
ビューポートとビューボックスの幅と高さが同じなのでビューボックスの範囲がビューポートと一致します。
ビューポートの左上と右下を中心にした円が1/4だけ描画されています。
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 400 200">
<rect x="0" y="0" width="400" height="200" fill="#e67e22" stroke="#EA2027" stroke-width="8px"/>
<circle cx="0" cy="0" r="50" fill="#333"/>
<circle cx="400" cy="200" r="50" fill="#888000"/>
</svg>
左上の円が完全に描画されるように、viewBoxの中心点を-50,-50に指定(円の半径が50pxのため)すると左上の円は全体が表示されましたが、右下の円は範囲外になり表示されなくなりました。
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="-50 -50 400 200">
<rect x="-50" y="-50" width="400" height="200" fill="#e67e22" stroke="#EA2027" stroke-width="8px"/>
<circle cx="0" cy="0" r="50" fill="#333"/>
<circle cx="400" cy="200" r="50" fill="#888000"/>
</svg>
ビューポートとビューボックスの数値は異なるが縦横比が同じ場合
ビューボックスの幅と高さがビューポートの倍の場合
width | height | |
---|---|---|
ビューポート | 400 | 200 |
ビューボックス | 800 | 400 |
ビューポートとビューボックスのサイズが等しい場合の4倍が描画範囲になります。 |
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 800 400">
<rect x="0" y="0" width="800" height="400" fill="#e67e22" stroke="#EA2027" stroke-width="8px"/>
<circle cx="0" cy="0" r="50" fill="#333"/>
<circle cx="400" cy="200" r="50" fill="#888000"/>
</svg>
ビューボックスの幅と高さがビューポートの半分の場合
width | height | |
---|---|---|
ビューポート | 400 | 200 |
ビューボックス | 200 | 100 |
ビューポートとビューボックスのサイズが等しい場合の1/4が描画範囲になります。(大きさは4倍) |
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 200 100">
<rect x="0" y="0" width="200" height="100" fill="#e67e22" stroke="#EA2027" stroke-width="8px"/>
<circle cx="0" cy="0" r="50" fill="#333"/>
<circle cx="400" cy="200" r="50" fill="#888000"/>
</svg>
ビューポートとビューボックスの縦横比が違う場合
viewportとviewboxの縦横比が一致していない場合、preserveAspectRatio属性が影響してきます。
初期値は"xMidYMid meet"です。
preserveAspectRatio="xMidYMid meet"でビューボックスの幅がビューポートの倍の場合
width | height | |
---|---|---|
ビューポート | 400 | 200 |
ビューボックス | 800 | 100 |
ビューボックスの幅が倍なので高さの割合が半分になり、xMidYMidの影響で中央寄せされています。 |
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 800 200" preserveAspectRatio="xMidYMid meet">
<rect x="0" y="0" width="800" height="200" fill="#e67e22" stroke="#EA2027" stroke-width="8px"/>
<circle cx="0" cy="0" r="50" fill="#333"/>
<circle cx="400" cy="200" r="50" fill="#888000"/>
</svg>
preserveAspectRatio="xMidYMid meet"でビューボックスの高さがビューポートの倍の場合
width | height | |
---|---|---|
ビューポート | 400 | 200 |
ビューボックス | 400 | 400 |
ビューボックスの高さが倍なので幅の割合が半分になり、xMidYMidの影響で中央寄せされています。 |
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet">
<rect x="0" y="0" width="400" height="400" fill="#e67e22" stroke="#EA2027" stroke-width="8px"/>
<circle cx="0" cy="0" r="50" fill="#333"/>
<circle cx="400" cy="200" r="50" fill="#888000"/>
</svg>
preserveAspectRatio="xMidYMid meet"でビューボックスの幅がビューポートの半分の場合
width | height | |
---|---|---|
ビューポート | 400 | 200 |
ビューボックス | 200 | 100 |
ビューボックスの幅が半分になり、xMidYMidの影響で中央寄せされています。(大きさは2倍) |
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 200 200" preserveAspectRatio="xMidYMid meet">
<rect x="0" y="0" width="200" height="200" fill="#e67e22" stroke="#EA2027" stroke-width="8px"/>
<circle cx="0" cy="0" r="50" fill="#333"/>
<circle cx="400" cy="200" r="50" fill="#888000"/>
</svg>
preserveAspectRatio="xMidYMid meet"でビューボックスの高さがビューポートの半分の場合
width | height | |
---|---|---|
ビューポート | 400 | 200 |
ビューボックス | 400 | 100 |
ビューボックスの高さの割合が半分になり、xMidYMidの影響で中央寄せされています。(大きさは2倍) |
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 400 100" preserveAspectRatio="xMidYMid meet">
<rect x="0" y="0" width="400" height="100" fill="#e67e22" stroke="#EA2027" stroke-width="8px"/>
<circle cx="0" cy="0" r="50" fill="#333"/>
<circle cx="400" cy="200" r="50" fill="#888000"/>
</svg>
preserveAspectRatio="none"でビューボックスの幅がビューポートの倍の場合
width | height | |
---|---|---|
ビューポート | 400 | 200 |
ビューボックス | 800 | 200 |
ビューポートの縦横比に合わせるために高さが2倍に引き伸ばされるので、図形が縦に伸びています。(縦だけ2倍) |
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 800 200" preserveAspectRatio="none">
<rect x="0" y="0" width="800" height="200" fill="#e67e22" stroke="#EA2027" stroke-width="8px"/>
<circle cx="0" cy="0" r="50" fill="#333"/>
<circle cx="400" cy="200" r="50" fill="#888000"/>
</svg>
preserveAspectRatio="none"でビューボックスの高さがビューポートの倍の場合
width | height | |
---|---|---|
ビューポート | 400 | 200 |
ビューボックス | 400 | 400 |
ビューポートの縦横比に合わせるために幅が2倍に引き伸ばされるので、図形が横に伸びています。(横だけ2倍) |
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 400 400" preserveAspectRatio="none">
<rect x="0" y="0" width="400" height="400" fill="#e67e22" stroke="#EA2027" stroke-width="8px"/>
<circle cx="0" cy="0" r="50" fill="#333"/>
<circle cx="400" cy="200" r="50" fill="#888000"/>
</svg>
preserveAspectRatio="none"でビューボックスの幅がビューポートの半分の場合
width | height | |
---|---|---|
ビューポート | 400 | 200 |
ビューボックス | 200 | 200 |
ビューポートの縦横比に合わせるために幅が2倍に引き伸ばされるので、図形が横に伸びています。(縦2倍、横4倍) |
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 200 200" preserveAspectRatio="none">
<rect x="0" y="0" width="200" height="200" fill="#e67e22" stroke="#EA2027" stroke-width="8px"/>
<circle cx="0" cy="0" r="50" fill="#333"/>
<circle cx="400" cy="200" r="50" fill="#888000"/>
</svg>
preserveAspectRatio="none"でビューボックスがビューポートの半分の場合(高さだけ)
width | height | |
---|---|---|
ビューポート | 400 | 200 |
ビューボックス | 400 | 100 |
ビューポートの縦横比に合わせるために、高さが2倍に引き伸ばされるので、図形が縦に伸びています。(縦4倍、横2倍) |
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 400 100" preserveAspectRatio="none">
<rect x="0" y="0" width="400" height="100" fill="#e67e22" stroke="#EA2027" stroke-width="8px"/>
<circle cx="0" cy="0" r="50" fill="#333"/>
<circle cx="400" cy="200" r="50" fill="#888000"/>
</svg>
preserveAspectRatio="xMinYMin meet"でビューボックスの幅がビューポートの倍の場合
width | height | |
---|---|---|
ビューポート | 400 | 200 |
ビューボックス | 800 | 200 |
ビューボックスの幅が倍なので高さの割合が半分になり、xMinYMinの影響で上寄せされています。 |
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 800 200" preserveAspectRatio="xMinYMin">
<rect x="0" y="0" width="800" height="200" fill="#e67e22" stroke="#EA2027" stroke-width="8px"/>
<circle cx="0" cy="0" r="50" fill="#333"/>
<circle cx="400" cy="200" r="50" fill="#888000"/>
</svg>
preserveAspectRatio="xMinYMin meet"でビューボックスの高さがビューポートの倍の場合
width | height | |
---|---|---|
ビューポート | 400 | 200 |
ビューボックス | 400 | 400 |
ビューボックスの高さが倍なので幅の割合が半分になり、xMinYMinの影響で左寄せされています。 |
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 400 400" preserveAspectRatio="xMinYMin">
<rect x="0" y="0" width="400" height="400" fill="#e67e22" stroke="#EA2027" stroke-width="8px"/>
<circle cx="0" cy="0" r="50" fill="#333"/>
<circle cx="400" cy="200" r="50" fill="#888000"/>
</svg>
preserveAspectRatio="xMinYMin meet"でビューボックスの幅がビューポートの半分の場合
width | height | |
---|---|---|
ビューポート | 400 | 200 |
ビューボックス | 200 | 200 |
ビューボックスの幅の割合が半分になり、xMinYMinの影響で左寄せされています。(大きさは2倍) |
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 200 200" preserveAspectRatio="xMinYMin">
<rect x="0" y="0" width="200" height="200" fill="#e67e22" stroke="#EA2027" stroke-width="8px"/>
<circle cx="0" cy="0" r="50" fill="#333"/>
<circle cx="400" cy="200" r="50" fill="#888000"/>
</svg>
preserveAspectRatio="xMinYMin meet"でビューボックスの高さがビューポートの半分の場合
width | height | |
---|---|---|
ビューポート | 400 | 200 |
ビューボックス | 400 | 100 |
ビューボックスの高さの割合が半分になり、xMinYMinの影響で上寄せされています。(大きさは2倍) |
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 400 100" preserveAspectRatio="xMinYMin">
<rect x="0" y="0" width="400" height="100" fill="#e67e22" stroke="#EA2027" stroke-width="8px"/>
<circle cx="0" cy="0" r="50" fill="#333"/>
<circle cx="400" cy="200" r="50" fill="#888000"/>
</svg>
preserveAspectRatio="xMaxYMax meet"でビューボックスの幅がビューポートの倍の場合
width | height | |
---|---|---|
ビューポート | 400 | 200 |
ビューボックス | 800 | 200 |
ビューボックスの幅が倍なので高さの割合が半分になり、xMinYMinの影響で下寄せされています。 |
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 800 200" preserveAspectRatio="xMaxYMax">
<rect x="0" y="0" width="800" height="200" fill="#e67e22" stroke="#EA2027" stroke-width="8px"/>
<circle cx="0" cy="0" r="50" fill="#333"/>
<circle cx="400" cy="200" r="50" fill="#888000"/>
</svg>
preserveAspectRatio="xMaxYMax meet"でビューボックスの高さがビューポートの倍の場合
width | height | |
---|---|---|
ビューポート | 400 | 200 |
ビューボックス | 400 | 400 |
ビューボックスの高さが倍なので幅の割合が半分になり、xMinYMinの影響で右寄せされています。 |
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 400 400" preserveAspectRatio="xMaxYMax">
<rect x="0" y="0" width="400" height="400" fill="#e67e22" stroke="#EA2027" stroke-width="8px"/>
<circle cx="0" cy="0" r="50" fill="#333"/>
<circle cx="400" cy="200" r="50" fill="#888000"/>
</svg>
preserveAspectRatio="xMaxYMax meet"でビューボックスの幅がビューポートの半分の場合
width | height | |
---|---|---|
ビューポート | 400 | 200 |
ビューボックス | 200 | 100 |
ビューボックスの幅の割合が半分になり、xMinYMinの影響で下寄せされています。(大きさは2倍)
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 200 200" preserveAspectRatio="xMaxYMax">
<rect x="0" y="0" width="200" height="200" fill="#e67e22" stroke="#EA2027" stroke-width="8px"/>
<circle cx="0" cy="0" r="50" fill="#333"/>
<circle cx="400" cy="200" r="50" fill="#888000"/>
</svg>
preserveAspectRatio="xMaxYMax meet"でビューボックスの高さがビューポートの半分の場合
width | height | |
---|---|---|
ビューポート | 400 | 200 |
ビューボックス | 400 | 100 |
ビューボックスの高さの割合が半分になり、xMinYMinの影響で下寄せされています。(大きさは2倍)
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 400 100" preserveAspectRatio="xMaxYMax">
<rect x="0" y="0" width="400" height="100" fill="#e67e22" stroke="#EA2027" stroke-width="8px"/>
<circle cx="0" cy="0" r="50" fill="#333"/>
<circle cx="400" cy="200" r="50" fill="#888000"/>
</svg>
preserveAspectRatioのオプションのmeetとsliceの比較
width | height | |
---|---|---|
ビューポート | 400 | 200 |
ビューボックス | 800 | 200 |
meet(初期値)
preserveAspectRatio="xMidYMid meet"
縦横の大きい方がviewportいっぱいに表示されます。
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 800 200" preserveAspectRatio="xMidYMid meet">
<rect x="0" y="0" width="800" height="200" fill="#e67e22" stroke="#EA2027" stroke-width="8px"/>
<circle cx="0" cy="0" r="50" fill="#333"/>
<circle cx="400" cy="200" r="50" fill="#888000"/>
</svg>
slice
preserveAspectRatio="xMidYMid slice"
縦横の小さい方がビューポートいっぱいに表示されるので大きい方ははみ出してしまいます。
これまでの例と異なり、オレンジの四角の左右の輪郭線が見えなくなっています。
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 800 200" preserveAspectRatio="xMidYMid slice">
<rect x="0" y="0" width="800" height="200" fill="#e67e22" stroke="#EA2027" stroke-width="8px"/>
<circle cx="0" cy="0" r="50" fill="#333"/>
<circle cx="400" cy="200" r="50" fill="#888000"/>
</svg>