这里有一些实用信息,我认为这些信息有助于理解(尤其是使用)SVG viewPort 和 viewBox。
SVG 使用 术语 viewPort 和 viewBox。 viewBox 位于 viewPort 内。 将 viewBox 视为图像本身——因为您可以缩放它,向左/向右/向上/向下滑动它——所有这些都在 viewPort 内。 viewPort(SVG 标签本身)就像一个容器,里面有 SVG 图像。你也可以调整它的大小,并左右移动它左/右/上/下。并且 SVG 标记位于 HTML 容器中(div、p、aside、h3 等)。所以你可以看到为什么人们会觉得 viewPort / viewBox 有点混乱。只需将 viewBox 视为图像本身。
SVG 标签上的宽度/高度属性提供了视口的大小。这是显示 SVG 图像的容器的宽度/高度。 (您也可以拥有 x="" 和 y="" 属性,就像在 viewBox 属性中一样。)
因此,在 SVG 本身上,您可以指定宽度 / 高度和起始 x 偏移量 / 起始 y 偏移量——这些称为 viewPort (又名 ViewPort 坐标系统)
在 viewBox 属性中,您指定“x y width height”——这些被称为 viewBox(又名本地坐标系统 LCS)
<svg x="0" y="0" width="500" height="300"
viewBox="start_x start_y width height" >
...path fill d etc...
</svg>
重要概念#1:视口的宽度/高度(在 SVG 标记本身上的宽度/高度,如 width="" 和 height="") 指定容器的大小将在其中显示 SVG 图像。通常,或者如果省略,它就是 SVG 图像本身的精确尺寸(或略大于)。
超级重要的概念 #2:viewBox 的宽度/高度与 viewPort 的宽度/高度直接相关。 如果 viewPort 是 300 x 500 ,然后随着 viewBox W / H 数字变得大于 300 x 500,图像本身在 viewPort 内变得更小(缩小)。但是随着 viewBox w/h 变得小于 300 x 500,图像本身在 viewPort 内变得更大。这种增长是向右和向下的,所以如果你需要在现在太小的视口中滑动放大的图像,那就是当你使用 viewBox 的 X / Y 值时.
viewBox x/y – 在视口内向右/向下滑动 SVG
viewBox 宽度/高度——当增加大于 SVG 标记的宽度/高度时,它会在 viewPort 内将图像缩小。 SVG 在视口内向右/向下收缩。减少 SVG 宽度/高度属性下方的数字:图像将在视口中增长,直到右侧/底部的图像部分可能被视口的右侧/底部截断。 *(即当 viewBox 属性中的宽度/高度数字小于 SVG 上的宽度/高度属性时,图像会在 viewPort 内放大。当较大时,图像会随着 viewPort 缩小(缩小)。
viewPort x/y == 在其 HTML 容器中向右/向下滑动视口本身
viewPort 宽度/高度 – 将整个 viewPort 的大小调整得更大,可能会溢出 HTML 容器(div / p / 等)。基本上,通过向右/向下增长来扩大视口。
注意事项:
一种。如果在 SVG 上不包含 ViewBox 属性,则 viewBox 的大小等于 viewPort 的大小(占 viewPort 的 100%)
湾。如果 viewBox 以 0,0 开头并且宽度/高度与 SVG 宽度/高度(即视口)相同,则不会发生任何变化。相当于根本没有 viewbox 属性。
C。如果您有一个纸牌大小的视口,但 SVG 图像是麦片盒的大小,那么增加 viewBox “xy ...”数字将在视口中向上/向左移动谷物盒图像,显示不同的麦片盒图像的一部分。这对sprites 很有用
d。 (通常(总是!)SVG 元素也在 HTML 容器中 - 一个 div、p、section、li 等等。我们没有讨论这个,但请记住它。如果您的图像被截断,那么viewBox 比 viewPort 大 - 或者 - HTML 容器元素(div 等)比 viewPort 小)
这是this answer within this same thread的作者推荐给我们的两个(非常棒!)短视频:
2min video demo
5min video demo (same guy, much better)