Scale SVG to container without mask/crop

后端 未结 3 1622
天命终不由人
天命终不由人 2020-12-04 09:46

I have tried many variants of the svg parameters, but have had no joy in scaling this particular SVG.

I am trying to contain this SVG into a container e

3条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-04 10:09

    1. You absolutely must have a viewBox attribute on your SVG element that describes the bounding box of the contents you want to be always visible. (The file that you link to does not; you'll want to add one.)

    2. To cause your SVG to fill an HTML element, put the CSS attribute position:relative (or position:absolute or position:fixed if appropriate) on your wrapper, and then

    3. Set the CSS attribute position:absolute on your element to cause it to sit inside and fill your div. (If necessary, also apply left:0; top:0; width:100%; height:100%.)

    Once you have a viewBox and your SVG sized correctly the default value of the preserveAspectRatio attribute will do what you want. In particular, the default of xMidYMid meet means that:

    • The aspect ratio described by your viewBox will be preserved when rendering.
      By comparison, a value of none would allow non-uniform scaling.
    • The viewBox will always meet either top/bottom or left/right, with 'letterboxing' keeping the other dimension inside.
      By comparison, a value of slice ensures that your viewBox fully fills the rendering, with either the top/bottom or left/right falling outside the SVG.
    • The viewBox will be kept vertically and horizontally centered within the SVG viewport.
      By comparison, a value of xMinYMax would keep it in the bottom-left corner, with padding only to the right or top.

    You can see this live here: http://jsfiddle.net/Jq3gy/2/

    Try specifying explicit values for preserveAspectRatio on the element and press "Update" to see how they affect the rendering.

    Edit: I've created a simplified version of the US Map with a viewBox (almost half the bytes) and used that in an updated demo to suit your exact needs: http://jsfiddle.net/Jq3gy/5/

提交回复
热议问题