transform

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2015.

Thuộc tính transform định nghĩa một danh sách các phép biến đổi được áp dụng cho một phần tử và các phần tử con của nó.

Note: Là một thuộc tính trình bày, transform cũng có một thuộc tính CSS tương ứng: transform. Khi cả hai được chỉ định, thuộc tính CSS sẽ được ưu tiên. Lưu ý rằng có một số khác biệt về cú pháp giữa thuộc tính CSS và thuộc tính này!

Phần tử

Trong SVG 2, bạn có thể dùng thuộc tính transform trên bất kỳ phần tử nào, bao gồm cả phần tử gốc <svg>. Lưu ý rằng việc dùng transform trên phần tử gốc <svg> là một tính năng mới hơn, và bạn nên kiểm tra tương thích trình duyệt để biết có được hỗ trợ hay không. Việc dùng transform trên phần tử gốc <svg> rất tiện để áp dụng biến đổi cho toàn bộ ảnh SVG mà không cần thêm phần tử bao bọc hay giải pháp thay thế bằng CSS.

Trong SVG 1.1, chỉ có 16 phần tử sau được phép có transform được áp dụng: <a>, <circle>, <clipPath>, <defs>, <ellipse>, <foreignObject>, <g>, <image>, <line>, <path>, <polygon>, <polyline>, <rect>, <switch>, <text>, và <use>.

Ngoài ra, như một di sản từ SVG 1.1, <linearGradient><radialGradient> hỗ trợ thuộc tính gradientTransform, còn <pattern> hỗ trợ thuộc tính patternTransform, cả hai đều hoạt động chính xác như thuộc tính transform.

Giá trị

Giá trị <transform-list>
Giá trị mặc định none
Có thể hoạt ảnh

Ví dụ

Áp dụng biến đổi cho một phần tử SVG đơn lẻ

Trong ví dụ này, chúng ta áp dụng transform cho một phần tử <g> duy nhất bên trong tài liệu SVG:

html
<svg
  viewBox="-40 0 150 100"
  xmlns="http://www.w3.org/2000/svg"
  xmlns:xlink="http://www.w3.org/1999/xlink">
  <g
    fill="grey"
    transform="rotate(-10 50 100)
               translate(-36 45.5)
               skewX(40)
               scale(1 0.5)">
    <path
      id="heart"
      d="M 10,30 A 20,20 0,0,1 50,30 A 20,20 0,0,1 90,30 Q 90,60 50,90 Q 10,60 10,30 z" />
  </g>

  <use href="#heart" fill="none" stroke="red" />
</svg>

Áp dụng biến đổi cho toàn bộ tài liệu SVG

Trong ví dụ này, chúng ta áp dụng transform cho phần tử gốc <svg>, nghĩa là phép biến đổi được áp dụng cho toàn bộ tài liệu SVG:

html
<svg
  viewBox="-40 0 150 100"
  xmlns="http://www.w3.org/2000/svg"
  xmlns:xlink="http://www.w3.org/1999/xlink"
  transform="rotate(-10 50 100)
               translate(-36 15.5)
               skewX(40)
               scale(1 0.5)">
  <g fill="grey">
    <path
      id="heart"
      d="M 10,30 A 20,20 0,0,1 50,30 A 20,20 0,0,1 90,30 Q 90,60 50,90 Q 10,60 10,30 z" />
  </g>

  <use href="#heart" fill="none" stroke="red" />
</svg>

Các hàm biến đổi

Các hàm biến đổi sau có thể được dùng bởi <transform-list> của thuộc tính transform.

Warning: Theo đặc tả, bạn cũng nên có thể dùng các hàm biến đổi của CSS. Tuy nhiên, khả năng tương thích không được đảm bảo.

Matrix

Hàm biến đổi matrix(<a> <b> <c> <d> <e> <f>) chỉ định một phép biến đổi dưới dạng ma trận biến đổi gồm sáu giá trị. matrix(a,b,c,d,e,f) tương đương với việc áp dụng ma trận biến đổi:

(acebdf001)\begin{pmatrix} a & c & e \\ b & d & f \\ 0 & 0 & 1 \end{pmatrix}

Ma trận này ánh xạ tọa độ từ hệ tọa độ trước đó sang hệ tọa độ mới theo các đẳng thức ma trận sau:

(xnewCoordSysynewCoordSys1)=(acebdf001)(xprevCoordSysyprevCoordSys1)=(axprevCoordSys+cyprevCoordSys+ebxprevCoordSys+dyprevCoordSys+f1 \begin{pmatrix} x_{\mathrm{newCoordSys}} \\ y_{\mathrm{newCoordSys}} \\ 1 \end{pmatrix} = \begin{pmatrix} a & c & e \\ b & d & f \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x_{\mathrm{prevCoordSys}} \\ y_{\mathrm{prevCoordSys}} \\ 1 \end{pmatrix} = \begin{pmatrix} a x_{\mathrm{prevCoordSys}} + c y_{\mathrm{prevCoordSys}} + e \\ b x_{\mathrm{prevCoordSys}} + d y_{\mathrm{prevCoordSys}} + f \\ 1 \end{pmatrix}

Ví dụ

html
<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
  <rect x="10" y="10" width="30" height="20" fill="green" />

  <!--
  In the following example we are applying the matrix:
  [a c e]    [3 -1 30]
  [b d f] => [1  3 40]
  [0 0 1]    [0  0  1]

  which transform the rectangle as such:

  top left corner: oldX=10 oldY=10
  newX = a * oldX + c * oldY + e = 3 * 10 - 1 * 10 + 30 = 50
  newY = b * oldX + d * oldY + f = 1 * 10 + 3 * 10 + 40 = 80

  top right corner: oldX=40 oldY=10
  newX = a * oldX + c * oldY + e = 3 * 40 - 1 * 10 + 30 = 140
  newY = b * oldX + d * oldY + f = 1 * 40 + 3 * 10 + 40 = 110

  bottom left corner: oldX=10 oldY=30
  newX = a * oldX + c * oldY + e = 3 * 10 - 1 * 30 + 30 = 30
  newY = b * oldX + d * oldY + f = 1 * 10 + 3 * 30 + 40 = 140

  bottom right corner: oldX=40 oldY=30
  newX = a * oldX + c * oldY + e = 3 * 40 - 1 * 30 + 30 = 120
  newY = b * oldX + d * oldY + f = 1 * 40 + 3 * 30 + 40 = 170
  -->
  <rect
    x="10"
    y="10"
    width="30"
    height="20"
    fill="red"
    transform="matrix(3 1 -1 3 30 40)" />
</svg>

Translate

Hàm biến đổi translate(<x> [<y>]) di chuyển đối tượng theo xy. Nếu không cung cấp y, nó được xem là 0.

Nói cách khác:

xNew = xOld + <x>
yNew = yOld + <y>

Ví dụ

html
<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
  <!-- No translation -->
  <rect x="5" y="5" width="40" height="40" fill="green" />

  <!-- Horizontal translation -->
  <rect
    x="5"
    y="5"
    width="40"
    height="40"
    fill="blue"
    transform="translate(50)" />

  <!-- Vertical translation -->
  <rect
    x="5"
    y="5"
    width="40"
    height="40"
    fill="red"
    transform="translate(0 50)" />

  <!-- Both horizontal and vertical translation -->
  <rect
    x="5"
    y="5"
    width="40"
    height="40"
    fill="yellow"
    transform="translate(50 50)" />
</svg>

Scale

Hàm biến đổi scale(<x> [<y>]) chỉ định một phép co giãn theo xy. Nếu không cung cấp y, nó được xem là bằng x.

Ví dụ

html
<svg viewBox="-50 -50 100 100" xmlns="http://www.w3.org/2000/svg">
  <!-- uniform scale -->
  <circle cx="0" cy="0" r="10" fill="red" transform="scale(4)" />
</svg>