ChatGPT解决这个技术问题 Extra ChatGPT

为什么 SVG 图像不使用 CSS“宽度”属性进行缩放?

HTML

<div id="hero">
   <div id="social">
      <img src="facebook.svg" alt="Facebook">
      <img src="linkedin.svg" alt="LinkedIn">
      <img src="instagram.svg" alt="Instagram">
    </div>
</div>

使用 SASS 的 CSS

#hero {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    height: 300px;
    
    #social {
        width: 50%;
        display: flex;
        justify-content: space-between;
        flex-wrap: wrap;

        img {
            width: 2em;
        }
    }
}

我无法使用 CSS width 属性调整 SVG 的大小。以下是我通过不同方法获得的结果(注意图标如何向 hero div 的中间折叠):

img { width: 2em; }

https://i.stack.imgur.com/7fIsb.png

img { width: 3em; }

https://i.stack.imgur.com/7iw0h.png

img { width: 4em; }

https://i.stack.imgur.com/Pbceu.png

但是,如果我使用 CSS height 属性:

img { height: 2em; }

https://i.stack.imgur.com/n10yp.png

img { height: 3em; }

https://i.stack.imgur.com/B25nT.png

img { height: 4em; }

https://i.stack.imgur.com/xcH8V.png

我得到了我需要的行为,但我不确定这是正确的方法。为什么会这样?您知道调整 SVG 图像大小的更好方法(尤其是使用 Flexible Box Module)吗?


P
Paul LeBeau

SVG 与位图图像(例如 PNG 等)不同。如果 SVG 具有 viewBox(如您所见),那么它将被缩放以适应其定义的视口。它不会像 PNG 那样直接缩放。

因此,如果高度受到限制,增加 imgwidth 不会使图标变得更高。您最终会得到 img 水平居中在一个更宽的框中。

我相信您的问题是您的 SVG 在其中定义了固定高度。打开 SVG 文件并确保它们:

没有定义宽度和高度,或者宽度和高度都设置为“100%”。

那应该可以解决您的问题。如果没有,请将您的 SVG 之一发布到您的问题中,以便我们了解它是如何定义的。


您的回答似乎是我的问题的解决方案。因此,如果我不指定 SVG 的 widthheight,我想我可以毫无问题地对其进行缩放。
截至 2019 年,看起来 SVG 遵循 css 宽度和高度规则,即使它们内部有视图框和/或宽度和高度。在 Chrome 和 Firefox 中测试。
@Ilyich OP 的问题是他们只在 CSS 中指定了 widthheight 来自 SVG。
C
Charith Jayasanka

transform CSS 属性允许您旋转、缩放、倾斜或平移元素。

因此,您可以轻松地使用 transform: scale(2.5); 选项来缩放 2.5 倍。


这个解决方案对我来说效果很好,因为我无法控制 SVG 文件的内部。感谢您发布;)
好的解决方案,但不是最好的,因为转换后的 SVG 图像父元素不会意识到 SVG 元素大小的增加。
O
OZZIE

我必须自己弄清楚,但是您需要一些 svg 来匹配 viewBox 和宽度 + 高度。

例如,如果它已经有 width="x" height="y" 那么 =>

添加<svg ... viewBox="0 0 [width] [height]">

和相反。

之后它将随 <svg ... style="width: xxx; height: yyy;"> 缩放


这是viewBox,而不是视口
P
Paul LeBeau

如果 svg 文件在 svg 文件中已经定义了高度和宽度 width="100" height="100" 然后添加这个 width="100" height="100" viewBox="0 0 100 100" 同时保持已经定义宽度=“100”高度=“100”。然后,您可以通过在您的案例 img 中使用选择器来缩放 css 文件中的 svg,这样您就可以这样做: img{height: 20px; width: 20px;} 并且图像会缩放。


P
Pawel

使用任何文本编辑器打开 SVG 并从根节点中删除 widthheight 属性。

<svg width="12px" height="20px" viewBox="0 0 12 20" ...

<svg viewBox="0 0 12 20" ...

现在,图像将始终填满所有可用空间,并将使用 CSS widthheight 进行缩放。它不会伸展,所以它只会增长到可用空间。


P
Paul LeBeau

您必须修改 viewBox 属性以使用 svg 正确更改高度和宽度。它位于 svg 的 <svg> 标记中。

https://developer.mozilla.org/en/docs/Web/SVG/Attribute/viewBox


我对 downvote 的猜测是,更改视图框实际上并不会缩放 svg 元素,它只会更改视口大小。
V
Viraj Agarwal

如果不是太大问题,那么您可以通过图像 HTML 标记导入,然后轻松调整其大小,同时让父元素知道它们已调整大小,然后您可以通过在图像标签。这将解决您的目的,但您不能放大太多,因为这会使它变得模糊。


您的答案可以通过额外的支持信息得到改进。请edit添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。您可以找到有关如何写出好答案的更多信息in the help center
d
dylan

您也可以使用 transform: scale("") 选项。