位置

在本文中,我们将探讨可缩放矢量图形 (SVG) 如何表示绘图上下文中对象的位置和大小,包括坐标系以及在可缩放上下文中“像素”测量值的含义。

网格

对于所有元素,SVG 使用一个坐标系或网格系统,该系统与 canvas(以及许多其他计算机绘图例程)使用的系统类似。也就是说,文档的左上角被认为是点 (0,0) 或原点。然后,位置从左上角开始以像素为单位进行测量,正 x 方向向右,正 y 方向向下。

X, Y coordinate grid with a blue box in the middle.

请注意,这与您小时候学习的绘图方式略有不同(y 轴是颠倒的)。但是,这与 HTML 中元素定位的方式相同(默认情况下,LTR 文档被视为不是 RTL 文档,后者从右到左定位 X)。

示例

元素

html
<rect x="0" y="0" width="100" height="100" />

定义一个矩形,从左上角开始,向右跨越 100px,向下跨越 100px。

什么是“像素”?

在最基本的情况下,SVG 文档中的一个像素映射到输出设备(即屏幕)上的一个像素。但是,如果 SVG 没有“可缩放”这个词,它就不会有多个选项来改变这种行为。就像 CSS 中的绝对和相对字体大小一样,SVG 定义了绝对单位(带有“pt”或“cm”等尺寸标识符的单位)和所谓的用户单位,后者缺少该标识符,是纯数字。

在没有进一步说明的情况下,一个用户单位等于一个屏幕单位。要明确更改此行为,SVG 中有几种可能性。我们从 svg 根元素开始

html
<svg width="100" height="100">…</svg>

上面的元素定义了一个 100x100px 的 SVG 画布。一个用户单位等于一个屏幕单位。

html
<svg width="200" height="200" viewBox="0 0 100 100">…</svg>

整个 SVG 画布的大小为 200x200 像素。但是,viewBox 属性定义了要显示的画布部分。这 200x200 像素显示了一个从用户单位 (0,0) 开始并向右和向下跨越 100x100 用户单位的区域。这有效地放大了 100x100 单位区域,并将图像放大到两倍大小。

当前用户单位到屏幕单位的映射(对于单个元素或整个图像)称为用户坐标系统。除了缩放之外,坐标系统还可以进行旋转、倾斜和翻转。默认的用户坐标系统将一个用户像素映射到一个设备像素。(但是,设备可以决定它理解的像素是什么。)SVG 文件中具有特定尺寸(如“in”或“cm”)的长度的计算方式使其在最终图像中显示为 1:1。

SVG 1.1 规范中的一段话说明了这一点

[...] 假设用户代理可以从其环境中确定“1px”等于“0.2822222mm”(即 90dpi)。那么,对于所有 SVG 内容的处理: [...]“1cm”等于“35.43307px”(因此等于 35.43307 用户单位)