기하 인터페이스 모듈 레벨 1

W3C 후보 권고안 초안,

이 문서에 대한 자세한 정보
현재 버전:
https://www.w3.org/TR/2025/CRD-geometry-1-20251204/
최신 공개 버전:
https://www.w3.org/TR/geometry-1/
편집자 초안:
https://drafts.csswg.org/geometry/
이전 버전:
변경 이력:
https://www.w3.org/standards/history/geometry-1/
구현 보고서:
https://wpt.fyi/results/css/geometry
테스트 모음:
http://test.csswg.org/suites/geometry-1_dev/nightly-unstable/
https://wpt.fyi/results/css/geometry/
피드백:
CSSWG 이슈 저장소
편집자:
(Wix.com)
(Invited Expert)
이전 편집자:
(Adobe Inc.)
(Google)
(Opera Software AS)
(Magic Leap)
이 명세에 대한 수정 제안:
GitHub 편집기

요약

이 명세는 점, 직사각형, 사사각형 및 변환 행렬을 표현하는 기본 기하 인터페이스를 제공하며, 다른 모듈이나 명세에서 사용할 수 있습니다.

CSS는 구조화된 문서(예: HTML 및 XML)의 렌더링을 화면, 종이 등에서 설명하기 위한 언어입니다.

이 문서의 상태

이 절은 문서가 발행된 시점의 상태를 설명합니다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 색인에서 확인할 수 있습니다.

이 문서는 CSS 워킹 그룹권고안 트랙을 사용하여 후보 권고안 초안으로 발행했습니다. 후보 권고안으로의 발행은 W3C 및 그 회원의 지지를 의미하지 않습니다. 후보 권고안 초안은 이전 후보 권고안에서 작업 그룹이 이후의 후보 권고안 스냅샷에 포함하려는 변경 사항을 반영합니다.

이는 초안 문서로서 언제든지 업데이트되거나 대체되거나 다른 문서에 의해 폐기될 수 있습니다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 적절하지 않습니다.

피드백은 GitHub에 이슈를 제출(권장)하여 보내주세요. 제목에 스펙 코드 “geometry”를 포함해 다음과 같이 작성하세요: “[geometry] …코멘트 요약…”. 모든 이슈와 코멘트는 아카이브됩니다. 또는, 피드백을 (아카이브됨) 공개 메일링 리스트 www-style@w3.org로 보낼 수 있습니다.

이 문서는 2025년 8월 18일 W3C 프로세스 문서에 의해 관리됩니다.

이 문서는 W3C 특허 정책 하에 운영되는 그룹에 의해 제작되었습니다. W3C는 해당 그룹의 산출물과 관련하여 이루어진 특허 공개의 공개 목록을 유지합니다; 해당 페이지에는 특허 공개 방법에 대한 지침도 포함되어 있습니다. 개인이 필수 청구항을 포함한다고 믿는 특허에 대해 실제로 알고 있는 경우, W3C 특허 정책 6절에 따라 정보를 공개해야 합니다.

1. 소개

이 절은 규범적이지 않습니다.

이 명세는 3x2 및 4x4 차원의 점, 직사각형, 사사각형 그리고 변환 행렬을 표현하기 위한 여러 기하 인터페이스를 설명합니다.

SVG 인터페이스인 SVGPoint, SVGRect 그리고 SVGMatrix는 여기에서 정의한 인터페이스의 별칭으로, SVG, 캔버스 2D 컨텍스트 및 CSS 변환에서 사용하는 공통 인터페이스를 선호합니다. [SVG11] [HTML] [CSS3-TRANSFORMS]

테스트

2. DOMPoint 인터페이스

2D 또는 3D 은 다음 WebIDL 인터페이스로 표현될 수 있습니다:

[Exposed=(Window,Worker),
 Serializable]
interface DOMPointReadOnly {
    constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
            optional unrestricted double z = 0, optional unrestricted double w = 1);

    [NewObject] static DOMPointReadOnly fromPoint(optional DOMPointInit other = {});

    readonly attribute unrestricted double x;
    readonly attribute unrestricted double y;
    readonly attribute unrestricted double z;
    readonly attribute unrestricted double w;

    [NewObject] DOMPoint matrixTransform(optional DOMMatrixInit matrix = {});

    [Default] object toJSON();
};

[Exposed=(Window,Worker),
 Serializable,
 LegacyWindowAlias=SVGPoint]
interface DOMPoint : DOMPointReadOnly {
    constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
            optional unrestricted double z = 0, optional unrestricted double w = 1);

    [NewObject] static DOMPoint fromPoint(optional DOMPointInit other = {});

    inherit attribute unrestricted double x;
    inherit attribute unrestricted double y;
    inherit attribute unrestricted double z;
    inherit attribute unrestricted double w;
};

dictionary DOMPointInit {
    unrestricted double x = 0;
    unrestricted double y = 0;
    unrestricted double z = 0;
    unrestricted double w = 1;
};

다음 알고리즘은 DOMPointReadOnly 객체가 내부 멤버 변수 x 좌표, y 좌표, z 좌표w 원근을 가지고 있음을 가정합니다. DOMPointReadOnly 뿐만 아니라 상속받는 인터페이스 DOMPoint는 이 변수들의 값을 접근 및 설정할 수 있어야 합니다.

인터페이스가 DOMPointReadOnly 객체를 속성이나 함수로 반환하는 경우 내부 멤버 변수 값을 수정할 수 있을 수도 있습니다. 이러한 인터페이스는 반드시 이 능력을 명시적으로 서술해야 합니다.

내부 멤버 변수는 그 어떤 방법으로도 외부에 노출되어서는 안 됩니다.

DOMPointReadOnly(x, y, z, w)DOMPoint(x, y, z, w) 생성자가 호출될 때 다음 절차를 실행해야 합니다:

  1. point를 새로운 DOMPointReadOnly 또는 DOMPoint 객체로 초기화합니다.

  2. point의 변수 x 좌표x로, y 좌표y로, z 좌표z로, w 원근w로 설정합니다.

  3. point를 반환합니다.

테스트

fromPoint(other) 정적 메서드는 DOMPointReadOnly 에서 DOMPointReadOnly를 딕셔너리에서 생성 해야 합니다.

fromPoint(other) 정적 메서드는 DOMPoint에서 DOMPoint를 딕셔너리에서 생성 해야 합니다.

DOMPointReadOnly를 딕셔너리에서 생성 other 또는 DOMPoint를 딕셔너리에서 생성 other를 하려면 다음 단계를 따르세요:

  1. point를 새로운 DOMPointReadOnly 또는 DOMPoint 객체로 초기화합니다.

  2. point의 변수 x 좌표otherx 딕셔너리 멤버로, y 좌표othery 딕셔너리 멤버로, z 좌표otherz 딕셔너리 멤버로, w 원근otherw 딕셔너리 멤버로 설정합니다.

  3. point를 반환합니다.

x 속성은 getter 시 x 좌표 값을 반환해야 합니다. DOMPoint 인터페이스에서는 x 속성을 설정하면 x 좌표가 새로운 값으로 설정되어야 합니다.

y 속성은 getter 시 y 좌표 값을 반환해야 합니다. DOMPoint 인터페이스에서는 y 속성을 설정하면 y 좌표가 새로운 값으로 설정되어야 합니다.

z 속성은 getter 시 z 좌표 값을 반환해야 합니다. DOMPoint 인터페이스에서는 z 속성을 설정하면 z 좌표가 새로운 값으로 설정되어야 합니다.

w 속성은 getter 시 w 원근 값을 반환해야 합니다. DOMPoint 인터페이스에서는 w 속성을 설정하면 w 원근이 새로운 값으로 설정되어야 합니다.

matrixTransform(matrix) 메서드는 호출될 때 다음 절차를 실행해야 합니다:

  1. matrixObject딕셔너리에서 DOMMatrix 생성matrix에 대해 호출한 결과로 합니다.

  2. 현재 점과 matrixObject를 인자로 하여 행렬로 점 변환하기를 호출한 결과를 반환합니다. 현재 점은 수정되지 않습니다.

이 예제에서는 matrixTransform() 메서드를 DOMPoint 인스턴스에서 DOMMatrix 인스턴스를 인자로 호출합니다.
var point = new DOMPoint(5, 4);
var matrix = new DOMMatrix([2, 0, 0, 2, 10, 10]);
var transformedPoint = point.matrixTransform(matrix);

point 변수는 x 좌표가 5, y 좌표가 4로 초기화된 새로운 DOMPoint 객체로 설정됩니다. 이 새로운 DOMPoint는 이제 matrix로 스케일링(scale)되고 변환(translate)됩니다. 이로 인해 출력되는 transformedPointx 좌표가 20, y 좌표가 18이 됩니다.

테스트

2.1. 행렬로 점 변환하기

행렬로 변환하기를 하려면 pointmatrix를 기준으로 다음을 따라야 합니다:

  1. xpointx 좌표로 합니다.

  2. ypointy 좌표로 합니다.

  3. zpointz 좌표로 합니다.

  4. wpointw 원근으로 합니다.

  5. pointVectorx, y, z, w 순서의 요소로 구성된 새로운 컬럼 벡터로 합니다.

    x y z w
  6. pointVector전치 곱하여 matrix와 곱한 값으로 설정합니다.

  7. transformedPoint를 새로운 DOMPoint 객체로 합니다.

  8. transformedPointx 좌표pointVector의 첫 번째 요소로 설정합니다.

  9. transformedPointy 좌표pointVector의 두 번째 요소로 설정합니다.

  10. transformedPointz 좌표pointVector의 세 번째 요소로 설정합니다.

  11. transformedPointw 원근pointVector의 네 번째 요소로 설정합니다.

  12. transformedPoint를 반환합니다.

참고: matrixis 2D가 true이고, pointz 좌표0 또는 -0이며 pointw 원근1이면 이것은 2D 변환입니다. 그렇지 않으면 3D 변환입니다.

3. DOMRect 인터페이스

DOMRectReadOnly 인터페이스를 구현하는 객체는 직사각형을 나타냅니다.

직사각형은 다음과 같은 속성을 가집니다:

기점(origin)

직사각형의 너비(width)가 음이 아니면 수평 기점은 왼쪽 모서리이고, 그렇지 않으면 오른쪽 모서리입니다. 마찬가지로 높이(height)가 음이 아니면 수직 기점은 상단 모서리이고, 그렇지 않으면 하단 모서리입니다.

x 좌표

뷰포트의 왼쪽 모서리와 직사각형의 기점 사이의 수평 거리입니다.

y 좌표

뷰포트의 상단 모서리와 직사각형의 기점 사이의 수직 거리입니다.

너비(width)

직사각형의 너비입니다. 음수일 수 있습니다.

높이(height)

직사각형의 높이입니다. 음수일 수 있습니다.

[Exposed=(Window,Worker),
 Serializable]
interface DOMRectReadOnly {
    constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
            optional unrestricted double width = 0, optional unrestricted double height = 0);

    [NewObject] static DOMRectReadOnly fromRect(optional DOMRectInit other = {});

    readonly attribute unrestricted double x;
    readonly attribute unrestricted double y;
    readonly attribute unrestricted double width;
    readonly attribute unrestricted double height;
    readonly attribute unrestricted double top;
    readonly attribute unrestricted double right;
    readonly attribute unrestricted double bottom;
    readonly attribute unrestricted double left;

    [Default] object toJSON();
};

[Exposed=(Window,Worker),
 Serializable,
 LegacyWindowAlias=SVGRect]
interface DOMRect : DOMRectReadOnly {
    constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
            optional unrestricted double width = 0, optional unrestricted double height = 0);

    [NewObject] static DOMRect fromRect(optional DOMRectInit other = {});

    inherit attribute unrestricted double x;
    inherit attribute unrestricted double y;
    inherit attribute unrestricted double width;
    inherit attribute unrestricted double height;
};

dictionary DOMRectInit {
    unrestricted double x = 0;
    unrestricted double y = 0;
    unrestricted double width = 0;
    unrestricted double height = 0;
};

다음 알고리즘은 DOMRectReadOnly 객체가 내부 멤버 변수 x 좌표, y 좌표, 너비 값높이 값을 가지고 있음을 가정합니다. DOMRectReadOnly 뿐만 아니라 상속 인터페이스 DOMRect는 이 변수들의 값을 접근 및 설정할 수 있어야 합니다.

속성이나 함수로 DOMRectReadOnly 객체를 반환하는 인터페이스는 내부 멤버 변수 값을 수정할 수 있을 수도 있습니다. 이런 인터페이스는 이런 기능을 명시적으로 기술해야 합니다.

내부 멤버 변수는 어떠한 방식으로도 노출되어서는 안 됩니다.

DOMRectReadOnly(x, y, width, height)DOMRect(x, y, width, height) 생성자는 호출될 때 다음 절차를 따라야 합니다:

  1. rect를 새로운 DOMRectReadOnly 또는 DOMRect 객체로 만듭니다.

  2. rect의 변수 x 좌표x로, y 좌표y로, 너비 값width로, 높이 값height로 설정합니다.

  3. rect를 반환합니다.

fromRect(other) 정적 메서드는 DOMRectReadOnly 에서 딕셔너리에서 DOMRectReadOnly 생성other로 실행해야 합니다.

fromRect(other) 정적 메서드는 DOMRect 에서 딕셔너리에서 DOMRect 생성other로 실행해야 합니다.

DOMRectReadOnly를 딕셔너리에서 생성 other 또는 DOMRect를 딕셔너리에서 생성 other를 하려면 다음 단계를 따르세요:

  1. rect를 새로운 DOMRectReadOnly 또는 DOMRect로 만듭니다.

  2. rect의 변수 x 좌표otherx 딕셔너리 멤버로, y 좌표othery 딕셔너리 멤버로, 너비 값otherwidth 딕셔너리 멤버로, 높이 값otherheight 딕셔너리 멤버로 설정합니다.

  3. rect를 반환합니다.

x 속성은 getter 시 x 좌표 값을 반환해야 합니다. DOMRect 인터페이스에서는 x 속성 설정 시 x 좌표가 새로운 값으로 설정되어야 합니다.

y 속성은 getter 시 y 좌표 값을 반환해야 합니다. DOMRect 인터페이스에서는 y 속성 설정 시 y 좌표가 새로운 값으로 설정되어야 합니다.

width 속성은 getter 시 너비 값을 반환해야 합니다. DOMRect 인터페이스에서는 width 속성 설정 시 너비 값을 새로운 값으로 설정해야 합니다.

height 속성은 getter 시 높이 값을 반환해야 합니다. DOMRect 인터페이스에서는 height 속성 설정 시 높이 값을 새로운 값으로 설정해야 합니다.

top 속성은 getter 시 NaN-안전 최소값을 반환해야 하며, y 좌표y 좌표높이 값의 합 사이에서 계산됩니다.

right 속성은 getter 시 NaN-안전 최대값을 반환해야 하며, x 좌표x 좌표너비 값의 합 사이에서 계산됩니다.

bottom 속성은 getter 시 NaN-안전 최대값을 반환해야 하며, y 좌표y 좌표높이 값의 합 사이에서 계산됩니다.

left 속성은 getter 시 NaN-안전 최소값을 반환해야 하며, x 좌표x 좌표너비 값의 합 사이에서 계산됩니다.

테스트

4. DOMRectList 인터페이스

[Exposed=Window]
interface DOMRectList {
    readonly attribute unsigned long length;
    getter DOMRect? item(unsigned long index);
};

length 속성은 해당 객체에 연관된 모든 DOMRect 객체의 총 개수를 반환해야 합니다.

item(index) 메서드는, 호출될 때 index가 해당 객체에 연관된 DOMRect 객체의 개수보다 크거나 같으면 null을 반환해야 합니다. 그렇지 않으면 index에 해당하는 DOMRect 객체를 반환해야 합니다. 인덱스는 0부터 시작합니다.

DOMRectList 는 오직 레거시 웹 콘텐츠 호환성을 위해 존재합니다. 새로운 API를 지정할 때에는 DOMRectList를 사용하지 말아야 하며, 대신 sequence<DOMRect>를 사용해야 합니다. [WEBIDL]

테스트

5. DOMQuad 인터페이스

DOMQuad 인터페이스를 구현하는 객체는 사사각형을 나타냅니다.

[Exposed=(Window,Worker),
 Serializable]
interface DOMQuad {
    constructor(optional DOMPointInit p1 = {}, optional DOMPointInit p2 = {},
            optional DOMPointInit p3 = {}, optional DOMPointInit p4 = {});

    [NewObject] static DOMQuad fromRect(optional DOMRectInit other = {});
    [NewObject] static DOMQuad fromQuad(optional DOMQuadInit other = {});

    [SameObject] readonly attribute DOMPoint p1;
    [SameObject] readonly attribute DOMPoint p2;
    [SameObject] readonly attribute DOMPoint p3;
    [SameObject] readonly attribute DOMPoint p4;
    [NewObject] DOMRect getBounds();

    [Default] object toJSON();
};

dictionary DOMQuadInit {
  DOMPointInit p1;
  DOMPointInit p2;
  DOMPointInit p3;
  DOMPointInit p4;
};

다음 알고리즘은 DOMQuad 객체가 내부 멤버 변수 첫 번째 점, 두 번째 점, 세 번째 점, 네 번째 점을 가지고 있음을 가정합니다. 이 값들은 DOMPoint 객체입니다. DOMQuad는 이 변수값을 접근하고 설정할 수 있어야 하며, 작성자는 이 DOMPoint 객체를 수정할 수 있고, 이는 사사각형 객체에 직접 영향을 줍니다.

속성이나 함수로 DOMQuad 객체를 반환하는 인터페이스는 내부 멤버 변수 값을 수정할 수 있을 수도 있습니다. 이런 인터페이스는 이런 능력을 명확히 기술해야 합니다.

내부 멤버 변수는 외부에 노출되지 않아야 합니다.

DOMQuad(p1, p2, p3, p4) 생성자를 호출하면 다음 절차를 따라야 합니다:

  1. point1p1 딕셔너리의 각 멤버 값으로 속성을 설정한 새로운 DOMPoint 객체로 초기화합니다.

  2. point2p2 딕셔너리의 각 멤버 값으로 속성을 설정한 새로운 DOMPoint 객체로 초기화합니다.

  3. point3p3 딕셔너리의 각 멤버 값으로 속성을 설정한 새로운 DOMPoint 객체로 초기화합니다.

  4. point4p4 딕셔너리의 각 멤버 값으로 속성을 설정한 새로운 DOMPoint 객체로 초기화합니다.

  5. DOMQuad첫 번째 점point1, 두 번째 점point2, 세 번째 점point3, 네 번째 점point4로 설정해 반환합니다.

참고: DOMPointDOMPointReadOnly 매개변수도 전달할 수 있습니다. 전달된 매개변수는 내부적으로 WebIDL 규칙을 따라 올바른 객체 타입으로 변환됩니다. [WEBIDL]

fromRect(other) 정적 메서드는 DOMQuad에서 DOMRectInit 딕셔너리로부터 DOMQuad 생성other로 실행해야 합니다.

DOMRectInit 딕셔너리로부터 DOMQuad 생성 other는 다음 절차를 따릅니다:

  1. x, y, width, height를 각각 otherx, y, width, height로 설정합니다.

  2. point1DOMPoint 객체로 초기화합니다. x 좌표x, y 좌표y, z 좌표0, w 원근1.

  3. point2DOMPoint 객체로 초기화합니다. x 좌표x+width, y 좌표y, z 좌표0, w 원근1.

  4. point3DOMPoint 객체로 초기화합니다. x 좌표x+width, y 좌표y+height, z 좌표0, w 원근1.

  5. point4DOMPoint 객체로 초기화합니다. x 좌표x, y 좌표y+height, z 좌표0, w 원근1.

  6. DOMQuad첫 번째 점point1, 두 번째 점point2, 세 번째 점point3, 네 번째 점point4로 설정해 반환합니다.

fromQuad(other) 정적 메서드는 DOMQuad에서 DOMQuadInit 딕셔너리로부터 DOMQuad 생성other로 실행해야 합니다.

DOMQuadInit 딕셔너리로부터 DOMQuad 생성 other는 다음 절차를 따릅니다:

  1. point1otherp1 딕셔너리 멤버가 존재하면 딕셔너리로부터 DOMPoint 생성 결과로 초기화합니다.

  2. point2otherp2 딕셔너리 멤버가 존재하면 딕셔너리로부터 DOMPoint 생성 결과로 초기화합니다.

  3. point3otherp3 딕셔너리 멤버가 존재하면 딕셔너리로부터 DOMPoint 생성 결과로 초기화합니다.

  4. point4otherp4 딕셔너리 멤버가 존재하면 딕셔너리로부터 DOMPoint 생성 결과로 초기화합니다.

  5. DOMQuad첫 번째 점point1, 두 번째 점point2, 세 번째 점point3, 네 번째 점point4로 설정해 반환합니다.

p1 속성은 첫 번째 점을 반환해야 합니다.

p2 속성은 두 번째 점을 반환해야 합니다.

p3 속성은 세 번째 점을 반환해야 합니다.

p4 속성은 네 번째 점을 반환해야 합니다.

getBounds() 메서드는 호출될 때 다음 알고리즘을 따라야 합니다:

  1. boundsDOMRect 객체로 초기화합니다.

  2. leftNaN-안전 최소값으로 합니다. 첫 번째 점x 좌표, 두 번째 점x 좌표, 세 번째 점x 좌표, 네 번째 점x 좌표.

  3. topNaN-안전 최소값으로 합니다. 첫 번째 점y 좌표, 두 번째 점y 좌표, 세 번째 점y 좌표, 네 번째 점y 좌표.

  4. rightNaN-안전 최대값으로 합니다. 첫 번째 점x 좌표, 두 번째 점x 좌표, 세 번째 점x 좌표, 네 번째 점x 좌표.

  5. bottomNaN-안전 최대값으로 합니다. 첫 번째 점y 좌표, 두 번째 점y 좌표, 세 번째 점y 좌표, 네 번째 점y 좌표.

  6. boundsx 좌표left, y 좌표top, 너비 값right-left, 높이 값bottom-top으로 설정합니다.

  7. bounds를 반환합니다.

테스트
이 예제에서는 DOMQuad 생성자가 DOMPointDOMPointInit 타입의 인자를 함께 호출합니다. 두 인자 모두 허용되며 사용할 수 있습니다.
var point = new DOMPoint(2, 0);
var quad1 = new DOMQuad(point, {x: 12, y: 0}, {x: 12, y: 10}, {x: 2, y: 10});

DOMQuadquad1의 속성 값은 아래의 DOMQuad quad2와 동등합니다:

var rect = new DOMRect(2, 0, 10, 10);
var quad2 = DOMQuad.fromRect(rect);
다음은 불규칙한 사사각형 예시입니다:
new DOMQuad({x: 40, y: 25}, {x: 180, y: 8}, {x: 210, y: 150}, {x: 10, y: 180});
불규칙한 사사각형이 DOMQuad로 표현됨. 네 빨간 원은 DOMPoint 속성 p1~p4를 나타냄. 점선 사각형은 DOMQuadgetBounds() 메서드가 반환하는 경계 사각형이다.

6. DOMMatrix 인터페이스

DOMMatrixDOMMatrixReadOnly 인터페이스는 그래픽 컨텍스트에서 변환을 설명하기 위한 수학적 행렬을 나타냅니다. 아래 절에서는 인터페이스의 세부 사항을 설명합니다.

m 11 m 21 m 31 m 41 m 12 m 22 m 32 m 42 m 13 m 23 m 33 m 43 m 14 m 24 m 34 m 44
4x4 추상 행렬로, 항목 m11부터 m44까지를 포함합니다.

아래 절에서 용어는 다음과 같은 의미를 갖습니다:

후행 곱(post-multiply)

AB로 후행 곱(post-multiply)하면 A · B와 같습니다.

선행 곱(pre-multiply)

AB로 선행 곱(pre-multiply)하면 B · A와 같습니다.

곱(multiply)

AB로 곱하면 A · B와 같습니다.

[Exposed=(Window,Worker),
 Serializable]
interface DOMMatrixReadOnly {
    constructor(optional (DOMString or sequence<unrestricted double>) init);

    [NewObject] static DOMMatrixReadOnly fromMatrix(optional DOMMatrixInit other = {});
    [NewObject] static DOMMatrixReadOnly fromFloat32Array(Float32Array array32);
    [NewObject] static DOMMatrixReadOnly fromFloat64Array(Float64Array array64);

    // These attributes are simple aliases for certain elements of the 4x4 matrix
    readonly attribute unrestricted double a;
    readonly attribute unrestricted double b;
    readonly attribute unrestricted double c;
    readonly attribute unrestricted double d;
    readonly attribute unrestricted double e;
    readonly attribute unrestricted double f;

    readonly attribute unrestricted double m11;
    readonly attribute unrestricted double m12;
    readonly attribute unrestricted double m13;
    readonly attribute unrestricted double m14;
    readonly attribute unrestricted double m21;
    readonly attribute unrestricted double m22;
    readonly attribute unrestricted double m23;
    readonly attribute unrestricted double m24;
    readonly attribute unrestricted double m31;
    readonly attribute unrestricted double m32;
    readonly attribute unrestricted double m33;
    readonly attribute unrestricted double m34;
    readonly attribute unrestricted double m41;
    readonly attribute unrestricted double m42;
    readonly attribute unrestricted double m43;
    readonly attribute unrestricted double m44;

    readonly attribute boolean is2D;
    readonly attribute boolean isIdentity;

    // Immutable transform methods
    [NewObject] DOMMatrix translate(optional unrestricted double tx = 0,
                                    optional unrestricted double ty = 0,
                                    optional unrestricted double tz = 0);
    [NewObject] DOMMatrix scale(optional unrestricted double scaleX = 1,
                                optional unrestricted double scaleY,
                                optional unrestricted double scaleZ = 1,
                                optional unrestricted double originX = 0,
                                optional unrestricted double originY = 0,
                                optional unrestricted double originZ = 0);
    [NewObject] DOMMatrix scaleNonUniform(optional unrestricted double scaleX = 1,
                                          optional unrestricted double scaleY = 1);
    [NewObject] DOMMatrix scale3d(optional unrestricted double scale = 1,
                                  optional unrestricted double originX = 0,
                                  optional unrestricted double originY = 0,
                                  optional unrestricted double originZ = 0);
    [NewObject] DOMMatrix rotate(optional unrestricted double rotX = 0,
                                 optional unrestricted double rotY,
                                 optional unrestricted double rotZ);
    [NewObject] DOMMatrix rotateFromVector(optional unrestricted double x = 0,
                                           optional unrestricted double y = 0);
    [NewObject] DOMMatrix rotateAxisAngle(optional unrestricted double x = 0,
                                          optional unrestricted double y = 0,
                                          optional unrestricted double z = 0,
                                          optional unrestricted double angle = 0);
    [NewObject] DOMMatrix skewX(optional unrestricted double sx = 0);
    [NewObject] DOMMatrix skewY(optional unrestricted double sy = 0);
    [NewObject] DOMMatrix multiply(optional DOMMatrixInit other = {});
    [NewObject] DOMMatrix flipX();
    [NewObject] DOMMatrix flipY();
    [NewObject] DOMMatrix inverse();

    [NewObject] DOMPoint transformPoint(optional DOMPointInit point = {});
    [NewObject] Float32Array toFloat32Array();
    [NewObject] Float64Array toFloat64Array();

    [Exposed=Window] stringifier;
    [Default] object toJSON();
};

[Exposed=(Window,Worker),
 Serializable,
 LegacyWindowAlias=(SVGMatrix,WebKitCSSMatrix)]
interface DOMMatrix : DOMMatrixReadOnly {
    constructor(optional (DOMString or sequence<unrestricted double>) init);

    [NewObject] static DOMMatrix fromMatrix(optional DOMMatrixInit other = {});
    [NewObject] static DOMMatrix fromFloat32Array(Float32Array array32);
    [NewObject] static DOMMatrix fromFloat64Array(Float64Array array64);

    // These attributes are simple aliases for certain elements of the 4x4 matrix
    inherit attribute unrestricted double a;
    inherit attribute unrestricted double b;
    inherit attribute unrestricted double c;
    inherit attribute unrestricted double d;
    inherit attribute unrestricted double e;
    inherit attribute unrestricted double f;

    inherit attribute unrestricted double m11;
    inherit attribute unrestricted double m12;
    inherit attribute unrestricted double m13;
    inherit attribute unrestricted double m14;
    inherit attribute unrestricted double m21;
    inherit attribute unrestricted double m22;
    inherit attribute unrestricted double m23;
    inherit attribute unrestricted double m24;
    inherit attribute unrestricted double m31;
    inherit attribute unrestricted double m32;
    inherit attribute unrestricted double m33;
    inherit attribute unrestricted double m34;
    inherit attribute unrestricted double m41;
    inherit attribute unrestricted double m42;
    inherit attribute unrestricted double m43;
    inherit attribute unrestricted double m44;

    // Mutable transform methods
    DOMMatrix multiplySelf(optional DOMMatrixInit other = {});
    DOMMatrix preMultiplySelf(optional DOMMatrixInit other = {});
    DOMMatrix translateSelf(optional unrestricted double tx = 0,
                            optional unrestricted double ty = 0,
                            optional unrestricted double tz = 0);
    DOMMatrix scaleSelf(optional unrestricted double scaleX = 1,
                        optional unrestricted double scaleY,
                        optional unrestricted double scaleZ = 1,
                        optional unrestricted double originX = 0,
                        optional unrestricted double originY = 0,
                        optional unrestricted double originZ = 0);
    DOMMatrix scale3dSelf(optional unrestricted double scale = 1,
                          optional unrestricted double originX = 0,
                          optional unrestricted double originY = 0,
                          optional unrestricted double originZ = 0);
    DOMMatrix rotateSelf(optional unrestricted double rotX = 0,
                         optional unrestricted double rotY,
                         optional unrestricted double rotZ);
    DOMMatrix rotateFromVectorSelf(optional unrestricted double x = 0,
                                   optional unrestricted double y = 0);
    DOMMatrix rotateAxisAngleSelf(optional unrestricted double x = 0,
                                  optional unrestricted double y = 0,
                                  optional unrestricted double z = 0,
                                  optional unrestricted double angle = 0);
    DOMMatrix skewXSelf(optional unrestricted double sx = 0);
    DOMMatrix skewYSelf(optional unrestricted double sy = 0);
    DOMMatrix invertSelf();

    [Exposed=Window] DOMMatrix setMatrixValue(DOMString transformList);
};

dictionary DOMMatrix2DInit {
    unrestricted double a;
    unrestricted double b;
    unrestricted double c;
    unrestricted double d;
    unrestricted double e;
    unrestricted double f;
    unrestricted double m11;
    unrestricted double m12;
    unrestricted double m21;
    unrestricted double m22;
    unrestricted double m41;
    unrestricted double m42;
};

dictionary DOMMatrixInit : DOMMatrix2DInit {
    unrestricted double m13 = 0;
    unrestricted double m14 = 0;
    unrestricted double m23 = 0;
    unrestricted double m24 = 0;
    unrestricted double m31 = 0;
    unrestricted double m32 = 0;
    unrestricted double m33 = 1;
    unrestricted double m34 = 0;
    unrestricted double m43 = 0;
    unrestricted double m44 = 1;
    boolean is2D;
};

다음 알고리즘은 DOMMatrixReadOnly 객체가 내부 멤버 변수 m11 요소, m12 요소, m13 요소, m14 요소, m21 요소, m22 요소, m23 요소, m24 요소, m31 요소, m32 요소, m33 요소, m34 요소, m41 요소, m42 요소, m43 요소, m44 요소 그리고 is 2D를 가지고 있음을 가정합니다. DOMMatrixReadOnly 뿐만 아니라 상속 인터페이스 DOMMatrix는 이 변수들의 값을 접근 및 설정할 수 있어야 합니다.

속성이나 함수로 DOMMatrixReadOnly 객체를 반환하는 인터페이스는 내부 멤버 변수 값을 수정할 수 있을 수도 있습니다. 이런 인터페이스는 이런 기능을 명확히 명시해야 합니다.

내부 멤버 변수는 절대 노출되어서는 안 됩니다.

DOMMatrixDOMMatrixReadOnly 인터페이스는 SVG의 SVGMatrix 인터페이스를 대체합니다. [SVG11]

테스트

6.1. DOMMatrix2DInit 및 DOMMatrixInit 딕셔너리

DOMMatrix2DInit 또는 DOMMatrixInit 딕셔너리 dict검증 및 수정(2D)하려면 다음 단계를 실행하십시오:

  1. 만약 dict에 대해 다음 조건 중 하나 이상이 참이라면 TypeError 예외를 발생시키고 이 단계를 중단하십시오.

  2. m11 값이 없으면, 멤버 a 값 또는 그 값도 없으면 1로 설정하세요.

  3. m12 값이 없으면, 멤버 b 값 또는 그 값도 없으면 0로 설정하세요.

  4. m21 값이 없으면, 멤버 c 값 또는 그 값도 없으면 0로 설정하세요.

  5. m22 값이 없으면, 멤버 d 값 또는 그 값도 없으면 1로 설정하세요.

  6. m41 값이 없으면, 멤버 e 값 또는 그 값도 없으면 0로 설정하세요.

  7. m42 값이 없으면, 멤버 f 값 또는 그 값도 없으면 0로 설정하세요.

참고: SameValueZero 비교 알고리즘은 두 NaN 값에 대해 true를 반환하며, 0-0도 역시 true를 반환합니다. [ECMA-262]

DOMMatrixInit 딕셔너리 dict검증 및 수정하려면 다음 단계를 실행하세요:

  1. 검증 및 수정(2D)dict에 적용하세요.

  2. is2D 값이 true이고 다음 중 하나라도 m13, m14, m23, m24, m31, m32, m34, m43 값이 0 또는 -0이 아닌 경우, 또는 m33, m44 값이 1이 아닌 경우, TypeError 예외를 발생시키고 중단하세요.

  3. is2D 값이 없고 다음 중 하나라도 m13, m14, m23, m24, m31, m32, m34, m43 값이 0 또는 -0이 아닌 경우, 또는 m33, m44 값이 1이 아닌 경우, is2D 값을 false로 설정하세요.

  4. is2D 값이 여전히 없으면 true로 설정하세요.

테스트

6.2. 문자열을 추상 행렬로 파싱하기

문자열을 추상 행렬로 파싱하기는, 문자열 transformList에 대해 아래 단계를 수행하는 것을 의미합니다. 4x4 추상 행렬과 boolean 2dTransform을 반환하거나, 실패를 반환합니다.

  1. transformList가 빈 문자열이면 "matrix(1, 0, 0, 1, 0, 0)"로 설정합니다.

  2. 파싱transformList에 대해 CSS transform 속성 문법으로 수행하세요. 결과는 <transform-list>, 키워드 none, 혹은 실패입니다. parsedValue가 실패이거나, <transform-function><length> 값이 절대 단위가 아니거나, none 이외의 키워드가 사용되면 실패를 반환합니다. [CSS3-SYNTAX] [CSS3-TRANSFORMS]

  3. parsedValuenone이라면, 단일 단위 행렬을 포함하는 <transform-list>parsedValue를 설정합니다.

  4. 2dTransformparsedValue의 2D/3D 차원 상태를 기록합니다.

    parsedValue3차원 변환 함수를 포함하는 경우

    2dTransformfalse로 설정합니다.

    그 외의 경우

    2dTransformtrue로 설정합니다.

  5. 모든 <transform-function>을 “변환 함수의 수학적 설명”을 따라 4x4 추상 행렬로 변환합니다. [CSS3-TRANSFORMS]

  6. matrix를 이 섹션의 첫 그림과 같은 4x4 추상 행렬로 초기화합니다. 모든 행렬을 왼쪽에서 오른쪽으로 후행 곱(post-multiply)해서 그 곱을 matrix로 설정합니다.

  7. matrix2dTransform을 반환합니다.

6.3. DOMMatrixReadOnly 및 DOMMatrix 객체 생성

2D 행렬 생성하기typeDOMMatrixReadOnly 또는 DOMMatrix이고, init이 6개 요소인 시퀀스일 때 다음을 수행합니다:

  1. matrixtype의 새 인스턴스로 초기화합니다.

  2. m11 요소, m12 요소, m21 요소, m22 요소, m41 요소, m42 요소init의 값 순서대로 차례로 설정합니다.

  3. m13 요소, m14 요소, m23 요소, m24 요소, m31 요소, m32 요소, m34 요소, m43 요소0으로 설정합니다.

  4. m33 요소m44 요소1로 설정합니다.

  5. is 2Dtrue로 설정합니다.

  6. matrix를 반환합니다.

3D 행렬 생성하기typeDOMMatrixReadOnly 또는 DOMMatrix이고, init이 16개 요소 시퀀스일 때 다음을 수행합니다:

  1. matrixtype의 새 인스턴스로 초기화합니다.

  2. m11 요소부터 m44 요소까지 init의 값을 컬럼 우선(열 우선) 순서로 설정합니다.

  3. is 2Dfalse로 설정합니다.

  4. matrix를 반환합니다.

DOMMatrixReadOnly(init)DOMMatrix(init) 생성자는 아래 절차를 따라야 합니다:

init이 생략된 경우

DOMMatrixReadOnly 또는 DOMMatrix 타입에 대해, 시퀀스 [1, 0, 0, 1, 0, 0]을 넣어 2D 행렬 생성하기를 호출한 결과를 반환합니다.

initDOMString인 경우
  1. current global objectWindow가 아니면 TypeError 예외를 던집니다.

  2. init을 추상 행렬로 파싱하고 matrix2dTransform을 얻습니다. 결과가 실패면 SyntaxError DOMException을 던집니다.

  3. 2dTransformtrue인 경우

    DOMMatrixReadOnly 또는 DOMMatrix 타입에 대해 2D 행렬 생성하기를, [m11, m12, m21, m22, m41, m42] 값으로 호출해 반환합니다.

    그 외의 경우

    DOMMatrixReadOnly 또는 DOMMatrix 타입에 대해 3D 행렬 생성하기를, 16개 값으로 호출해 반환합니다.

init이 6개 요소 시퀀스인 경우

DOMMatrixReadOnly 또는 DOMMatrix 타입에 대해 2D 행렬 생성하기init값으로 호출해 반환합니다.

init이 16개 요소 시퀀스인 경우

DOMMatrixReadOnly 또는 DOMMatrix 타입에 대해 3D 행렬 생성하기init값으로 호출해 반환합니다.

그외의 경우

TypeError 예외를 던집니다.

테스트

fromMatrix(other) 정적 메서드는 DOMMatrixReadOnly 에서 딕셔너리로부터 DOMMatrixReadOnly 생성other로 실행해야 합니다.

fromMatrix(other) 정적 메서드는 DOMMatrix 에서 딕셔너리로부터 DOMMatrix 생성other로 실행해야 합니다.

2D 딕셔너리로부터 DOMMatrixReadOnly 생성 other 또는 2D 딕셔너리로부터 DOMMatrix 생성 other를 위해 다음 단계를 수행하세요:

  1. 검증 및 수정(2D)other에 적용하세요.

  2. 다음 순서로 otherm11, m12, m21, m22, m41 그리고 m42 값으로 DOMMatrixReadOnly 또는 DOMMatrix 타입에 대해 2D 행렬 생성하기를 호출해 반환합니다.

딕셔너리로부터 DOMMatrixReadOnly 생성 other딕셔너리로부터 DOMMatrix 생성 other는 아래 절차를 따릅니다:

  1. 검증 및 수정other에 적용하세요.

  2. is2D 딕셔너리 멤버가 true인 경우

    다음 순서로 otherm11, m12, m21, m22, m41 그리고 m42 값으로 DOMMatrixReadOnly 또는 DOMMatrix 타입에 대해 2D 행렬 생성하기를 호출해 반환합니다.

    그 외의 경우

    다음 순서로 otherm11, m12, m13, ..., m44 값으로 DOMMatrixReadOnly 또는 DOMMatrix 타입에 대해 3D 행렬 생성하기를 호출해 반환합니다.

fromFloat32Array(array32) 정적 메서드는 DOMMatrixReadOnlyfromFloat32Array(array32) 정적 메서드는 DOMMatrix에서 아래 절차를 따라야 합니다:

array32가 6개 요소인 경우

DOMMatrixReadOnly 또는 DOMMatrix 타입에 대해 2D 행렬 생성하기를, array32값을 순서대로 넣어 호출해 반환합니다.

array32가 16개 요소인 경우

DOMMatrixReadOnly 또는 DOMMatrix 타입에 대해 3D 행렬 생성하기array32값을 순서대로 넣어 호출해 반환합니다.

그외의 경우

TypeError 예외를 던집니다.

fromFloat64Array(array64) 정적 메서드는 DOMMatrixReadOnlyfromFloat64Array(array64) 정적 메서드는 DOMMatrix에서 아래 절차를 따라야 합니다:

array64가 6개 요소인 경우

DOMMatrixReadOnly 또는 DOMMatrix 타입에 대해 2D 행렬 생성하기를, array64 값들을 순서대로 넣어 호출해 반환합니다.

array64가 16개 요소인 경우

DOMMatrixReadOnly 또는 DOMMatrix 타입에 대해 3D 행렬 생성하기를, array64 값들을 순서대로 넣어 호출해 반환합니다.

그외의 경우

TypeError 예외를 던집니다.

6.4. DOMMatrix 속성

다음 속성 m11 부터 m44 까지는 행렬 인터페이스의 16개 항목에 대응합니다.

m11a 속성은, getter 시 m11 요소 값을 반환해야 합니다. DOMMatrix 인터페이스에서는 m11 또는 a 속성을 설정하면 m11 요소를 새 값으로 설정해야 합니다.

m12b 속성은, getter 시 m12 요소 값을 반환해야 합니다. DOMMatrix 인터페이스에서는 m12 또는 b 속성을 설정하면 m12 요소를 새 값으로 설정해야 합니다.

m13 속성은 getter 시 m13 요소 값을 반환해야 합니다. DOMMatrix 인터페이스에서는 m13 속성 설정 시 m13 요소를 새 값으로 설정해야 하며, 이 값이 0 또는 -0이 아니라면 is 2Dfalse로 설정합니다.

m14 속성은 getter 시 m14 요소 값을 반환해야 합니다. DOMMatrix 인터페이스에서는 m14 속성 설정 시 m14 요소를 새 값으로 설정해야 하며, 이 값이 0 또는 -0이 아니라면 is 2Dfalse로 설정합니다.

m21c 속성은, getter 시 m21 요소 값을 반환해야 합니다. DOMMatrix 인터페이스에서는 m21 또는 c 속성을 설정하면 m21 요소를 새 값으로 설정해야 합니다.

m22d 속성은, getter 시 m22 요소 값을 반환해야 합니다. DOMMatrix 인터페이스에서는 m22 또는 d 속성을 설정하면 m22 요소를 새 값으로 설정해야 합니다.

m23 속성은 getter 시 m23 요소 값을 반환해야 합니다. DOMMatrix 인터페이스에서는 m23 속성을 설정하면 m23 요소를 새 값으로 설정해야 하며, 이 값이 0 또는 -0이 아니라면 is 2Dfalse로 설정합니다.

m24 속성은 getter 시 m24 요소 값을 반환해야 합니다. DOMMatrix 인터페이스에서는 m24 속성을 설정하면 m24 요소를 새 값으로 설정해야 하며, 이 값이 0 또는 -0이 아니라면 is 2Dfalse로 설정합니다.

m31 속성은 getter 시 m31 요소 값을 반환해야 합니다. DOMMatrix 인터페이스에서는 m31 속성을 설정하면 m31 요소를 새 값으로 설정해야 하며, 이 값이 0 또는 -0이 아니라면 is 2Dfalse로 설정합니다.

m32 속성은 getter 시 m32 요소 값을 반환해야 합니다. DOMMatrix 인터페이스에서는 m32 속성을 설정하면 m32 요소를 새 값으로 설정해야 하며, 이 값이 0 또는 -0이 아니라면 is 2Dfalse로 설정합니다.

m33 속성은 getter 시 m33 요소 값을 반환해야 합니다. DOMMatrix 인터페이스에서는 m33 속성을 설정하면 m33 요소를 새 값으로 설정해야 하며, 이 값이 1이 아니라면 is 2Dfalse로 설정합니다.

m34 속성은 getter 시 m34 요소 값을 반환해야 합니다. DOMMatrix 인터페이스에서는 m34 속성을 설정하면 m34 요소를 새 값으로 설정해야 하며, 이 값이 0 또는 -0이 아니라면 is 2Dfalse로 설정합니다.

m41e 속성은, getter 시 m41 요소 값을 반환해야 합니다. DOMMatrix 인터페이스에서는 m41 또는 e 속성을 설정하면 m41 요소를 새 값으로 설정해야 합니다.

m42f 속성은, getter 시 m42 요소 값을 반환해야 합니다. DOMMatrix 인터페이스에서는 m42 또는 f 속성을 설정하면 m42 요소를 새 값으로 설정해야 합니다.

m43 속성은 getter 시 m43 요소 값을 반환해야 합니다. DOMMatrix 인터페이스에서는 m43 속성을 설정하면 m43 요소를 새 값으로 설정해야 하며, 이 값이 0 또는 -0이 아니라면 is 2Dfalse로 설정합니다.

m44 속성은 getter 시 m44 요소 값을 반환해야 합니다. DOMMatrix 인터페이스에서는 m44 속성을 설정하면 m44 요소를 새 값으로 설정해야 하며, 이 값이 1이 아니라면 is 2Dfalse로 설정합니다.

다음 속성 a 부터 f 까지는 행렬 인터페이스의 2D 구성요소에 대응합니다.

a 속성은 m11 속성의 별칭입니다.

b 속성은 m12 속성의 별칭입니다.

c 속성은 m21 속성의 별칭입니다.

d 속성은 m22 속성의 별칭입니다.

e 속성은 m41 속성의 별칭입니다.

f 속성은 m42 속성의 별칭입니다.

테스트

다음 속성들은 DOMMatrixReadOnly 의 상태 정보를 제공합니다.

is2D 속성은 is 2D 값을 반환해야 합니다.

isIdentity 속성은 m12 요소, m13 요소, m14 요소, m21 요소, m23 요소, m24 요소, m31 요소, m32 요소, m34 요소, m41 요소, m42 요소, m43 요소0 또는 -0이고, m11 요소, m22 요소, m33 요소, m44 요소1이면 true를 반환해야 합니다. 그렇지 않으면 false를 반환합니다.

모든 DOMMatrixReadOnly 객체는 boolean is 2D 플래그가 있어야 합니다. 이 플래그는 아래를 나타냅니다:

  1. 현재 행렬이 2D 행렬로 초기화되었을 때. 자세한 내용은 개별 생성자를 참조하세요.

  2. 오직 2D 변환 연산만 적용되었습니다. 각 가변불변 변환 메서드마다 is 2Dfalse로 설정해야 하는지 정의합니다.

참고: is 2DDOMMatrix 객체에서 이전에 false로 설정된 경우 true로 다시 설정될 수 없습니다. 단, setMatrixValue() 메서드 호출 시는 예외입니다.

6.5. 불변 변환 메서드

아래 메서드들은 현재 행렬을 수정하지 않고 새로운 DOMMatrix 객체를 반환합니다.

translate(tx, ty, tz)
  1. result를 현재 행렬의 값으로 초기화된 행렬로 만듭니다.

  2. resulttranslateSelf() 변환을 tx, ty, tz 인자를 사용하여 수행합니다.

  3. result를 반환합니다.

현재 행렬은 수정되지 않습니다.

scale(scaleX, scaleY, scaleZ, originX, originY, originZ)
  1. scaleY가 없으면 scaleYscaleX 값으로 설정합니다.

  2. result를 현재 행렬의 값으로 초기화된 행렬로 만듭니다.

  3. resultscaleSelf() 변환을 scaleX, scaleY, scaleZ, originX, originY, originZ 인자로 수행합니다.

  4. result를 반환합니다.

현재 행렬은 수정되지 않습니다.

scaleNonUniform(scaleX, scaleY)

참고: 레거시 호환을 위해 SVG 1.1에서 정의된 SVGMatrix 와 호환을 위해 지원됩니다. 작성자는 scale() 사용을 권장합니다.

  1. result를 현재 행렬의 값으로 초기화된 행렬로 만듭니다.

  2. resultscaleSelf() 변환을 scaleX, scaleY, 1, 0, 0, 0 인자로 수행합니다.

  3. result를 반환합니다.

현재 행렬은 수정되지 않습니다.

scale3d(scale, originX, originY, originZ)
  1. result를 현재 행렬의 값으로 초기화된 행렬로 만듭니다.

  2. resultscale3dSelf() 변환을 scale, originX, originY, originZ 인자로 수행합니다.

  3. result를 반환합니다.

현재 행렬은 수정되지 않습니다.

rotate(rotX, rotY, rotZ)
  1. result를 현재 행렬의 값으로 초기화된 행렬로 만듭니다.

  2. resultrotateSelf() 변환을 rotX, rotY, rotZ 인자로 수행합니다.

  3. result를 반환합니다.

현재 행렬은 수정되지 않습니다.

rotateFromVector(x, y)
  1. result를 현재 행렬의 값으로 초기화된 행렬로 만듭니다.

  2. resultrotateFromVectorSelf() 변환을 x, y 인자로 수행합니다.

  3. result를 반환합니다.

현재 행렬은 수정되지 않습니다.

rotateAxisAngle(x, y, z, angle)
  1. result를 현재 행렬의 값으로 초기화된 행렬로 만듭니다.

  2. resultrotateAxisAngleSelf() 변환을 x, y, z, angle 인자로 수행합니다.

  3. result를 반환합니다.

현재 행렬은 수정되지 않습니다.

skewX(sx)
  1. result를 현재 행렬의 값으로 초기화된 행렬로 만듭니다.

  2. resultskewXSelf() 변환을 sx 인자로 수행합니다.

  3. result를 반환합니다.

현재 행렬은 수정되지 않습니다.

skewY(sy)
  1. result를 현재 행렬의 값으로 초기화된 행렬로 만듭니다.

  2. resultskewYSelf() 변환을 sy 인자로 수행합니다.

  3. result를 반환합니다.

현재 행렬은 수정되지 않습니다.

multiply(other)
  1. result를 현재 행렬의 값으로 초기화된 행렬로 만듭니다.

  2. resultmultiplySelf() 변환을 other 인자로 수행합니다.

  3. result를 반환합니다.

현재 행렬은 수정되지 않습니다.

flipX()
  1. result를 현재 행렬의 값으로 초기화된 행렬로 만듭니다.

  2. result후행 곱(post-multiply) new DOMMatrix([-1, 0, 0, 1, 0, 0])와 곱합니다.

  3. result를 반환합니다.

현재 행렬은 수정되지 않습니다.

flipY()
  1. result를 현재 행렬의 값으로 초기화된 행렬로 만듭니다.

  2. result후행 곱(post-multiply) new DOMMatrix([1, 0, 0, -1, 0, 0])와 곱합니다.

  3. result를 반환합니다.

현재 행렬은 수정되지 않습니다.

inverse()
  1. result를 현재 행렬의 값으로 초기화된 행렬로 만듭니다.

  2. resultinvertSelf() 변환을 수행합니다.

  3. result를 반환합니다.

현재 행렬은 수정되지 않습니다.

테스트

다음 메서드들은 현재 행렬을 수정하지 않습니다.

transformPoint(point)

pointObject딕셔너리로부터 DOMPoint 생성point를 넣어 호출한 결과로 초기화합니다. pointObject와 현재 행렬을 인자로 행렬로 점 변환하기를 호출한 결과를 반환합니다. 전달된 인자는 수정되지 않습니다.

toFloat32Array()

현재 행렬의 m11 부터 m44 까지 16개 요소를 컬럼 우선 순서로 직렬화한 Float32Array를 반환합니다.

toFloat64Array()

현재 행렬의 m11 부터 m44 까지 16개 요소를 컬럼 우선 순서로 직렬화한 Float64Array를 반환합니다.

문자열화 동작(stringification behavior)
  1. m11 요소부터 m44 요소 중 하나라도 유한한 값이 아니면 "InvalidStateError" DOMException을 던집니다.

    참고: CSS 문법은 NaN 또는 Infinity 값을 표현할 수 없습니다.

  2. string을 빈 문자열로 초기화합니다.

  3. is 2Dtrue라면:

    1. string에 "matrix("를 추가합니다.

    2. ! ToString(m11 요소)를 string에 추가합니다.

    3. string에 ", "를 추가합니다.

    4. ! ToString(m12 요소)를 string에 추가합니다.

    5. string에 ", "를 추가합니다.

    6. ! ToString(m21 요소)를 string에 추가합니다.

    7. string에 ", "를 추가합니다.

    8. ! ToString(m22 요소)를 string에 추가합니다.

    9. string에 ", "를 추가합니다.

    10. ! ToString(m41 요소)를 string에 추가합니다.

    11. string에 ", "를 추가합니다.

    12. ! ToString(m42 요소)를 string에 추가합니다.

    13. string에 ")"를 추가합니다.

    참고: 이 문자열은 CSS Transforms <matrix()> 함수 형태가 됩니다. [CSS3-TRANSFORMS]

  4. 그 외의 경우:

    1. string에 "matrix3d("를 추가합니다.

    2. ! ToString(m11 요소)를 string에 추가합니다.

    3. string에 ", "를 추가합니다.

    4. ! ToString(m12 요소)를 string에 추가합니다.

    5. string에 ", "를 추가합니다.

    6. ! ToString(m13 요소)를 string에 추가합니다.

    7. string에 ", "를 추가합니다.

    8. ! ToString(m14 요소)를 string에 추가합니다.

    9. string에 ", "를 추가합니다.

    10. ! ToString(m21 요소)를 string에 추가합니다.

    11. string에 ", "를 추가합니다.

    12. ! ToString(m22 요소)를 string에 추가합니다.

    13. string에 ", "를 추가합니다.

    14. ! ToString(m23 요소)를 string에 추가합니다.

    15. string에 ", "를 추가합니다.

    16. ! ToString(m24 요소)를 string에 추가합니다.

    17. string에 ", "를 추가합니다.

    18. ! ToString(m41 요소)를 string에 추가합니다.

    19. string에 ", "를 추가합니다.

    20. ! ToString(m42 요소)를 string에 추가합니다.

    21. string에 ", "를 추가합니다.

    22. ! ToString(m43 요소)를 string에 추가합니다.

    23. string에 ", "를 추가합니다.

    24. ! ToString(m44 요소)를 string에 추가합니다.

    25. string에 ")"를 추가합니다.

    참고: 이 문자열은 CSS Transforms <matrix3d()> 함수 형태가 됩니다. [CSS3-TRANSFORMS]

  5. string을 반환합니다.

테스트
테스트
이 예제에서는 행렬을 생성하고 여러 2D 변환 메서드를 호출합니다:
var matrix = new DOMMatrix();
matrix.scaleSelf(2);
matrix.translateSelf(20,20);
console.assert(matrix.toString() ===
                "matrix(2, 0, 0, 2, 40, 40)");
아래 예제에서는 행렬을 생성하고 여러 3D 변환 메서드를 호출합니다:
var matrix = new DOMMatrix();
matrix.scale3dSelf(2);
console.assert(matrix.toString() ===
                "matrix3d(2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1)");

3D 연산에는 문자열화 결과가 3D 행렬을 나타내는 문자열을 반환합니다.

이 예제에서는 행렬에 유한값이 아니기 때문에 예외가 발생합니다.
var matrix = new DOMMatrix([NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN]);
var string = matrix + " Batman!";

6.6. 가변 변환 메서드

아래 메서드들은 현재 행렬을 직접 수정하며, 각 메서드는 호출된 행렬 자신을 반환합니다. 주요 장점은 컨텐츠 작성자가 메서드 체이닝을 사용할 수 있다는 점입니다.

다음 코드 예시:
var matrix = new DOMMatrix();
matrix.translateSelf(20, 20);
matrix.scaleSelf(2);
matrix.translateSelf(-20, -20);

는 아래와 같이 체이닝 버전과 동일합니다:

var matrix = new DOMMatrix();
matrix.translateSelf(20, 20).scaleSelf(2).translateSelf(-20, -20);

참고: 메서드 체이닝을 사용하는 작성자는 불필요한 중간 DOMMatrix 객체의 생성으로 인한 메모리 낭비를 막기 위해, 가변 변환 메서드를 사용할 것을 권장합니다.

multiplySelf(other)
  1. otherObject딕셔너리로부터 DOMMatrix 생성other를 넣어 호출해 얻습니다.

  2. 현재 행렬에 otherObject를 후행 곱(post-multiply)합니다.

  3. otherObjectis 2Dfalse면, 현재 행렬의 is 2D 값을 false로 설정합니다.

  4. 현재 행렬을 반환합니다.

preMultiplySelf(other)
  1. otherObject딕셔너리로부터 DOMMatrix 생성other를 넣어 호출해 얻습니다.

  2. 현재 행렬에 otherObject를 선행 곱(pre-multiply)합니다.

  3. otherObjectis 2Dfalse면, 현재 행렬의 is 2D 값을 false로 설정합니다.

  4. 현재 행렬을 반환합니다.

translateSelf(tx, ty, tz)
  1. 현재 행렬에 translation 변환을 후행 곱(post-multiply)합니다. 3D translation 행렬은 CSS Transforms에서 정의됩니다. [CSS3-TRANSFORMS]

  2. tz가 명시되고 0 또는 -0이 아니라면, 현재 행렬의 is 2D 값을 false로 설정합니다.

  3. 현재 행렬을 반환합니다.

scaleSelf(scaleX, scaleY, scaleZ, originX, originY, originZ)
  1. 현재 행렬에 translateSelf() 변환을 originX, originY, originZ 인자로 수행합니다.

  2. scaleY가 없으면 scaleYscaleX 값으로 설정합니다.

  3. 현재 행렬에 비일률적 스케일(non-uniform scale) 변환을 후행 곱(post-multiply)합니다. 3D 스케일 행렬은 CSS Transforms에서 정의되며 sx = scaleX, sy = scaleY, sz = scaleZ입니다. [CSS3-TRANSFORMS]

  4. originX, originY, originZ의 부호를 반전합니다.

  5. 현재 행렬에 translateSelf() 변환을 originX, originY, originZ 인자로 수행합니다.

  6. scaleZ1이 아니면, 현재 행렬의 is 2D 값을 false로 설정합니다.

  7. 현재 행렬을 반환합니다.

scale3dSelf(scale, originX, originY, originZ)
  1. 현재 행렬에 translateSelf() 변환을 originX, originY, originZ 인자로 수행합니다.

  2. 현재 행렬에 일률적(균일) 3D 스케일 변환을 후행 곱(post-multiply)합니다 (m11 = m22 = m33 = scale). 3D 스케일 행렬은 CSS Transforms에서 정의되며 sx = sy = sz = scale입니다. [CSS3-TRANSFORMS]

  3. 현재 행렬에 translateSelf() 변환을 -originX, -originY, -originZ 인자로 수행합니다.

  4. scale1이 아니면, 현재 행렬의 is 2D 값을 false로 설정합니다.

  5. 현재 행렬을 반환합니다.

rotateSelf(rotX, rotY, rotZ)
  1. rotYrotZ가 모두 없으면 rotZrotX 값으로 설정하고 rotX, rotY0으로 설정합니다.

  2. rotY가 계속 없으면 0으로 설정합니다.

  3. rotZ가 계속 없으면 0으로 설정합니다.

  4. rotX 또는 rotY0 또는 -0이 아니라면, 현재 행렬의 is 2Dfalse로 설정합니다.

  5. 현재 행렬에 0, 0, 1 벡터를 기준으로 rotZ만큼 회전 변환을 후행 곱(post-multiply)합니다 (단위: degree). 3D 회전 행렬은 CSS Transforms에서 정의되며 alpha = rotZ degree입니다. [CSS3-TRANSFORMS]

  6. 현재 행렬에 0, 1, 0 벡터를 기준으로 rotY(degree)만큼 회전 변환을 후행 곱합니다. 3D 회전 행렬은 CSS Transforms에서 정의되며 alpha = rotY degree입니다. [CSS3-TRANSFORMS]

  7. 현재 행렬에 1, 0, 0 벡터를 기준으로 rotX(degree)만큼 회전 변환을 후행 곱합니다. 3D 회전 행렬은 CSS Transforms에서 정의되며 alpha = rotX degree입니다. [CSS3-TRANSFORMS]

  8. 현재 행렬을 반환합니다.

rotateFromVectorSelf(x, y)
  1. 현재 행렬에 벡터 (1,0)T와 (x,y)T 사이의 시계방향 각도로 회전 변환을 후행 곱(post-multiply)합니다. xy가 모두 0 또는 -0이면, 각도는 0으로 지정합니다. 2D 회전 행렬은 CSS Transforms에서 정의되며, alpha는 벡터 (1,0)T와 (x,y)T 사이의 각도(degree)입니다. [CSS3-TRANSFORMS]

  2. 현재 행렬을 반환합니다.

rotateAxisAngleSelf(x, y, z, angle)
  1. 현재 행렬에 지정한 벡터 x, y, z와 각도 angle(degree)로 회전 변환을 후행 곱(post-multiply)합니다. 3D 회전 행렬은 CSS Transforms에서 정의되며 alpha = angle degree입니다. [CSS3-TRANSFORMS]

  2. x 또는 y0 또는 -0이 아니라면, 현재 행렬의 is 2D 값을 false로 설정합니다.

  3. 현재 행렬을 반환합니다.

skewXSelf(sx)
  1. 현재 행렬에 지정 각도 sx(degree)로 skewX 변환을 후행 곱(post-multiply)합니다. 2D skewX 행렬은 CSS Transforms에서 정의되며 alpha = sx degree입니다. [CSS3-TRANSFORMS]

  2. 현재 행렬을 반환합니다.

skewYSelf(sy)
  1. 현재 행렬에 지정 각도 sy(degree)로 skewY 변환을 후행 곱(post-multiply)합니다. 2D skewY 행렬은 CSS Transforms에서 정의되며 beta = sy degree입니다. [CSS3-TRANSFORMS]

  2. 현재 행렬을 반환합니다.

invertSelf()
  1. 현재 행렬을 반전시킵니다.

  2. 현재 행렬이 반전 불가능하면, 모든 속성을 NaN으로 설정하고 is 2Dfalse로 설정합니다.

  3. 현재 행렬을 반환합니다.

테스트
setMatrixValue(transformList)
  1. transformList를 추상 행렬로 파싱하여 matrix, 2dTransform을 얻습니다. 결과가 실패면 "SyntaxError" DOMException을 던집니다.

  2. is 2D 값을 2dTransform으로 설정합니다.

  3. m11 요소부터 m44 요소까지 각 요소를 column-major 순서로 matrix의 값으로 설정합니다.

  4. 현재 행렬을 반환합니다.

테스트

7. 구조화 직렬화

DOMPointReadOnly, DOMPoint, DOMRectReadOnly, DOMRect, DOMQuad, DOMMatrixReadOnly, 그리고 DOMMatrix 객체는 직렬화 가능한 객체입니다. [HTML]

DOMPointReadOnlyDOMPoint에 대한 직렬화 단계valueserialized가 주어졌을 때 다음과 같습니다:

  1. serialized.[[X]]를 valuex 좌표로 설정합니다.

  2. serialized.[[Y]]를 valuey 좌표로 설정합니다.

  3. serialized.[[Z]]를 valuez 좌표로 설정합니다.

  4. serialized.[[W]]를 valuew 원근으로 설정합니다.

이들의 역직렬화 단계serializedvalue가 주어졌을 때 다음과 같습니다:

  1. valuex 좌표serialized.[[X]]로 설정합니다.

  2. valuey 좌표serialized.[[Y]]로 설정합니다.

  3. valuez 좌표serialized.[[Z]]로 설정합니다.

  4. valuew 원근serialized.[[W]]로 설정합니다.

DOMRectReadOnlyDOMRect에 대한 직렬화 단계valueserialized가 주어졌을 때 다음과 같습니다:

  1. serialized.[[X]]를 valuex 좌표로 설정합니다.

  2. serialized.[[Y]]를 valuey 좌표로 설정합니다.

  3. serialized.[[Width]]를 value너비 값으로 설정합니다.

  4. serialized.[[Height]]를 value높이 값으로 설정합니다.

이들의 역직렬화 단계serializedvalue가 주어졌을 때 다음과 같습니다:

  1. valuex 좌표serialized.[[X]]로 설정합니다.

  2. valuey 좌표serialized.[[Y]]로 설정합니다.

  3. value너비 값serialized.[[Width]]로 설정합니다.

  4. value높이 값serialized.[[Height]]로 설정합니다.

DOMQuad에 대한 직렬화 단계valueserialized가 주어졌을 때 다음과 같습니다:

  1. serialized.[[P1]]를 value하위 직렬화 결과인 point 1으로 설정합니다.

  2. serialized.[[P2]]를 하위 직렬화 결과인 valuepoint 2로 설정합니다.

  3. serialized.[[P3]]를 하위 직렬화 결과인 valuepoint 3로 설정합니다.

  4. serialized.[[P4]]를 하위 직렬화 결과인 valuepoint 4로 설정합니다.

이들의 역직렬화 단계serializedvalue가 주어졌을 때 다음과 같습니다:

  1. valuepoint 1하위 역직렬화serialized.[[P1]]로 설정합니다.

  2. valuepoint 2하위 역직렬화serialized.[[P2]]로 설정합니다.

  3. valuepoint 3하위 역직렬화serialized.[[P3]]로 설정합니다.

  4. valuepoint 4하위 역직렬화serialized.[[P4]]로 설정합니다.

DOMMatrixReadOnlyDOMMatrix에 대한 직렬화 단계valueserialized가 주어졌을 때 다음과 같습니다:

  1. valueis 2Dtrue인 경우:

    1. serialized.[[M11]]을 valuem11 요소로 설정합니다.

    2. serialized.[[M12]]를 valuem12 요소로 설정합니다.

    3. serialized.[[M21]]을 valuem21 요소로 설정합니다.

    4. serialized.[[M22]]를 valuem22 요소로 설정합니다.

    5. serialized.[[M41]]을 valuem41 요소로 설정합니다.

    6. serialized.[[M42]]를 valuem42 요소로 설정합니다.

    7. serialized.[[Is2D]]를 true로 설정합니다.

    참고: 2D DOMMatrix 또는 DOMMatrixReadOnly는 일부 다른 요소(예: m13 요소)에 대해 -0 값을 가질 수 있으며, 이 알고리즘으로는 왕복 변환이 보장되지 않습니다.

  2. 그 외의 경우:

    1. serialized.[[M11]]을 valuem11 요소로 설정합니다.

    2. serialized.[[M12]]를 valuem12 요소로 설정합니다.

    3. serialized.[[M13]]을 valuem13 요소로 설정합니다.

    4. serialized.[[M14]]를 valuem14 요소로 설정합니다.

    5. serialized.[[M21]]을 valuem21 요소로 설정합니다.

    6. serialized.[[M22]]를 valuem22 요소로 설정합니다.

    7. serialized.[[M23]]을 valuem23 요소로 설정합니다.

    8. serialized.[[M24]]를 valuem24 요소로 설정합니다.

    9. serialized.[[M31]]을 valuem31 요소로 설정합니다.

    10. serialized.[[M32]]를 valuem32 요소로 설정합니다.

    11. serialized.[[M33]]을 valuem33 요소로 설정합니다.

    12. serialized.[[M34]]를 valuem34 요소로 설정합니다.

    13. serialized.[[M41]]을 valuem41 요소로 설정합니다.

    14. serialized.[[M42]]를 valuem42 요소로 설정합니다.

    15. serialized.[[M43]]을 valuem43 요소로 설정합니다.

    16. serialized.[[M44]]를 valuem44 요소로 설정합니다.

    17. serialized.[[Is2D]]를 false로 설정합니다.

    이들의 역직렬화 단계serializedvalue가 주어졌을 때 다음과 같습니다:

    1. serialized.[[Is2D]]가 true인 경우:

      1. valuem11 요소serialized.[[M11]]로 설정합니다.

      2. valuem12 요소serialized.[[M12]]로 설정합니다.

      3. valuem13 요소0으로 설정합니다.

      4. valuem14 요소0으로 설정합니다.

      5. valuem21 요소serialized.[[M21]]로 설정합니다.

      6. valuem22 요소serialized.[[M22]]로 설정합니다.

      7. valuem23 요소0으로 설정합니다.

      8. valuem24 요소0으로 설정합니다.

      9. valuem31 요소0으로 설정합니다.

      10. valuem32 요소0으로 설정합니다.

      11. valuem33 요소1로 설정합니다.

      12. valuem34 요소0으로 설정합니다.

      13. valuem41 요소serialized.[[M41]]로 설정합니다.

      14. valuem42 요소serialized.[[M42]]로 설정합니다.

      15. valuem43 요소0으로 설정합니다.

      16. valuem44 요소1로 설정합니다.

      17. valueis 2Dtrue로 설정합니다.

    2. 그 외의 경우:

      1. valuem11 요소serialized.[[M11]]로 설정합니다.

      2. valuem12 요소serialized.[[M12]]로 설정합니다.

      3. valuem13 요소serialized.[[M13]]로 설정합니다.

      4. valuem14 요소serialized.[[M14]]로 설정합니다.

      5. valuem21 요소serialized.[[M21]]로 설정합니다.

      6. valuem22 요소serialized.[[M22]]로 설정합니다.

      7. valuem23 요소serialized.[[M23]]로 설정합니다.

      8. valuem24 요소serialized.[[M24]]로 설정합니다.

      9. valuem31 요소serialized.[[M31]]로 설정합니다.

      10. valuem32 요소serialized.[[M32]]로 설정합니다.

      11. valuem33 요소serialized.[[M33]]로 설정합니다.

      12. valuem34 요소serialized.[[M34]]로 설정합니다.

      13. valuem41 요소serialized.[[M41]]로 설정합니다.

      14. valuem42 요소serialized.[[M42]]로 설정합니다.

      15. valuem43 요소serialized.[[M43]]로 설정합니다.

      16. valuem44 요소serialized.[[M44]]로 설정합니다.

      17. valueis 2Dfalse로 설정합니다.

Tests

8. 보안 고려사항

DOMMatrixDOMMatrixReadOnly 인터페이스는 CSS 구문으로 문자열을 파싱하는 진입점(entry-point)을 제공합니다. 따라서 CSS Syntax 명세의 보안 고려사항이 적용됩니다. [CSS3-SYNTAX]

이는 사용자 에이전트의 CSS 파서 버그를 악용할 가능성이 있습니다.

이 명세에서 정의한 인터페이스는 다른 보안 또는 개인정보 영향이 알려진 바 없습니다. 그러나 이 명세의 인터페이스를 사용하는 API를 가진 다른 명세에서는 보안 또는 개인정보 문제를 초래할 수도 있습니다.

9. 개인정보 보호 고려사항

예를 들어, CSSOM View에서 정의된 getBoundingClientRect() API는 DOMRect를 반환하며, 이는 텍스트가 포함된 인라인 요소의 크기를 특정 폰트로 측정하는 데 사용될 수 있고, 이를 통해 사용자가 해당 폰트를 설치했는지 정보가 노출될 수 있습니다. 이 정보는 여러 일반적인 폰트로 테스트될 경우 개인 식별 정보가 될 수 있습니다. [CSSOM-VIEW]

10. 역사적 고찰

이 절은 규범적이지 않습니다.

이 명세에서 정의한 인터페이스는 이전 명세에 있던 유사 인터페이스와 일부 사용자 에이전트의 독자적 인터페이스를 대체하기 위해 만들어졌습니다. 이 절에서는 이러한 인터페이스를 열거합니다.

10.1. CSSOM View

이전 CSSOM View 명세는 ClientRect 인터페이스를 정의했으며, 이는 DOMRect로 대체되었습니다. 이 명세를 준수하는 구현체는 ClientRect를 지원하지 않습니다. [CSSOM-VIEW]

10.2. SVG

이전 SVG 명세는 SVGPoint, SVGRect, SVGMatrix를 정의했습니다. 이 명세에서는 각각 DOMPoint, DOMRect, DOMMatrix의 별칭(alias)으로 정의합니다. [SVG11]

10.3. 비표준

일부 사용자 에이전트는 WebKitPoint 인터페이스를 지원했습니다. 이 명세를 준수하는 구현체는 WebKitPoint를 지원하지 않습니다.

여러 사용자 에이전트는 WebKitCSSMatrix 인터페이스도 지원했으며, 이는 웹에서 널리 사용됩니다. 이 명세에서는 DOMMatrix의 별칭(alias)으로 정의합니다.

일부 사용자 에이전트는 MSCSSMatrix 인터페이스도 지원했습니다. 이 명세를 준수하는 구현체는 MSCSSMatrix를 지원하지 않습니다.

테스트

문서 규칙

비어 있지 않은 unrestricted double 값의 리스트에 대해 NaN 안전 최소값(NaN-safe minimum) 은 리스트 내에 NaN이 포함되어 있으면 NaN이 되고, 그렇지 않으면 리스트의 최소값이 됩니다.

동일하게, 비어 있지 않은 unrestricted double 값의 리스트에 대해 NaN 안전 최대값(NaN-safe maximum)은 리스트 내에 NaN이 있으면 NaN이 되고, 그렇지 않으면 리스트의 최대값이 됩니다.

최신 버전 이후 변경 사항

이 절은 규범적이지 않습니다.

다음 변경 사항은 2018년 12월 4일 후보 권고안(CR) 이후로 적용되었습니다.

다음 변경 사항은 2014년 11월 25일 후보 권고안(CR) 이후로 적용되었습니다.

다음 변경 사항은 2014년 9월 18일 Working Draft 이후로 적용되었습니다.

다음 변경 사항은 2014년 6월 26일 Last Call Public Working Draft 이후로 적용되었습니다.

다음 변경 사항은 2014년 5월 22일 첫 공개 Working Draft 이후로 적용되었습니다.

감사의 말

편집자들은 본 명세에 기여한 Robert O’Callahan께 감사드립니다. DOMMatrix 초안 제안을 해주신 Dean Jackson께도 감사드립니다. Adenilson Cavalcanti, Benoit Jacob, Boris Zbarsky, Brian Birtles, Cameron McCormack, Domenic Denicola, Kari Pihkala, Max Vujovic, Mike Taylor, Peter Hall, Philip Jägenstedt, Simon Fraser, 그리고 Timothy Loh 등 세심한 리뷰와 의견, 수정에 감사드립니다.

적합성

문서 규칙

적합성 요구사항은 설명적 주장과 RFC 2119 용어의 조합으로 표현됩니다. 규범 부분의 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL”이라는 핵심 단어는 RFC 2119에서 설명된 대로 해석되어야 합니다. 독자들의 가독성을 위해 이 명세서에서는 이러한 단어들을 모두 대문자로 표기하지는 않습니다.

이 명세서의 모든 텍스트는 명시적으로 비규범(Normative 아님)임을 표시한 부분, 예시, 참고(note)를 제외하면 모두 규범적입니다. [RFC2119]

이 명세서의 예시들은 “예를 들어(for example)”라는 문구로 소개되거나 class="example"처럼 규범 텍스트와 구분됩니다. 아래 예시처럼 표시됩니다:

이것은 참고용 예제(example)의 예시입니다.

정보성 참고 내용은 “참고(Note)”라는 단어로 시작하며 class="note"로 구분됩니다. 아래는 예입니다:

참고: 이것은 정보성 note입니다.

주의 사항(advisement)은 규범 부분 중 특별 주의가 필요한 내용을 <strong class="advisement">으로 강조합니다. 예시는 다음과 같습니다: UA는 접근 가능한 대안을 반드시 제공해야 합니다.

테스트

이 명세와 관련된 테스트는 이러한 “Tests” 블록에서 문서화될 수 있습니다. 이러한 블록은 모두 비규범적입니다.


적합성 클래스

이 명세서에 대한 적합성은 세 가지 적합성 클래스에 대해 정의됩니다:

스타일 시트
CSS 스타일 시트.
렌더러
스타일 시트의 의미를 해석하고 그에 따라 문서를 렌더링하는 UA.
저작 도구
스타일 시트를 작성하는 UA.

스타일 시트가 이 명세서에 적합한지는, 해당 모듈에서 정의된 문법을 사용하는 모든 선언문이 CSS의 일반 문법 및 본 모듈의 각 기능의 개별 문법에 따라 유효한 경우입니다.

렌더러가 이 명세서에 적합한지는, 스타일 시트를 적절한 명세서에서 정의된 대로 해석하는 것과 더불어, 본 명세서의 모든 기능을 올바르게 파싱해서 적절히 문서를 렌더링하는 경우입니다. 단, 디바이스의 한계 등으로 UA가 문서를 제대로 렌더하지 못할 때에는 비적합성으로 간주하지 않습니다. (예: UA가 단색 모니터에서 색상을 렌더하지 않아도 됨)

저작 도구가 이 명세서에 적합한지는, 일반 CSS 문법과 본 모듈의 각 기능별 개별 문법에 맞는 구문상 올바른 스타일 시트를 작성하며, 본 모듈에서 기술된 스타일 시트 적합성 요구사항을 모두 충족하는 경우입니다.

부분 구현(Partial implementations)

작성자가 호환성 있는 파싱 규칙을 활용해 폴백(fallback) 값을 지정할 수 있도록, CSS 렌더러는 지원 가능한 수준이 없는 at-rule, 속성(property), 속성 값, 키워드, 기타 문법 구조를 반드시 무효로 취급(및 적절히 무시)해야 합니다. 특히 사용자 에이전트는 하나의 multi-value 속성 선언에서 지원하지 않는 일부 값을 무시하고 지원하는 값만 적용해서는 안 됩니다: 한 값이 무효(지원하지 않는 값인 경우)로 간주되면 CSS에서는 그 선언 전체를 무시해야 합니다.

불안정·독자적 기능 구현

향후 안정화될 CSS 기능과의 충돌을 피하기 위해 CSSWG에서는 미래 안정화를 위한 모범 사례에 따라 불안정 기능독자적 확장을 구현할 것을 권장합니다.

비실험적 구현(Non-experimental implementations)

명세가 후보 권고 단계(CR)에 도달하면 비실험적(non-experimental) 구현이 가능하며, 구현자는 본 명세서대로 올바르게 동작함을 입증할 수 있는 CR 수준의 기능에 대해 접두사가 없는 구현(unprefixed implementation)을 출시해야 합니다.

CSS의 상호 운용성(interoperability)을 보장하기 위해 CSS Working Group은 비실험적 CSS 렌더러에게, 접두사 없는 구현을 출시하기 전에 W3C에 구현 보고서(및 필요할 경우 그 구현 보고서의 테스트케이스)를 제출할 것을 요청합니다. W3C에 제출된 테스트 케이스들은 CSS WG에 의해 검토되고 수정될 수 있습니다.

테스트케이스 및 구현 보고서 제출과 관련된 추가 정보는 CSS WG 홈페이지 https://www.w3.org/Style/CSS/Test/에서 확인할 수 있습니다. 문의는 public-css-testsuite@w3.org 메일링 리스트로 보내야 합니다.

CR 종료 기준

이 명세를 제안 권고(Proposed Recommendation)로 진전시키려면, 각 기능(feature)에 대해 최소 두 개 이상 독립적이고 상호 운용이 가능한 구현이 있어야 합니다. 각 기능은 서로 다른 제품 집합에서 구현될 수 있고, 모든 기능이 하나의 제품에서 구현될 필요는 없습니다. 이 기준에서는 다음과 같이 용어를 정의합니다:

독립(Independent)
각 구현은 서로 다른 당사자가 개발해야 하며, 다른 자격을 갖춘 구현에 사용된 코드를 공유, 재사용, 파생해선 안 됩니다. 본 명세서 구현에 영향이 없는 코드 부분은 예외입니다.
상호 운용(Interoperable)
공식 CSS 테스트 스위트의 해당 테스트케이스를 통과하거나, 웹 브라우저가 아닌 경우 동등한 테스트를 통과해야 합니다. 모든 관련 테스트케이스는 동등한 테스트가 있어야 하며 해당 UA가 상호 운용성을 주장하려면 같은 방식으로 해당 테스트를 통과하는 다른 UA도 있어야 합니다. 동등한 테스트는 동료 검토(peer review)를 위해 공개되어야 합니다.
구현(Implementation)
사용자 에이전트(UA)로서:
  1. 명세를 구현함.
  2. 일반 대중이 이용 가능함. 구현은 출시 제품이거나 공개된 버전(베타, 프리뷰, "nightly build" 등)이어야 합니다. 비출시 제품의 경우 해당 기능을 최소 1개월 이상 구현하여 안정성을 보여야 합니다.
  3. 실험적(experimental)이 아님(즉, 테스트 스위트 통과를 목적으로만 제작되고 향후 정상 사용을 의도하지 않은 버전이 아님).

본 명세는 최소 6개월 동안 후보 권고(Candidate Recommendation)로 유지됩니다.

색인

이 명세서에서 정의된 용어

참조에 의해 정의된 용어

참조문헌

규범 참고문헌

[CSS-TRANSFORMS-2]
Tab Atkins Jr.; 외. CSS Transforms Module Level 2. 2021년 11월 9일. WD. URL: https://www.w3.org/TR/css-transforms-2/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2024년 3월 12일. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS3-SYNTAX]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 2021년 12월 24일. CRD. URL: https://www.w3.org/TR/css-syntax-3/
[CSS3-TRANSFORMS]
Simon Fraser; 외. CSS Transforms Module Level 1. 2019년 2월 14일. CR. URL: https://www.w3.org/TR/css-transforms-1/
[ECMA-262]
ECMAScript 언어 명세(ECMAScript Language Specification). URL: https://tc39.es/ecma262/multipage/
[HTML]
Anne van Kesteren; 외. HTML 표준(HTML Standard). Living Standard. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. RFC에서 요구 수준을 표시하는 데 사용하는 핵심 단어(Key words for use in RFCs to Indicate Requirement Levels). 1997년 3월. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 표준(Web IDL Standard). Living Standard. URL: https://webidl.spec.whatwg.org/

비규범 참고문헌

[CSSOM-VIEW]
Simon Fraser; Emilio Cobos Álvarez. CSSOM View Module. 2025년 9월 16일. WD. URL: https://www.w3.org/TR/cssom-view-1/
[SVG11]
Erik Dahlström; 외. 확장 벡터 그래픽스(SVG) 1.1 (Scalable Vector Graphics (SVG) 1.1 (Second Edition)). 2011년 8월 16일. REC. URL: https://www.w3.org/TR/SVG11/

IDL 색인

[Exposed=(Window,Worker),
 Serializable]
interface DOMPointReadOnly {
    constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
            optional unrestricted double z = 0, optional unrestricted double w = 1);

    [NewObject] static DOMPointReadOnly fromPoint(optional DOMPointInit other = {});

    readonly attribute unrestricted double x;
    readonly attribute unrestricted double y;
    readonly attribute unrestricted double z;
    readonly attribute unrestricted double w;

    [NewObject] DOMPoint matrixTransform(optional DOMMatrixInit matrix = {});

    [Default] object toJSON();
};

[Exposed=(Window,Worker),
 Serializable,
 LegacyWindowAlias=SVGPoint]
interface DOMPoint : DOMPointReadOnly {
    constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
            optional unrestricted double z = 0, optional unrestricted double w = 1);

    [NewObject] static DOMPoint fromPoint(optional DOMPointInit other = {});

    inherit attribute unrestricted double x;
    inherit attribute unrestricted double y;
    inherit attribute unrestricted double z;
    inherit attribute unrestricted double w;
};

dictionary DOMPointInit {
    unrestricted double x = 0;
    unrestricted double y = 0;
    unrestricted double z = 0;
    unrestricted double w = 1;
};

[Exposed=(Window,Worker),
 Serializable]
interface DOMRectReadOnly {
    constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
            optional unrestricted double width = 0, optional unrestricted double height = 0);

    [NewObject] static DOMRectReadOnly fromRect(optional DOMRectInit other = {});

    readonly attribute unrestricted double x;
    readonly attribute unrestricted double y;
    readonly attribute unrestricted double width;
    readonly attribute unrestricted double height;
    readonly attribute unrestricted double top;
    readonly attribute unrestricted double right;
    readonly attribute unrestricted double bottom;
    readonly attribute unrestricted double left;

    [Default] object toJSON();
};

[Exposed=(Window,Worker),
 Serializable,
 LegacyWindowAlias=SVGRect]
interface DOMRect : DOMRectReadOnly {
    constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
            optional unrestricted double width = 0, optional unrestricted double height = 0);

    [NewObject] static DOMRect fromRect(optional DOMRectInit other = {});

    inherit attribute unrestricted double x;
    inherit attribute unrestricted double y;
    inherit attribute unrestricted double width;
    inherit attribute unrestricted double height;
};

dictionary DOMRectInit {
    unrestricted double x = 0;
    unrestricted double y = 0;
    unrestricted double width = 0;
    unrestricted double height = 0;
};

[Exposed=Window]
interface DOMRectList {
    readonly attribute unsigned long length;
    getter DOMRect? item(unsigned long index);
};

[Exposed=(Window,Worker),
 Serializable]
interface DOMQuad {
    constructor(optional DOMPointInit p1 = {}, optional DOMPointInit p2 = {},
            optional DOMPointInit p3 = {}, optional DOMPointInit p4 = {});

    [NewObject] static DOMQuad fromRect(optional DOMRectInit other = {});
    [NewObject] static DOMQuad fromQuad(optional DOMQuadInit other = {});

    [SameObject] readonly attribute DOMPoint p1;
    [SameObject] readonly attribute DOMPoint p2;
    [SameObject] readonly attribute DOMPoint p3;
    [SameObject] readonly attribute DOMPoint p4;
    [NewObject] DOMRect getBounds();

    [Default] object toJSON();
};

dictionary DOMQuadInit {
  DOMPointInit p1;
  DOMPointInit p2;
  DOMPointInit p3;
  DOMPointInit p4;
};

[Exposed=(Window,Worker),
 Serializable]
interface DOMMatrixReadOnly {
    constructor(optional (DOMString or sequence<unrestricted double>) init);

    [NewObject] static DOMMatrixReadOnly fromMatrix(optional DOMMatrixInit other = {});
    [NewObject] static DOMMatrixReadOnly fromFloat32Array(Float32Array array32);
    [NewObject] static DOMMatrixReadOnly fromFloat64Array(Float64Array array64);

    // These attributes are simple aliases for certain elements of the 4x4 matrix
    readonly attribute unrestricted double a;
    readonly attribute unrestricted double b;
    readonly attribute unrestricted double c;
    readonly attribute unrestricted double d;
    readonly attribute unrestricted double e;
    readonly attribute unrestricted double f;

    readonly attribute unrestricted double m11;
    readonly attribute unrestricted double m12;
    readonly attribute unrestricted double m13;
    readonly attribute unrestricted double m14;
    readonly attribute unrestricted double m21;
    readonly attribute unrestricted double m22;
    readonly attribute unrestricted double m23;
    readonly attribute unrestricted double m24;
    readonly attribute unrestricted double m31;
    readonly attribute unrestricted double m32;
    readonly attribute unrestricted double m33;
    readonly attribute unrestricted double m34;
    readonly attribute unrestricted double m41;
    readonly attribute unrestricted double m42;
    readonly attribute unrestricted double m43;
    readonly attribute unrestricted double m44;

    readonly attribute boolean is2D;
    readonly attribute boolean isIdentity;

    // Immutable transform methods
    [NewObject] DOMMatrix translate(optional unrestricted double tx = 0,
                                    optional unrestricted double ty = 0,
                                    optional unrestricted double tz = 0);
    [NewObject] DOMMatrix scale(optional unrestricted double scaleX = 1,
                                optional unrestricted double scaleY,
                                optional unrestricted double scaleZ = 1,
                                optional unrestricted double originX = 0,
                                optional unrestricted double originY = 0,
                                optional unrestricted double originZ = 0);
    [NewObject] DOMMatrix scaleNonUniform(optional unrestricted double scaleX = 1,
                                          optional unrestricted double scaleY = 1);
    [NewObject] DOMMatrix scale3d(optional unrestricted double scale = 1,
                                  optional unrestricted double originX = 0,
                                  optional unrestricted double originY = 0,
                                  optional unrestricted double originZ = 0);
    [NewObject] DOMMatrix rotate(optional unrestricted double rotX = 0,
                                 optional unrestricted double rotY,
                                 optional unrestricted double rotZ);
    [NewObject] DOMMatrix rotateFromVector(optional unrestricted double x = 0,
                                           optional unrestricted double y = 0);
    [NewObject] DOMMatrix rotateAxisAngle(optional unrestricted double x = 0,
                                          optional unrestricted double y = 0,
                                          optional unrestricted double z = 0,
                                          optional unrestricted double angle = 0);
    [NewObject] DOMMatrix skewX(optional unrestricted double sx = 0);
    [NewObject] DOMMatrix skewY(optional unrestricted double sy = 0);
    [NewObject] DOMMatrix multiply(optional DOMMatrixInit other = {});
    [NewObject] DOMMatrix flipX();
    [NewObject] DOMMatrix flipY();
    [NewObject] DOMMatrix inverse();

    [NewObject] DOMPoint transformPoint(optional DOMPointInit point = {});
    [NewObject] Float32Array toFloat32Array();
    [NewObject] Float64Array toFloat64Array();

    [Exposed=Window] stringifier;
    [Default] object toJSON();
};

[Exposed=(Window,Worker),
 Serializable,
 LegacyWindowAlias=(SVGMatrix,WebKitCSSMatrix)]
interface DOMMatrix : DOMMatrixReadOnly {
    constructor(optional (DOMString or sequence<unrestricted double>) init);

    [NewObject] static DOMMatrix fromMatrix(optional DOMMatrixInit other = {});
    [NewObject] static DOMMatrix fromFloat32Array(Float32Array array32);
    [NewObject] static DOMMatrix fromFloat64Array(Float64Array array64);

    // These attributes are simple aliases for certain elements of the 4x4 matrix
    inherit attribute unrestricted double a;
    inherit attribute unrestricted double b;
    inherit attribute unrestricted double c;
    inherit attribute unrestricted double d;
    inherit attribute unrestricted double e;
    inherit attribute unrestricted double f;

    inherit attribute unrestricted double m11;
    inherit attribute unrestricted double m12;
    inherit attribute unrestricted double m13;
    inherit attribute unrestricted double m14;
    inherit attribute unrestricted double m21;
    inherit attribute unrestricted double m22;
    inherit attribute unrestricted double m23;
    inherit attribute unrestricted double m24;
    inherit attribute unrestricted double m31;
    inherit attribute unrestricted double m32;
    inherit attribute unrestricted double m33;
    inherit attribute unrestricted double m34;
    inherit attribute unrestricted double m41;
    inherit attribute unrestricted double m42;
    inherit attribute unrestricted double m43;
    inherit attribute unrestricted double m44;

    // Mutable transform methods
    DOMMatrix multiplySelf(optional DOMMatrixInit other = {});
    DOMMatrix preMultiplySelf(optional DOMMatrixInit other = {});
    DOMMatrix translateSelf(optional unrestricted double tx = 0,
                            optional unrestricted double ty = 0,
                            optional unrestricted double tz = 0);
    DOMMatrix scaleSelf(optional unrestricted double scaleX = 1,
                        optional unrestricted double scaleY,
                        optional unrestricted double scaleZ = 1,
                        optional unrestricted double originX = 0,
                        optional unrestricted double originY = 0,
                        optional unrestricted double originZ = 0);
    DOMMatrix scale3dSelf(optional unrestricted double scale = 1,
                          optional unrestricted double originX = 0,
                          optional unrestricted double originY = 0,
                          optional unrestricted double originZ = 0);
    DOMMatrix rotateSelf(optional unrestricted double rotX = 0,
                         optional unrestricted double rotY,
                         optional unrestricted double rotZ);
    DOMMatrix rotateFromVectorSelf(optional unrestricted double x = 0,
                                   optional unrestricted double y = 0);
    DOMMatrix rotateAxisAngleSelf(optional unrestricted double x = 0,
                                  optional unrestricted double y = 0,
                                  optional unrestricted double z = 0,
                                  optional unrestricted double angle = 0);
    DOMMatrix skewXSelf(optional unrestricted double sx = 0);
    DOMMatrix skewYSelf(optional unrestricted double sy = 0);
    DOMMatrix invertSelf();

    [Exposed=Window] DOMMatrix setMatrixValue(DOMString transformList);
};

dictionary DOMMatrix2DInit {
    unrestricted double a;
    unrestricted double b;
    unrestricted double c;
    unrestricted double d;
    unrestricted double e;
    unrestricted double f;
    unrestricted double m11;
    unrestricted double m12;
    unrestricted double m21;
    unrestricted double m22;
    unrestricted double m41;
    unrestricted double m42;
};

dictionary DOMMatrixInit : DOMMatrix2DInit {
    unrestricted double m13 = 0;
    unrestricted double m14 = 0;
    unrestricted double m23 = 0;
    unrestricted double m24 = 0;
    unrestricted double m31 = 0;
    unrestricted double m32 = 0;
    unrestricted double m33 = 1;
    unrestricted double m34 = 0;
    unrestricted double m43 = 0;
    unrestricted double m44 = 1;
    boolean is2D;
};

CanIUse

Support:Android Browser (limited)4+Baidu Browser (limited)13.52+Blackberry Browser (limited)10+Chrome (limited)8+Chrome for Android (limited)142+Edge (limited)12+Firefox (limited)33+Firefox for Android (limited)144+IE (limited)10+IE Mobile (limited)10+KaiOS Browser (limited)2.5+Opera (limited)15+Opera MiniNoneOpera Mobile (limited)80+QQ Browser (limited)14.9+Safari (limited)5+Safari on iOS (limited)5.0+Samsung Internet (limited)4+UC Browser for Android (limited)15.5+

Source: caniuse.com as of 2025-11-24