ChatGPT解决这个技术问题 Extra ChatGPT

如何使 <svg> 元素扩展或收缩到其父容器?

目标是让 <svg> 元素扩展到其父容器的大小,在本例中为 <div>,无论该容器有多大或多小。

编码:

<style>
    svg, #container{
        height: 100%;
        width: 100%;
    }
</style>

<div id="container">
    <svg xmlns="http://www.w3.org/2000/svg" version="1.1" >
         <rect x="0" y="0" width="100" height="100" />
    </svg>
</div>

此问题的最常见解决方案似乎是在 <svg> 元素上设置 viewBox 属性。

viewBox="0 0 widthOfContainer heightOfContainer"

但是,如果 <svg> 元素中的元素具有预定义的宽度和/或高度,这似乎不起作用。例如,上述代码中的 <rect> 元素明确设置了其宽度和高度。

因此,显而易见的解决方案是在这些元素上也使用 % 宽度和 % 高度。但这甚至必须做吗?特别是,因为 <img src=test.svg > 可以正常工作并且可以扩展/收缩,而明确设置 <rect> 高度和宽度没有任何问题。

如果像 <rect> 这样的元素和其他类似的元素必须以百分比定义它们的宽度和高度,Inkscape 有没有办法设置它,以便 <svg> 文档的所有元素都使用百分比宽度、高度等..而不是固定尺寸?

将 svg 保存为文件,而不是将其作为图像引用,例如 这样您就可以使用 width:100% 或 height:100%

r
robertc

viewBox 不是容器的高度,而是绘图的大小。将您的 viewBox 定义为 100 个单位的宽度,然后将您的 rect 定义为 10 个单位。之后,无论您缩放 SVG 多大,rect 都将是图像宽度的 10%。


但问题是:如何缩放 SVG?
@AdrianLang 当您在 SVG 对象上设置大小时,缩放会自动发生,正如问题代码中已经完成的那样。 Here's a fixed version of the example
你是对的,太好了,这实际上对我有用。我想我的问题是我的 svg 根元素中的高度和宽度属性。
I made some minor tweaks 到那个小提琴,以在不保留纵横比的情况下强制水平和垂直调整大小,并使其在 IE 中工作,而提交的小提琴@robertc 不是。希望它会帮助某人在路上!
默认情况下,您的 svg 将尽可能大地缩放,使其完全可见,但保留其纵横比(因此方形 viewBox 不会完全填充矩形父级)。如果您真的想强制它完全覆盖父容器,请将 preserveAspectRatio="none" 添加到 SVG 元素。
R
Reza Baradaran Gazorisangi

https://i.stack.imgur.com/6sjbk.jpg

我想把它放在一个 div 中,让它响应地填充 div。我的做法如下:

首先,我在诸如 inkscape 之类的应用程序中打开 SVG 文件。在文件->文档属性中,我将文档的宽度设置为 800 像素,将高度设置为 600 像素(您可以选择其他尺寸)。然后我将 SVG 放入这个文档中。

https://i.stack.imgur.com/YRrFU.jpg

然后我将这个文件保存为一个新的 SVG 文件并从这个文件中获取路径数据。现在在 HTML 中,实现魔法的代码如下:

<div id="containerId">    
    <svg
    id="svgId" 
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
    version="1.1"
    x="0"
    y="0"
    width="100%"
    height="100%"
    viewBox="0 0 800 600"
    preserveAspectRatio="none">
       <path d="m0 0v600h800v-600h-75.07031l-431 597.9707-292.445315-223.99609 269.548825-373.97461h-271.0332z" fill="#f00"/>
    </svg>
</div>

请注意,SVG 的宽度和高度都设置为 100%,因为我们希望它垂直和水平地填充容器,但是 viewBox 的宽度和高度与 inkscape 中文档的宽度和高度相同,即 800px X 600 像素。您需要做的下一件事是将preserveAspectRatio 设置为“none”。如果您需要了解有关此属性的更多信息,这里有一个很好的 link。这就是它的全部。

另一件事是,这段代码几乎适用于所有主流浏览器,甚至是旧浏览器,但在某些版本的 android 和 ios 上,您需要使用一些 javascrip/jQuery 代码来保持它的一致性。我在文档准备和调整大小功能中使用以下内容:

$('#svgId').css({
    'width': $('#containerId').width() + 'px',
    'height': $('#containerId').height() + 'px'
});

希望能帮助到你!


对于 preserveAspectRatio 注释 +1。在寻找高低以使 SVG 实际拉伸(而不是缩放)到 div 之后,这是正确的答案。
@Gazoris,感谢您的精彩回答。有同样的问题。如果我的 svg 是嵌套的怎么办。例如, 我想有条件地显示 svg 1 和 2,它应该采用宽度和高度的容器。
你能帮我解决这个问题吗?
@Reza Baradaran:天才。
m
mikemaccana

最近对我有用的是从 <svg> 标记和所有子标记中删除所有 height=""width="" 属性。然后,您可以使用父容器的高度或宽度的百分比进行缩放。

前:

<svg width="3212" height="3212" viewBox="0 0 3212 3212" fill="none" xmlns="http://www.w3.org/2000/svg">
   circle cx="1606" cy="1606" r="1387" stroke="black" stroke-width="438"/>
</svg>

后:

<svg viewBox="0 0 3212 3212" fill="none" xmlns="http://www.w3.org/2000/svg">
   circle cx="1606" cy="1606" r="1387" stroke="black" stroke-width="438"/>
</svg>

你能举一个工作的例子吗?我不能让这个做任何事情。
这对我也有用。我已编辑此问题以添加示例。
J
Justin Putney

@robertc 说得对,但您还需要注意 svg, #container 会导致 svg 以指数方式缩放,而不是 100%(一次用于 #container,一次用于 svg)。

换句话说,如果我将 50% h/w 应用于两个元素,它实际上是 50% 的 50%,或 0.5 * .5,等于 0.25,或 25% 比例。

正如@robertc 建议的那样,一个选择器可以正常工作。

svg {
  width:50%;
  height:50%;
}

这是因为您的选择器 svg, #container 匹配 both svg dom 元素 #container dom 元素。我相信您是在寻找 svg #container,但如果您仍然使用 ID,则不需要指定父级。
这不正是我所说的“一次用于#container,一次用于svg”吗?
哦,对不起,你是对的,但你的回答有点奇怪,导致误解。听起来好像你一开始在谈论一个潜在的问题。
A
Ashkan Mobayen Khiabani

对于您的 iPhone,您可以在头部应答器中使用:

"width=device-width"