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 element that controls the size of the SVG.
I'm aiming for 500x309px.
What combination of width
, height
, viewBox
and preserveAspectRatio
can help me achieve this without having the SVG masked or cropped?
Set the SVG width and height to be the size of its container, and set preserveAspectRatio = none.
and
That's it. Setting CSS is not needed.
I personally set viewBox to be the size of the contents of the SVG. So in my example, the original image I am loading into my SVG is 300x200. It will shrink to fit a 50x100 div. But viewBox manipulation is a separate issue.
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.)To cause your SVG to fill an HTML element, put the CSS attribute
position:relative
(orposition:absolute
orposition:fixed
if appropriate) on your wrapper, and thenSet the CSS attribute
position:absolute
on your<svg>
element to cause it to sit inside and fill your div. (If necessary, also applyleft:0; top:0; width:100%; height:100%
.)Once you have a
viewBox
and your SVG sized correctly the default value of thepreserveAspectRatio
attribute will do what you want. In particular, the default ofxMidYMid meet
means that:By comparison, a value of
none
would allow non-uniform scaling.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.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<svg>
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/
Unfortunately, I don't know the answer that applies to raw SVG, but in Raphael.js, I did it like that:
This technique scaled my SVG to fit the bounds.
Hope this helps.