以下是一些我认为有助于理解(尤其是使用)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 属性中,您指定“xy 宽度高度”——这些称为 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%)
b. 如果 viewBox 开始0,0
并具有与 SVG 宽度/高度(即视口)相同的宽度/高度,则不会发生任何变化。相当于根本没有 viewbox 属性。
C。如果您有一个纸牌大小的视口,但 SVG 图像是谷物盒的大小,则增加 viewBox “xy ...”数字将在视口中向上/向左移动谷物盒图像,显示谷物盒图像的不同部分。这对精灵 很有用
d.(通常(总是!)SVG 元素也在 HTML 容器中 - 一个 div、p、section、li 等等。我们没有讨论这个,但请记住它。如果您的图像被截断,那么 viewBox大于视口 - 或 - HTML 容器元素(div 等)小于视口)
这里有两个(非常棒!)短视频,由这个答案的作者在同一个线程中推荐给我们:
2 分钟视频演示
5 分钟视频演示(同样的人,好多了)