经过大约 48 小时的研究,我最终这样做是为了获得比例缩放:
注意:这个示例是用 React 编写的。如果您不使用它,请将驼峰式的东西改回连字符(即:将backgroundColor 更改为background-color 并将样式Object 更改回String)。
<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, 宽度和高度
即: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/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。我建议在随便喝杯咖啡或选择您选择的液体时阅读它。