我想让内联svg元素的内容在大小非本机时缩放。当然我可以把它作为一个单独的文件,然后像这样缩放。
Index.html: <img src="foo.svg" style="width: 100%;"/>
Foo.svg: <svg width="123" height="456"></svg> .svg
但是,我想通过CSS向SVG添加额外的样式,因此链接外部样式不是一个选项。我如何使内联SVG规模?
我想让内联svg元素的内容在大小非本机时缩放。当然我可以把它作为一个单独的文件,然后像这样缩放。
Index.html: <img src="foo.svg" style="width: 100%;"/>
Foo.svg: <svg width="123" height="456"></svg> .svg
但是,我想通过CSS向SVG添加额外的样式,因此链接外部样式不是一个选项。我如何使内联SVG规模?
要指定SVG图像内的坐标而不受图像缩放大小的影响,可以使用SVG元素上的viewBox属性定义图像在图像坐标系统中的边界框,并使用width和height属性定义相对于包含页面的宽度或高度。
例如,如果你有以下情况:
<svg>
<polygon fill=red stroke-width=0
points="0,10 20,10 10,0" />
</svg>
它将呈现为一个10px * 20px的三角形:
现在,如果你只设置宽度和高度,这将改变SVG元素的大小,但不会缩放三角形:
<svg width=100 height=50>
<polygon fill=red stroke-width=0
points="0,10 20,10 10,0" />
</svg>
如果您设置了视图框,则会导致它转换图像,以便将给定的框(在图像的坐标系统中)按比例放大以适应给定的宽度和高度(在页面的坐标系统中)。例如,要将三角形放大到100px * 50px:
<svg width=100 height=50 viewBox="0 0 20 10">
<polygon fill=red stroke-width=0
points="0,10 20,10 10,0" />
</svg>
如果你想把它放大到HTML视口的宽度:
<svg width="100%" viewBox="0 0 20 10">
<polygon fill=red stroke-width=0
points="0,10 20,10 10,0" />
</svg>
注意,默认情况下,长宽比是保留的。因此,如果你指定元素的宽度为100%,但高度为50px,它实际上只会缩放到50px的高度(除非你有一个非常窄的窗口):
<svg width="100%" height="50px" viewBox="0 0 20 10">
<polygon fill=red stroke-width=0
points="0,10 20,10 10,0" />
</svg>
如果你真的想让它水平拉伸,使用preserveAspectRatio=none禁用纵横比保存:
<svg width="100%" height="50px" viewBox="0 0 20 10" preserveAspectRatio="none">
<polygon fill=red stroke-width=0
points="0,10 20,10 10,0" />
</svg>
(注意,虽然在我的例子中,我使用适用于HTML嵌入的语法,但在StackOverflow中,我将示例作为图像包含在另一个SVG中,因此我需要使用有效的XML语法)
你会想这样做一个转换:
使用JavaScript:
document.getElementById(yourtarget).setAttribute("transform", "scale(2.0)");
用CSS:
#yourtarget {
transform:scale(2.0);
-webkit-transform:scale(2.0);
}
将您的SVG页面包装在Group标签中,并将其定位为操纵整个页面:
<svg>
<g id="yourtarget">
your svg page
</g>
</svg>
注:Scale 1.0为100%
乱七八糟的&发现这个CSS似乎包含SVG在Chrome浏览器中,直到容器比图像大:
div.inserted-svg-logo svg { max-width:100%; }
似乎也在FF + IE 11工作。
经过大约48小时的研究,我最终这样做是为了得到比例缩放:
注意:这个示例是用React编写的。如果你不使用它,将驼峰大小写更改为连字符(即:将backgroundColor更改为background-color,并将style Object更改为字符串)。
<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,宽度和高度
ie: viewbox="0 0 1000 1000"
Viewbox是一个重要的属性,因为它基本上告诉SVG绘制什么大小和位置。如果您使用CSS使SVG为1000x1000px,但您的视图框为2000x2000,那么您将看到SVG的左上角四分之一。
前两个数字min-x和min-y决定SVG是否应该在视图框内偏移。
我的SVG需要向上/向下或向左/右移动
viewbox="50 50 450 450"
前两个数字将使SVG向左移动50px,向上移动50px,后两个数字是视图框的大小:450x450 px。如果你的SVG是500x500,但它有一些额外的填充,你可以操纵这些数字在“视图框”中移动它。
此时,您的目标是改变其中一个数字,看看会发生什么。
你也可以完全省略视图框,但是你的里程数会根据你当时的其他设置而变化。根据我的经验,您会遇到保留纵横比的问题,因为视图框帮助定义纵横比。
保持纵横比
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%,所以它会装满它所在的容器。这可能是回答Stack Overflow问题的最大原因。
你可以改变它为任何你想要的像素值,但我建议使用100%,就像我做的那样,把它放大到最大大小,然后通过父容器用CSS控制它。我推荐这样做是因为你会得到“适当的”控制。你可以使用媒体查询,不需要疯狂的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/
这是一篇内容丰富的文章,但是它分解了操作SVG的几乎所有可能的方法,包括使用或不使用CSS。我建议你在随意喝咖啡或其他饮品的时候读这本书。
改变SVG文件对我来说不是一个公平的解决方案,所以我使用了相对的CSS单元。
Vh, vw, %都很方便。我使用CSS的高度:2.4vh;为我的SVG图像设置动态大小。
这里有一个简单的方法:
类型1:大多数svg都有一个视图框,如下所示:
<svg viewBox="0 0 24 30" ...>
你可以很容易地在css中控制它们的大小:
svg {
height: 20px;
}
类型2:如果svg有宽度和高度,但没有视口,如下所示:
<svg width="810" height="540">
然后你可以手动添加一个与它的宽度和hegith完全相同的视图框,如下所示:
<svg width="810" height="540" viewBox="0 0 810 540">
然后你可以做与类型1相同的事情。
如果你想在没有preserveAspectRatio属性的情况下缩放SVG。
通过这种方式,SVG将始终拉伸以填充宽度和高度,为了做到这一点,它将调整宽度或高度的大小,如果必要的话,正在寻找这个几天,所以想在这里分享它,以防其他人正在寻找这个
你必须从<svg>中删除宽度和高度,并添加viewBox属性,并添加preserveAspectRatio="none"
例子
<?xml version="1.0" encoding="utf-8"?>
<svg
version="1.1"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 5.8208332 15.9"
preserveAspectRatio="none">
<polygon points="480.4,200 0,200 0,0 480.4,0 599.9,100 " fill="#E1E1E1"/>
</svg>