如何使用其父容器制作svg秤?


235

当大小为非本机时,我想要一个内联svg元素的内容比例。当然,我可以将其作为单独的文件并像这样进行缩放。

index.html: <img src="foo.svg" style="width: 100%;" />

foo.svg: <svg width="123" height="456"></svg>

但是,我想通过CSS向SVG添加其他样式,因此链接外部样式不是一种选择。如何制作嵌入式SVG秤?


2
尝试SVG宽度和高度中的precents。
ncm

@ncm用JS怎么办?
Mawg说恢复Monica

Answers:


457

要在SVG图像内指定坐标,而与图像的缩放大小无关,请使用viewBoxSVG元素上的属性来定义图像在坐标系中的边界框,并使用widthheight属性定义什么。宽度或高度是相对于包含页面的。

例如,如果您具有以下条件:

<svg>
    <polygon fill=red stroke-width=0 
             points="0,10 20,10 10,0" />
</svg>

它将呈现为10px x 20px的三角形:

10x20三角形

现在,如果仅设置宽度和高度,则将更改SVG元素的大小,但不会缩放三角形:

<svg width=100 height=50>
    <polygon fill=red stroke-width=0 
             points="0,10 20,10 10,0" />
</svg>

10x20三角形

如果设置了视图框,则将其转换为图像,以使给定的框(在图像的坐标系中)按比例缩放以适合给定的宽度和高度(在页面的坐标系中)。例如,将三角形放大为100px x 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>

100x50三角形

如果要将其缩放到HTML视口的宽度,请执行以下操作:

<svg width="100%" viewBox="0 0 20 10">
    <polygon fill=red stroke-width=0 
             points="0,10 20,10 10,0" />
</svg>

300x150三角形

请注意,默认情况下会保留宽高比。因此,如果您指定该元素的宽度应为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>

100x50三角形

如果您确实希望它水平伸展,请使用禁用纵横比保存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>

300x50三角形

(请注意,尽管在示例中我使用了适用于HTML嵌入的语法,但为了将示例作为图像包含在StackOverflow中,我却将其嵌入另一个SVG中,因此我需要使用有效的XML语法)


1
您不仅要如何使viewBox的preserveAspectRatio,还要使主框的呢?我想要宽度:100%;高度:自动。
13年

1
@Dude:我认为width="100%"没有指定高度的示例确实可以满足您的要求。我添加了图像进行演示。它具有100%的宽度,并按比例放大高度。如果这不是您想要的,您可以尝试澄清您的意思吗?
2013年

1
哦。没问题。这只是一个webkit错误。在Safari和Chrome中,默认情况下,“实际”高度为100%,而不是自动。那我该如何解决呢?
bjb568

4
@Dude啊,是的,我明白了。它可以在Firefox中正常运行,但不能在Chrome或Safari中运行。根据SVG规范,Firefox似乎是正确的。同时的默认值widthheight一个SVG元素是100%时,这不是100%(包含块的100%)的CSS定义,而是100%已基于所述固有的纵横比指定的视口(根据viewBox给定的时间计算得出)。我尚未找到适用于Chrome / Safari的问题的解决方案。
Brian Campbell

1
这对我有用。我首先在SVG元素上创建一个viewBox属性,并将其值设置为“ 0 0 [原始svg宽度] [原始svg高度]”。接下来,我将SVG元素的width属性更改为“ auto”,并将height属性更改为“ 100%”。容器还必须具有定义的高度。这会将矢量缩放到容器高度的100%,从而使宽度浮动。最后,将SVG的CSS最大宽度设置为100%,以防止容器超调。
瑞安·格里格斯

28

经过48个小时的研究,我最终完成了此操作以获得比例缩放:

注意:此样本是用React编写的。如果您不使用它,请将骆驼保护套的内容改回连字符(即:更改backgroundColor为,background-color然后将样式更改ObjectString)。

<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/zh-CN/docs/Web/SVG/Attribute/viewBox

min-x,min-y,宽度和高度

即:viewbox =“ 0 0 1000 1000”

Viewbox是一个重要的属性,因为它基本上告诉SVG要绘制的大小以及绘制位置。如果您使用CSS将SVG设置为1000x1000像素,但视图框为2000x2000,则您会看到SVG 的左上角

前两个数字min-x和min-y确定SVG是否应在视图框内偏移。

我的SVG需要向上/向下或向左/向右移动

检查一下:viewbox =“ 50 50 450 450”

前两个数字会将SVG左移50像素,上移50像素,后两个数字是视图框大小:450x450像素。如果您的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/zh-CN/docs/Web/SVG/Attribute/width

看我上面的示例代码。请注意,我是如何只设置宽度而不设置高度的。我将其设置为100%,以便填充其中的容器。这可能是回答此Stack Overflow问题的最大贡献。

您可以将其更改为所需的任何像素值,但我建议像使用一样将其放大到最大尺寸,然后通过父容器使用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还是不使用CSS,它都几乎分解了每种可能的操作SVG的方法。我建议在随便喝咖啡或选择某些液体时阅读。


这似乎不适用于任何SVG-如果您无法控制SVG源,则当SVG具有固定宽度时,此方法将失败。
user48956 '19

@ user48956您始终可以在使用JavaScript之后对其进行操作。
安德鲁(Andrew)

是的-您总是可以通过编程来戳入各种文件格式的内幕-但您希望有一种方法可以适用于各种资产(例如PNG),并且不需要JavaScript编程。
user48956

20

您将需要进行如下转换:

使用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>

注意:比例1.0为100%


7
好。我不想要JS。有没有一种方法可以使其转换为适合父级?
13年

@bj setAttribute与<tag attribute =“ value”>是相同的东西
john ktejik 2014年

17

混乱并发现此CSS似乎在Chrome浏览器中包含SVG,直到容器大于图像为止:

div.inserted-svg-logo svg { max-width:100%; }

似乎也可以在FF + IE 11中工作。


这为我解决了这个问题。我只是在iOS中看到溢出。谢谢!
伊万·马特森

5
同时使用max-width: 100%max-height: 100%将使svg始终缩放至容器,而不会溢出或丢失其长宽比。
加文

2
@Gavin max-height: 100%对我不起作用,使用vh代替而不是解决%
Pavel

2

更改SVG文件对我来说不是一个公平的解决方案,因此,我使用了相对CSS单位

vhvw%是非常方便的。我使用CSS之类的方法height: 2.4vh;来为SVG图像设置动态尺寸。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.