位置

在本文中,我們將探討可縮放向量圖形 (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 使用者單位)