基本變換

現在,我們準備開始扭曲我們精美的影像了。但首先,讓我們正式介紹一下 <g> 元素。使用這個輔助元素,您可以為一組元素指定屬性。實際上,這只是它的唯一用途。

示例

html
<svg width="30" height="10">
  <g fill="red">
    <rect x="0" y="0" width="10" height="10" />
    <rect x="20" y="0" width="10" height="10" />
  </g>
</svg>

所有後續變換都彙總在元素的 transform 屬性中。變換可以透過連線它們(用空格分隔)來鏈式使用。

平移

可能需要移動元素,即使您可以使用相應的屬性進行定位。為此,可以使用 translate() 變換。

html
<svg width="40" height="50">
  <rect x="0" y="0" width="10" height="10" transform="translate(30,40)" />
</svg>

該示例將渲染一個矩形,其平移點為 (30,40),而不是 (0,0)。

如果未給出第二個值,則假定其為 0

旋轉

旋轉元素是一項相當常見的任務。為此,請使用 rotate() 變換。

html
<svg width="31" height="31">
  <rect x="12" y="-10" width="20" height="20" transform="rotate(45)" />
</svg>

此示例顯示了一個旋轉 45 度的正方形。rotate() 的值以度為單位。

多個變換

變換可以很容易地透過空格分隔來連線。例如,translate()rotate() 是常用的變換。

html
<svg width="40" height="50">
  <rect
    x="0"
    y="0"
    width="10"
    height="10"
    transform="translate(30,40) rotate(45)" />
</svg>

此示例再次顯示了上面看到的那個小正方形,這次它也被旋轉了 45 度。

傾斜

為了將我們的矩形變成菱形,可以使用 skewX()skewY() 變換。每個變換都接受一個角度,該角度決定了元素將傾斜多遠。

縮放

scale() 更改元素的大小。它接受兩個數字,第一個是x 縮放因子,第二個是y 縮放因子。這些因子被視為變換後的尺寸與原始尺寸的比率。例如,0.5 縮小 50%。如果省略第二個數字,則假定它等於第一個數字。

使用 matrix() 進行復雜變換

以上所有變換都可以用一個 2x3 的變換矩陣來表示。要組合多個變換,可以使用 matrix(a, b, c, d, e, f) 變換直接設定結果矩陣,該變換透過以下方式將座標從前一個座標系統對映到新座標系統:

{xnewCoordSys=axprevCoordSys+cyprevCoordSys+eynewCoordSys=bxprevCoordSys+dyprevCoordSys+f\left\{ \begin{matrix} x_{\mathrm{prevCoordSys}} = a x_{\mathrm{newCoordSys}} + c y_{\mathrm{newCoordSys}} + e \\ y_{\mathrm{prevCoordSys}} = b x_{\mathrm{newCoordSys}} + d y_{\mathrm{newCoordSys}} + f \end{matrix} \right.

請參閱 SVG 變換文件中的具體示例。要了解有關變換的更多資訊,請檢視 CSS 變換指南。

對座標系統的影響

在使用變換時,您會在應用變換的元素內部建立一個新的座標系統。這意味著,您為元素及其子元素指定的單位可能不遵循 1:1 畫素對映,而是根據變換進行扭曲、傾斜、平移和縮放。

html
<svg width="100" height="100">
  <g transform="scale(2)">
    <rect width="50" height="50" />
  </g>
</svg>

上面示例中生成的矩形將是 100x100px。當您依賴於 userSpaceOnUse 等屬性時,會產生更引人入勝的效果。

在 SVG 中嵌入 SVG

與 HTML 不同,SVG 允許您無縫嵌入其他 svg 元素。這樣,您還可以透過利用內部 svg 元素的 viewBoxwidthheight 來建立新的座標系統。

html
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100" height="100">
  <svg width="100" height="100" viewBox="0 0 50 50">
    <rect width="50" height="50" />
  </svg>
</svg>

上面示例的效果與上面的示例基本相同,即矩形的大小將是指定的兩倍。