48時間ほどの調査の後、比例スケーリングを行うためにこれを行うことになりました。
注:このサンプルはReactで作成されています。それを使用していない場合は、キャメルケースの文字をハイフンに変更backgroundColor
します(つまりbackground-color
、スタイルをに変更し、スタイルをにObject
戻しますString
)。
<div
style={{
backgroundColor: 'lightpink',
resize: 'horizontal',
overflow: 'hidden',
width: '1000px',
height: 'auto',
}}
>
<svg
width="100%"
viewBox="113 128 972 600"
preserveAspectRatio="xMidYMid meet"
>
<g> ... </g>
</svg>
</div>
上記のサンプルコードで何が起こっているかを次に示します。
ビューボックス
MDN:https : //developer.mozilla.org/en-US/docs/Web/SVG/Attribute/viewBox
min-x、min-y、幅、高さ
例:viewbox = "0 0 1000 1000"
Viewboxは基本的にSVGに描画するサイズと場所を指示するため、重要な属性です。あなたはSVG 1000×1000ピクセルを作るためにCSSを使用しますが、あなたのビューボックスは、2000×2000だった場合、あなたは見ることが左上四半期あなたのSVGのを。
最初の2つの数値、min-xとmin-yは、SVGをビューボックス内でオフセットする必要があるかどうかを決定します。
SVGを上/下または左/右にシフトする必要がある
これを調べてください:viewbox = "50 50 450 450"
最初の2つの数値はSVGを左に50ピクセルから50ピクセル上にシフトし、次の2つの数値はビューボックスのサイズ:450x450ピクセルです。SVGが500x500であるが、余分なパディングがある場合、それらの数値を操作して「ビューボックス」内を移動できます。
この時点での目標は、これらの数値の1つを変更して何が起こるかを確認することです。
ビューボックスを完全に省略することもできますが、そのときの距離は、そのときのその他すべての設定によって異なります。私の経験では、ビューボックスがアスペクト比の定義に役立つため、アスペクト比の維持に関する問題が発生します。
アスペクト比を保持
MDN:https : //developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio
私の調査によると、さまざまなアスペクト比設定がありますが、デフォルト設定はと呼ばれていxMidYMid meet
ます。私ははっきりと自分を思い出させるためにそれを私の上に置きました。xMidYMid meet
中点XとYに基づいて比例して拡大縮小します。これは、ビューボックスの中央に留まることを意味します。
幅
MDN:https : //developer.mozilla.org/en-US/docs/Web/SVG/Attribute/width
上記のサンプルコードを見てください。幅のみを設定し、高さは設定していないことに注意してください。私はそれを100%に設定して、それが入っているコンテナーを満たします。これが、おそらくこのスタックオーバーフローの質問への回答に最も貢献しているものです。
必要に応じて任意のピクセル値に変更できますが、最大サイズに拡大し、親コンテナを介してCSSで制御する場合と同じように、100%を使用することをお勧めします。「適切な」制御が得られるので、これをお勧めします。メディアクエリを使用でき、JavaScriptを使用せずにサイズを制御できます。
CSSによるスケーリング
上記のコード例をもう一度見てください。これらのプロパティがあることに注意してください。
resize: 'horizontal', // you can safely omit this
overflow: 'hidden', // if you use resize, use this to fix weird scrollbar appearance
width: '1000px',
height: 'auto',
これは追加ですが、適切なアスペクト比を維持しながらユーザーがSVGのサイズを変更できるようにする方法を示しています。SVGは独自のアスペクト比を維持するため、親コンテナで幅をサイズ変更可能にするだけで、必要に応じてサイズを変更できます。
高さはそのままにするか、自動に設定し、幅でサイズ変更を制御します。幅を選択したのは、レスポンシブデザインのために幅がより意味のあることが多いためです。
以下は、これらの設定が使用されている画像です。
この質問のすべての解決策を読んでもまだ混乱しているか、必要なものがよくわからない場合は、こちらのリンクをご覧ください。私はそれがとても役に立ったと感じました:
https://css-tricks.com/scale-svg/
それは巨大な記事ですが、CSSの有無にかかわらず、SVGを操作するためのほとんどすべての可能な方法を分類します。さりげなくコーヒーを飲んだり、お好みの液体を選んで読んだりすることをお勧めします。