ジオメトリインターフェイスモジュール レベル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 Issue リポジトリ
編集者:
(Wix.com)
(招待専門家)
以前の編集者:
(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インターフェイス SVGPointSVGRect、およびSVGMatrixは、 ここで定義されたインターフェイスをSVG、Canvas 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を作成 (other)を実行しなければなりません。

fromPoint(other) 静的メソッドは DOMPoint 上で、辞書からDOMPointを作成 (other)を実行しなければなりません。

辞書からDOMPointReadOnlyを作成 (other) または 辞書からDOMPointを作成 (other)の手順は以下の通りです:

  1. pointを新しいDOMPointReadOnly または DOMPoint として初期化します。

  2. pointの変数 x座標otherx 辞書メンバーに、y座標othery 辞書メンバーに、z座標otherz 辞書メンバーに、w遠近otherw 辞書メンバーに設定します。

  3. pointを返します。

x 属性は取得時、x座標 の値を返さなければなりません。 DOMPoint インターフェイスの場合、x 属性を設定すると、x座標へ新しい値が設定されなければなりません。

y 属性は取得時、y座標 の値を返さなければなりません。 DOMPoint インターフェイスの場合、y 属性を設定すると、y座標へ新しい値が設定されなければなりません。

z 属性は取得時、z座標 の値を返さなければなりません。 DOMPoint インターフェイスの場合、z 属性を設定すると、z座標へ新しい値が設定されなければなりません。

w 属性は取得時、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 変数は、新しい DOMPoint オブジェクトとして設定され、x座標に5、y座標に4が初期値として与えられます。この新しい DOMPoint は、matrix でスケールされ、平行移動されます。そうして得られた transformedPointx座標 は20、y座標 は18となります。

テスト

2.1. 点を行列で変換

行列で変換 するには、pointおよびmatrixに対して:

  1. xpointx座標 に設定します。

  2. ypointy座標 に設定します。

  3. zpointz座標 に設定します。

  4. wpointw遠近 に設定します。

  5. pointVector を新しい列ベクトルとし、要素はそれぞれ xyzwです。

    x y z w
  6. pointVectormatrix前乗します。

  7. transformedPoint を新しい DOMPoint オブジェクトとします。

  8. transformedPointx座標pointVectorの1番目の要素を設定します。

  9. transformedPointy座標pointVectorの2番目の要素を設定します。

  10. transformedPointz座標pointVectorの3番目の要素を設定します。

  11. transformedPointw遠近pointVectorの4番目の要素を設定します。

  12. transformedPointを返します。

matrixis 2D が trueであり、pointz座標0 あるいは -0であり、pointw遠近1 の場合は、2D変換です。それ以外の場合は3D変換です。

3. DOMRect インターフェイス

DOMRectReadOnly インターフェイスを実装するオブジェクトは、矩形を表します。

矩形 は次の属性を持ちます:

原点

矩形の 幅寸法 がゼロ以上の場合、矩形の水平方向の原点は左端であり、それ以外の場合は右端です。同様に 高さ寸法 がゼロ以上の場合、矩形の垂直方向の原点は上端であり、それ以外の場合は下端です。

x座標

矩形の 原点 までの、ビューポート左端からの水平方向の距離。

y座標

矩形の 原点 までの、ビューポート上端からの垂直方向の距離。

幅寸法

矩形の幅。負になり得ます。

高さ寸法

矩形の高さ。負になり得ます。

[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を返します。

DOMRectReadOnly 上の静的メソッド fromRect(other) は、辞書からDOMRectReadOnlyを作成 (other) を実行しなければなりません。

DOMRect 上の静的メソッド fromRect(other) は、辞書からDOMRectを作成 (other)を実行しなければなりません。

辞書からDOMRectReadOnlyを作成 (other) または 辞書からDOMRectを作成 (other) の手順は以下の通りです:

  1. rect を新しい DOMRectReadOnly または DOMRect として初期化します。

  2. rect の変数 x座標otherx 辞書メンバーに、y座標othery 辞書メンバーに、幅寸法otherwidth 辞書メンバーに、高さ寸法otherheight 辞書メンバーに設定します。

  3. rect を返します。

x 属性は取得時、x座標 の値を返さなければなりません。DOMRect インターフェイスの場合、x 属性を設定すると、x座標 に新しい値を設定しなければなりません。

y 属性は取得時、y座標 の値を返さなければなりません。DOMRect インターフェイスの場合、y 属性を設定すると、y座標 に新しい値を設定しなければなりません。

width 属性は取得時、幅寸法 の値を返さなければなりません。DOMRect インターフェイスの場合、width 属性を設定すると、幅寸法 に新しい値を設定しなければなりません。

height 属性は取得時、高さ寸法 の値を返さなければなりません。DOMRect インターフェイスの場合、height 属性を設定すると、高さ寸法 に新しい値を設定しなければなりません。

top 属性は取得時、NaN安全な最小値y座標 と、y座標高さ寸法を加えた値)のうち小さい方を返さなければなりません。

right 属性は取得時、NaN安全な最大値x座標 と、x座標幅寸法を加えた値)のうち大きい方を返さなければなりません。

bottom 属性は取得時、NaN安全な最大値y座標 と、y座標高さ寸法を加えた値)のうち大きい方を返さなければなりません。

left 属性は取得時、NaN安全な最小値x座標 と、x座標幅寸法を加えた値)のうち小さい方を返さなければなりません。

テスト

4. DOMRectList インターフェイス

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

length 属性は、オブジェクトに紐づくDOMRectオブジェクトの総数を返さなければなりません。

item(index) メソッドは呼び出されたとき、indexDOMRectオブジェクト総数以上の場合はnullを返さなければなりません。そうでない場合は、該当するDOMRectオブジェクトを返します。インデックスはゼロ始まりです。

DOMRectList はレガシーWebコンテンツとの互換性のためだけに存在します。新しい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 オブジェクトが内部メンバー変数 点1点2点3点4(いずれも DOMPoint オブジェクト)を持つことを前提とします。DOMQuad は、これら変数の値にアクセスし設定できなければなりません。 著者はこれらの DOMPoint オブジェクトを修正することができ、これは四辺形に直接影響します。

属性や関数で DOMQuad オブジェクトを返すインターフェイスは、内部メンバー変数の値を変更できる場合があります。そのようなインターフェイスはこの能力を本文で明示しなければなりません。

内部メンバー変数は、いかなる方法でも公開してはなりません。

DOMQuad(p1, p2, p3, p4) コンストラクターを呼び出した場合、以下の手順を実行しなければなりません:

  1. point1 を、新しい DOMPoint として、属性値を p1 の同名辞書メンバーの値に設定します。

  2. point2 を、新しい DOMPoint として、属性値を p2 の同名辞書メンバーの値に設定します。

  3. point3 を、新しい DOMPoint として、属性値を p3 の同名辞書メンバーの値に設定します。

  4. point4 を、新しい DOMPoint として、属性値を p4 の同名辞書メンバーの値に設定します。

  5. 新しい DOMQuad を返し、点1point1点2point2点3point3点4point4 を設定します。

DOMPointDOMPointReadOnly 型の引数も渡せます。渡された 引数は WebIDL の規則に従って内部的に適切なオブジェクト型へ変換されます。[WEBIDL]

DOMQuad 上の静的メソッド fromRect(other) は、DOMRectInit 辞書から DOMQuad を作成 (other) を実行しなければなりません。

DOMRectInit 辞書から DOMQuad を作成 (other) の手順:

  1. otherxywidthheight の値を x, y, width, height に設定します。

  2. point1 を新しい DOMPoint とし、 x座標xy座標yz座標0w遠近1 に設定します。

  3. point2 を新しい DOMPoint とし、 x座標x + widthy座標yz座標0w遠近1 に設定します。

  4. point3 を新しい DOMPoint とし、 x座標x + widthy座標y + heightz座標0w遠近1 に設定します。

  5. point4 を新しい DOMPoint とし、 x座標xy座標y + heightz座標0w遠近1 に設定します。

  6. 新しい DOMQuad を返し、点1point1点2point2点3point3点4point4 を設定します。

DOMQuad 上の静的メソッド fromQuad(other) は、DOMQuadInit 辞書から DOMQuad を作成 (other) を実行しなければなりません。

DOMQuadInit 辞書から DOMQuad を作成 (other) の手順:

  1. otherp1 辞書メンバーが存在すれば、辞書から DOMPoint を作成 を呼び出して point1 を得ます。

  2. otherp2 辞書メンバーが存在すれば、辞書から DOMPoint を作成 を呼び出して point2 を得ます。

  3. otherp3 辞書メンバーが存在すれば、辞書から DOMPoint を作成 を呼び出して point3 を得ます。

  4. otherp4 辞書メンバーが存在すれば、辞書から DOMPoint を作成 を呼び出して point4 を得ます。

  5. 新しい DOMQuad を返し、点1point1点2point2点3point3点4point4 を設定します。

p1 属性は 点1 を返さなければなりません。

p2 属性は 点2 を返さなければなりません。

p3 属性は 点3 を返さなければなりません。

p4 属性は 点4 を返さなければなりません。

getBounds() メソッドは呼び出された際、以下のアルゴリズムを実行します:

  1. boundsDOMRect オブジェクトに設定します。

  2. leftNaN安全な最小値点1x座標点2x座標点3x座標点4x座標)に設定します。

  3. topNaN安全な最小値点1y座標点2y座標点3y座標点4y座標)に設定します。

  4. rightNaN安全な最大値点1x座標点2x座標点3x座標点4x座標)に設定します。

  5. bottomNaN安全な最大値点1y座標点2y座標点3y座標点4y座標)に設定します。

  6. boundsx座標left に、y座標top に、幅寸法right - left に、高さ寸法bottom - top に設定します。

  7. bounds を返します。

テスト
この例では、DOMQuad コンストラクターが DOMPoint 型および DOMPointInit 型の引数で呼び出されています。 どちらの引数も受け入れられ、使用できます。
var point = new DOMPoint(2, 0);
var quad1 = new DOMQuad(point, {x: 12, y: 0}, {x: 12, y: 10}, {x: 2, y: 10});

上記の DOMQuad quad1 の属性値は、以下の 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 で表されます。 赤色で示された4つの円は、DOMPoint の属性 p1 から p4 までを示します。 点線の矩形は getBounds() メソッドによって得られるバウンディング矩形を表します(DOMQuad)。

6. DOMMatrix インターフェイス

DOMMatrix および DOMMatrixReadOnly インターフェイスは、いずれもグラフィカルなコンテキストでの変換を記述するための数学的な行列を表します。次のセクションでインターフェイスの詳細を説明します。

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 までです。

以下のセクションでは、用語の意味は次の通りです:

後乗

A を後乗するとは、A · B と等しいことを示します。

前乗

A を前乗するとは、B · A と等しいことを示します。

乗算

A に項 B を乗算するとは、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 オブジェクトを返すインターフェイスは、内部メンバー変数の値を変更できる場合があります。そのようなインターフェイスは、この能力について本文で明示する必要があります。

内部メンバー変数は、いかなる方法でも公開してはなりません。

DOMMatrix および DOMMatrixReadOnly インターフェイスは、SVG の SVGMatrix インターフェイスを置き換えます。[SVG11]

テスト

6.1. DOMMatrix2DInit および DOMMatrixInit 辞書

(2D の)検証と修正DOMMatrix2DInit または DOMMatrixInit 辞書 dict に対して行うには、以下の手順を実行します:

  1. dict に対して、次のいずれかが真の場合、TypeError 例外を投げて、これらの手順を中止します。

  2. m11 が存在しない場合、メンバー a の値、または a も存在しない場合は 1 を設定する。

  3. m12 が存在しない場合、メンバー b の値、または b も存在しない場合は 0 を設定する。

  4. m21 が存在しない場合、メンバー c の値、または c も存在しない場合は 0 を設定する。

  5. m22 が存在しない場合、メンバー d の値、または d も存在しない場合は 1 を設定する。

  6. m41 が存在しない場合、メンバー e の値、または e も存在しない場合は 0 を設定する。

  7. m42 が存在しない場合、メンバー f の値、または f も存在しない場合は 0 を設定する。

SameValueZero 比較アルゴリズムは、二つの NaN 値、そして 0-0 に対して true を返します。[ECMA-262]

検証と修正DOMMatrixInit 辞書 dict に対して行う場合、以下の手順を実行します:

  1. (2D の)検証と修正dict に行う。

  2. is2Dtrue かつ:m13m14m23m24m31m32m34m43 のいずれかが 0 または -0 以外で存在する場合、または m33m44 のいずれかが 1 以外で存在する場合、TypeError 例外を投げ、これらの手順を中止する。

  3. is2D が存在せず、かつ m13m14m23m24m31m32m34m43 のいずれかが 0 または -0 以外で存在する場合、または m33m44 のいずれかが 1 以外で存在する場合、is2Dfalse に設定する。

  4. is2D が未設定の場合、true に設定する。

テスト

6.2. 文字列から抽象行列へのパース

文字列から抽象行列をパースするとは、与えられた文字列 transformList に対して、以下の手順を実行することを意味します。処理は 4x4 抽象行列 とブール値 2dTransform のペア、または失敗を返します。

  1. もし transformList が空文字列なら、"matrix(1, 0, 0, 1, 0, 0)" という文字列に設定します。

  2. パースを行い、transformList を CSS の transform プロパティの文法で parsedValue へ変換します。結果は <transform-list>、キーワード none、または失敗となります。もし parsedValue が失敗の場合や、<transform-function><length> 値が絶対長さ単位無しで使われている場合、または none 以外のキーワードが使われている場合は失敗を返します。[CSS3-SYNTAX] [CSS3-TRANSFORMS]

  3. もし parsedValuenone なら、parsedValue を単一の単位行列を含む <transform-list> に設定します。

  4. 2dTransformparsedValue の 2D/3D 寸法状態を記録します。

    もし parsedValue三次元変換関数 を含む場合

    2dTransformfalse を設定します。

    それ以外の場合

    2dTransformtrue を設定します。

  5. すべての <transform-function> を “Transform 関数の数学的記述” に従って 4x4 抽象行列 に変換します。[CSS3-TRANSFORMS]

  6. 本節冒頭の図と同じ形式の 4x4 抽象行列 matrix を用意します。全ての行列を左から右へ 後乗 して、その積を matrix に設定します。

  7. matrix2dTransform を返します。

6.3. DOMMatrixReadOnly と DOMMatrix オブジェクトの作成

2D行列を作成とは、typeDOMMatrixReadOnly または DOMMatrix)型と、6要素のシーケンス init が与えられた場合、次の手順を実行します:

  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)型と、16要素のシーケンス init が与えられた場合、次の手順を実行します:

  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 を抽象行列へパースし、結果の matrix, 2dTransform を取得。失敗なら "SyntaxError" DOMException を投げる。

  3. もし 2dTransformtrue の場合

    2D行列を作成matrixm11, m12, m21, m22, m41, m42 を値として返す。

    それ以外の場合

    3D行列を作成matrix の16要素を返す。

init が6要素のシーケンスの場合

2D行列を作成 の結果を返す。

init が16要素のシーケンスの場合

3D行列を作成 の結果を返す。

それ以外の場合

TypeError 例外を投げる。

テスト

fromMatrix(other) 静的メソッド(DOMMatrixReadOnly 上)では 辞書からDOMMatrixReadOnlyを作成 (other) を実行しなければなりません。

fromMatrix(other) 静的メソッド(DOMMatrix 上)では 辞書からDOMMatrixを作成 (other) を実行しなければなりません。

2D 辞書からDOMMatrixReadOnlyを作成 (other) または 2D 辞書からDOMMatrixを作成 (other) の手順は次の通りです:

  1. (2D の)検証と修正other に対し行う。

  2. DOMMatrixReadOnly または DOMMatrix 型として、otherm11, m12, m21, m22, m41m42 の順で値を使い 2D行列を作成 を返す。

辞書からDOMMatrixReadOnlyを作成 (other) または 辞書からDOMMatrixを作成 (other) の手順は次の通りです:

  1. 検証と修正other に対し行う。

  2. もし is2D 辞書メンバーが true の場合

    DOMMatrixReadOnly または DOMMatrix 型として、otherm11, m12, m21, m22, m41m42 の順で値を使い 2D行列を作成 を返す。

    それ以外の場合

    DOMMatrixReadOnly または DOMMatrix 型として、otherm11, m12, m13, ..., m44 の16要素の値を使い 3D行列を作成 を返す。

fromFloat32Array(array32) 静的メソッド(DOMMatrixReadOnly 上)、および fromFloat32Array(array32) 静的メソッド(DOMMatrix 上)は以下の手順に従います:

もし array32 が6要素の場合

DOMMatrixReadOnly または DOMMatrix 型で array32 から値を順に使い 2D行列を作成 を返す。

array32 が16要素の場合

DOMMatrixReadOnly または DOMMatrix 型で array32 から値を順に使い 3D行列を作成 を返す。

それ以外の場合

TypeError 例外を投げる。

fromFloat64Array(array64) 静的メソッド(DOMMatrixReadOnly 上)、および fromFloat64Array(array64) 静的メソッド(DOMMatrix 上)は以下の手順に従います:

もし array64 が6要素の場合

DOMMatrixReadOnly または DOMMatrix 型で array64 から値を順に使い 2D行列を作成 を返す。

array64 が16要素の場合

DOMMatrixReadOnly または DOMMatrix 型で array64 から値を順に使い 3D行列を作成 を返す。

それ以外の場合

TypeError 例外を投げる。

6.4. DOMMatrix の属性

以下の属性 m11 から m44 までが、行列インターフェイスの16項目に対応します。

m11 および a を取得した場合、m11要素の値を返す必要があります。DOMMatrix インターフェイスの場合、m11 または a 属性を設定すると、m11要素 が新しい値となります。

m12 および b を取得した場合、m12要素 の値を返します。DOMMatrix インターフェイスの場合、m12 または b 属性を設定すると、m12要素 が新しい値となります。

m13 を取得した場合、m13要素 の値を返します。DOMMatrix インターフェイスの場合、m13 属性を設定すると、m13要素 が新しい値となり、その値が 0 または -0 でなければ is 2Dfalse に設定します。

m14 を取得した場合、m14要素 の値を返します。DOMMatrix インターフェイスの場合、m14 属性を設定すると、m14要素 が新しい値となり、その値が 0 または -0 でなければ is 2Dfalse に設定します。

m21 および c を取得した場合、m21要素 の値を返します。DOMMatrix インターフェイスの場合、m21 または c 属性を設定すると、m21要素 が新しい値となります。

m22 および d を取得した場合、m22要素 の値を返します。DOMMatrix インターフェイスの場合、m22 または d 属性を設定すると、m22要素 が新しい値となります。

m23 を取得した場合、m23要素 の値を返します。DOMMatrix インターフェイスの場合、m23 属性を設定すると、m23要素 が新しい値となり、その値が 0 または -0 でなければ is 2Dfalse に設定します。

m24 を取得した場合、m24要素 の値を返します。DOMMatrix インターフェイスの場合、m24 属性を設定すると、m24要素 が新しい値となり、その値が 0 または -0 でなければ is 2Dfalse に設定します。

m31 を取得した場合、m31要素 の値を返します。DOMMatrix インターフェイスの場合、m31 属性を設定すると、m31要素 が新しい値となり、その値が 0 または -0 でなければ is 2Dfalse に設定します。

m32 を取得した場合、m32要素 の値を返します。DOMMatrix インターフェイスの場合、m32 属性を設定すると、m32要素 が新しい値となり、その値が 0 または -0 でなければ is 2Dfalse に設定します。

m33 を取得した場合、m33要素 の値を返します。DOMMatrix インターフェイスの場合、m33 属性を設定すると、m33要素 が新しい値となり、その値が 1 でなければ is 2Dfalse に設定します。

m34 を取得した場合、m34要素 の値を返します。DOMMatrix インターフェイスの場合、m34 属性を設定すると、m34要素 が新しい値となり、その値が 0 または -0 でなければ is 2Dfalse に設定します。

m41 および e を取得した場合、m41要素 の値を返します。DOMMatrix インターフェイスの場合、m41 または e 属性を設定すると、m41要素 が新しい値となります。

m42 および f を取得した場合、m42要素 の値を返します。DOMMatrix インターフェイスの場合、m42 または f 属性を設定すると、m42要素 が新しい値となります。

m43 を取得した場合、m43要素 の値を返します。DOMMatrix インターフェイスの場合、m43 属性を設定すると、m43要素 が新しい値となり、その値が 0 または -0 でなければ is 2Dfalse に設定します。

m44 を取得した場合、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 変換操作のみが行われた。各 mutable および immutable transformation method 毎に is 2Dfalse にするかどうかが定義されています。

is 2D は、一度 false になると、例外的に setMatrixValue() メソッドを呼び出す場合以外、DOMMatrix オブジェクト上で true には戻りません。

6.5. 不変変換メソッド

以下のメソッドは現在の行列を変更せず、新しい DOMMatrix オブジェクトを返します。

translate(tx, ty, tz)
  1. result を現在の行列の値で初期化した結果行列とする。

  2. resulttx, ty, tz を引数に translateSelf() 変換を実行する。

  3. result を返す。

現在の行列は変更されません。

scale(scaleX, scaleY, scaleZ, originX, originY, originZ)
  1. scaleY が省略された場合、scaleYscaleX の値を設定する。

  2. result を現在の行列の値で初期化した結果行列とする。

  3. resultscaleX, scaleY, scaleZ, originX, originY, originZ を引数に scaleSelf() 変換を実行する。

  4. result を返す。

現在の行列は変更されません。

scaleNonUniform(scaleX, scaleY)

レガシー互換(SVG 1.1のSVGMatrix)のためにサポートされています。作者は scale() の使用を推奨します。

  1. result を現在の行列の値で初期化した結果行列とする。

  2. resultscaleX, scaleY, 1, 0, 0, 0 を引数に scaleSelf() 変換を実行する。

  3. result を返す。

現在の行列は変更されません。

scale3d(scale, originX, originY, originZ)
  1. result を現在の行列の値で初期化した結果行列とする。

  2. resultscale, originX, originY, originZ を引数に scale3dSelf() 変換を実行する。

  3. result を返す。

現在の行列は変更されません。

rotate(rotX, rotY, rotZ)
  1. result を現在の行列の値で初期化した結果行列とする。

  2. resultrotX, rotY, rotZ を引数に rotateSelf() 変換を実行する。

  3. result を返す。

現在の行列は変更されません。

rotateFromVector(x, y)
  1. result を現在の行列の値で初期化した結果行列とする。

  2. resultx, y を引数に rotateFromVectorSelf() 変換を実行する。

  3. result を返す。

現在の行列は変更されません。

rotateAxisAngle(x, y, z, angle)
  1. result を現在の行列の値で初期化した結果行列とする。

  2. resultx, y, z, angle を引数に rotateAxisAngleSelf() 変換を実行する。

  3. result を返す。

現在の行列は変更されません。

skewX(sx)
  1. result を現在の行列の値で初期化した結果行列とする。

  2. sx を引数に skewXSelf() 変換を result に実行します。

  3. result を返す。

現在の行列は変更されません。

skewY(sy)
  1. result を現在の行列の値で初期化した結果行列とする。

  2. sy を引数に skewYSelf() 変換を result に実行します。

  3. result を返す。

現在の行列は変更されません。

multiply(other)
  1. result を現在の行列の値で初期化した結果行列とする。

  2. other を引数に multiplySelf() 変換を結果に実行します。

  3. result を返す。

現在の行列は変更されません。

flipX()
  1. result を現在の行列の値で初期化した結果行列とする。

  2. resultnew DOMMatrix([-1, 0, 0, 1, 0, 0])後乗 変換する。

  3. result を返す。

現在の行列は変更されません。

flipY()
  1. result を現在の行列の値で初期化した結果行列とする。

  2. resultnew 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 でシリアライズして返します。

文字列化挙動
  1. m11要素 から m44要素 のいずれかが非有限値の場合、"InvalidStateError" DOMException を投げる。

    CSS構文では NaNInfinity 値は表現できません。

  2. string を空文字列とする。

  3. is 2Dtrue なら:

    1. string に "matrix(" を追加する。

    2. string! ToString(m11要素) を追加する。

    3. string に ", " を追加する。

    4. string! ToString(m12要素) を追加する。

    5. string に ", " を追加する。

    6. string! ToString(m21要素) を追加する。

    7. string に ", " を追加する。

    8. string! ToString(m22要素) を追加する。

    9. string に ", " を追加する。

    10. string! ToString(m41要素) を追加する。

    11. string に ", " を追加する。

    12. string! ToString(m42要素) を追加する。

    13. string に ")" を追加する。

    この文字列は CSS Transforms の <matrix()> 関数形式になります。[CSS3-TRANSFORMS]

  4. それ以外の場合:

    1. string に "matrix3d(" を追加する。

    2. string! ToString(m11要素) を追加する。

    3. string に ", " を追加する。

    4. string! ToString(m12要素) を追加する。

    5. string に ", " を追加する。

    6. string! ToString(m13要素) を追加する。

    7. string に ", " を追加する。

    8. string! ToString(m14要素) を追加する。

    9. string に ", " を追加する。

    10. string! ToString(m21要素) を追加する。

    11. string に ", " を追加する。

    12. string! ToString(m22要素) を追加する。

    13. string に ", " を追加する。

    14. string! ToString(m23要素) を追加する。

    15. string に ", " を追加する。

    16. string! ToString(m24要素) を追加する。

    17. string に ", " を追加する。

    18. string! ToString(m41要素) を追加する。

    19. string に ", " を追加する。

    20. string! ToString(m42要素) を追加する。

    21. string に ", " を追加する。

    22. string! ToString(m43要素) を追加する。

    23. string に ", " を追加する。

    24. string! ToString(m44要素) を追加する。

    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 行列を現在の行列に後乗する。

  3. is 2DotherObjectfalse の場合、現在の行列の is 2Dfalse に設定する。

  4. 現在の行列を返す。

preMultiplySelf(other)
  1. otherObject辞書からDOMMatrixを作成 (other) の結果とする。

  2. otherObject 行列を現在の行列に前乗する。

  3. is 2DotherObjectfalse の場合、現在の行列の is 2Dfalse に設定する。

  4. 現在の行列を返す。

translateSelf(tx, ty, tz)
  1. 現在の行列に、3D平行移動変換を後乗する。3D平行移動行列はCSS Transformsで定義されています。[CSS3-TRANSFORMS]

  2. tz が0または-0以外に指定された場合、現在の行列の is 2Dfalse に設定します。

  3. 現在の行列を返す。

scaleSelf(scaleX, scaleY, scaleZ, originX, originY, originZ)
  1. 現在の行列に、originX, originY, originZ を引数に translateSelf() 変換を実行します。

  2. scaleY が省略された場合、scaleYscaleX の値を設定します。

  3. 現在の行列に、scaleX, scaleY, scaleZ を使い非均等スケール変換を 後乗する。3Dスケール行列はCSS Transformsで定義されており、sx = scaleX, sy = scaleY, sz = scaleZとなる。[CSS3-TRANSFORMS]

  4. originX, originY, originZ の符号を反転する。

  5. 現在の行列に、-originX, -originY, -originZ を引数に translateSelf() 変換を実行します。

  6. scaleZ1 でない場合、現在の行列の is 2Dfalse に設定します。

  7. 現在の行列を返す。

scale3dSelf(scale, originX, originY, originZ)
  1. 現在の行列に、originX, originY, originZ を引数に translateSelf() 変換を実行します。

  2. 現在の行列に、3D一様スケール変換 (m11 = m22 = m33 = scale) を 後乗で適用する。3Dスケール行列はCSS Transformsで定義されており、sx = sy = sz = scaleとなる。[CSS3-TRANSFORMS]

  3. 現在の行列に、-originX, -originY, -originZ を引数に translateSelf() 変換を実行します。

  4. scale1 でない場合、現在の行列の is 2Dfalse に設定します。

  5. 現在の行列を返す。

rotateSelf(rotX, rotY, rotZ)
  1. rotY および rotZ の両方が省略された場合、rotZrotXの値を設定し、rotX および rotY0 に設定する。

  2. さらに rotY が省略されていれば、rotY0 に設定する。

  3. さらに rotZ が省略されていれば、rotZ0 に設定する。

  4. rotX または rotY0 または -0 でなければ現在の行列の is 2Dfalse に設定する。

  5. 現在の行列に、ベクトル(0,0,1)周りに rotZ 度回転する変換を後乗する。3D回転行列はCSS Transformsで定義されていて alpha=rotZ度。[CSS3-TRANSFORMS]

  6. 現在の行列に、ベクトル(0,1,0)周りに rotY 度回転する変換を後乗する。3D回転行列はCSS Transformsで定義されていて alpha=rotY度。[CSS3-TRANSFORMS]

  7. 現在の行列に、ベクトル(1,0,0)周りに rotX 度回転する変換を後乗する。3D回転行列はCSS Transformsで定義されていて alpha=rotX度。[CSS3-TRANSFORMS]

  8. 現在の行列を返す。

rotateFromVectorSelf(x, y)
  1. 現在の行列に、ベクトル(1,0)Tと(x,y)Tが成す時計回りの角度による回転変換を後乗する。xyが両方とも0または-0なら、角度は0とする。2D回転行列はCSS Transformsで定義されていて、alphaはこの角度(度単位)。[CSS3-TRANSFORMS]

  2. 現在の行列を返す。

rotateAxisAngleSelf(x, y, z, angle)
  1. 現在の行列に、指定されたベクトル x, y, z 周りに angle 度回転する回転変換を後乗する。3D回転行列はCSS Transformsで定義されていて alpha=angle度。[CSS3-TRANSFORMS]

  2. x または y0 または -0 でなければ現在の行列の is 2Dfalse に設定する。

  3. 現在の行列を返す。

skewXSelf(sx)
  1. 現在の行列に、sx度のskewX変換を後乗する。2D skewX行列はCSS Transformsで定義されていて alpha=sx度。[CSS3-TRANSFORMS]

  2. 現在の行列を返す。

skewYSelf(sy)
  1. 現在の行列に、sy度のskewY変換を後乗する。2D skewY行列はCSS Transformsで定義されていて beta=sy度。[CSS3-TRANSFORMS]

  2. 現在の行列を返す。

invertSelf()
  1. 現在の行列を反転させる。

  2. 現在の行列が反転可能でない場合、全ての属性を NaN にし、is 2Dfalse に設定する。

  3. 現在の行列を返す。

テスト
setMatrixValue(transformList)
  1. transformListを抽象行列にパースし、結果の matrix2dTransform を取得。失敗なら "SyntaxError" DOMException を投げる。

  2. is 2D2dTransform の値を設定する。

  3. m11要素 から m44要素 までを matrix の列優先順で各要素値に設定する。

  4. 現在の行列を返す。

テスト

7. 構造化シリアル化

DOMPointReadOnly, DOMPoint, DOMRectReadOnly, DOMRect, DOMQuad, DOMMatrixReadOnly, DOMMatrix オブジェクトは シリアル化可能オブジェクト です。[HTML]

DOMPointReadOnly および DOMPointシリアル化手順は、valueserialized が与えられたとき、以下の通りです:

  1. serialized.[[X]] に valuex座標 を設定する。

  2. serialized.[[Y]] に valuey座標 を設定する。

  3. serialized.[[Z]] に valuez座標 を設定する。

  4. serialized.[[W]] に valuew透視座標 を設定する。

これらの 逆シリアル化手順は、serialized および value が与えられたとき、以下の通りです:

  1. valuex座標serialized.[[X]] を設定する。

  2. valuey座標serialized.[[Y]] を設定する。

  3. valuez座標serialized.[[Z]] を設定する。

  4. valuew透視座標serialized.[[W]] を設定する。

DOMRectReadOnly および DOMRectシリアル化手順は、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]] に value部分シリアル化 point 2 を設定する。

  3. serialized.[[P3]] に value部分シリアル化 point 3 を設定する。

  4. serialized.[[P4]] に value部分シリアル化 point 4 を設定する。

これらの 逆シリアル化手順は、serializedvalue が与えられた場合、以下の通りです:

  1. valuepoint 1部分逆シリアル化 serialized.[[P1]] を設定する。

  2. valuepoint 2部分逆シリアル化 serialized.[[P2]] を設定する。

  3. valuepoint 3部分逆シリアル化 serialized.[[P3]] を設定する。

  4. valuepoint 4部分逆シリアル化 serialized.[[P4]] を設定する。

DOMMatrixReadOnly および DOMMatrixシリアル化手順は、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の DOMMatrixDOMMatrixReadOnly の場合、一部の要素(例: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 を設定する。

    これらの 逆シリアル化手順は、serialized および value が与えられた場合:

    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 を設定する。

テスト

8. セキュリティの考慮事項

DOMMatrix および DOMMatrixReadOnly インターフェイスは、CSS 構文による文字列のパースへのエントリーポイントを持ちます。したがって、CSS 構文仕様のセキュリティに関する考慮事項が適用されます。[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 の以前の版では、SVGPointSVGRectSVGMatrix が定義されており、これは本仕様においてそれぞれ DOMPointDOMRectDOMMatrix のエイリアスとして定義されています。[SVG11]

10.3. 非標準

一部のユーザーエージェントは WebKitPoint インターフェイスをサポートしていました。本仕様に準拠する実装は WebKitPoint をサポートしません。

複数のユーザーエージェントは WebKitCSSMatrix インターフェイスをサポートしており、これは Web で広く使用されています。本仕様では、DOMMatrix のエイリアスとして定義されています。

一部のユーザーエージェントは MSCSSMatrix インターフェイスをサポートしていました。本仕様に準拠する実装は MSCSSMatrix をサポートしません。

Tests

文書上の慣習

空ではない unrestricted double 値のリストに対する NaN を優先する最小値 は、リストのいずれかのメンバーが NaN の場合は NaN、そうでなければそのリストの最小値です。

同様に、空ではない unrestricted double 値のリストに対する NaN を優先する最大値 は、リストのいずれかのメンバーが NaN の場合は NaN、そうでなければそのリストの最大値です。

前回の公開以降の変更点

このセクションは規範的ではありません。

2018 年 12 月 4 日の候補勧告以降に行われた変更は次の通りです。

2014 年 11 月 25 日の候補勧告以降に行われた変更は次の通りです。

2014 年 9 月 18 日の作業草案以降に行われた変更は次の通りです。

2014 年 6 月 26 日の最終コール公開作業草案以降に行われた変更は次の通りです。

2014 年 5 月 22 日の初版公開作業草案以降に行われた変更は次の通りです。

謝辞

編集者は、本仕様への貢献に対して 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の記述通りに解釈されます。 ただし、可読性のため本仕様書ではこれらの語は全て大文字ではありません。

この仕様の本文は、明示的に非規範と記された箇所、例、注以外すべてが規範的です。[RFC2119]

この仕様書の例は「例えば」で始まるか、class="example" のような形式で規範文から区別して示されます:

これは情報例の一例です。

情報としての注記は「注」で始まり、class="note" のように規範文から分離して示します:

注:これは情報的な注記です。

助言は規範的な節で、特別な注意を喚起するために <strong class="advisement"> で装飾され、次のように示します: UAはアクセシブルな代替手段を提供しなければなりません。

テスト

この仕様の内容に関連するテストは、これのような「テスト」ブロックに記載される場合があります。 このようなブロックは非規範です。


適合クラス

この仕様への適合性は、次の3つの適合クラスで定義されます:

スタイルシート
CSS スタイルシート
レンダラー
UA(ユーザーエージェント)。スタイルシートの意味を解釈し、それを使った文書をレンダリングします。
オーサリングツール
UA がスタイルシートを書き出す場合。

スタイルシートが本仕様に適合するのは、本モジュールで定義される文法を使用するすべてのステートメントが、汎用CSS文法と本モジュール各機能の文法に沿って有効な場合です。

レンダラーが本仕様に適合するのは、適切な仕様により定義された通りにスタイルシートを解釈するだけでなく、本仕様で定義されたすべての機能を正しくパースし、文書をそれに応じてレンダリングする場合です。ただし、UAがデバイスの制限のため文書を正しくレンダリングできないとしても、適合性が失われるわけではありません(例えば、UAはモノクロモニターで色を描画する必要はありません)。

オーサリングツールが本仕様に適合するのは、汎用CSS文法と各機能の文法に従って書かれた構文的に正しいスタイルシートを書き出し、本モジュール中で記述されたその他すべてのスタイルシート適合要件を満たす場合です。

部分実装

著者が将来的な互換性のあるパースルールを利用してフォールバック値を指定できるよう、CSSレンダラーは、サポートできるレベルに達していないat-規則、プロパティ、プロパティ値、キーワード、その他構文要素を無効として適切に無視)、扱う必要があります。特に、ユーザーエージェントは複数値プロパティ宣言において未サポートの値を個別に無視してサポートされている値だけを適用してはなりません:いずれかの値が無効(サポートされていない値は必ず無効)なら、CSSは宣言全体が無視されることを要求します。

不安定および独自機能の実装

将来の安定版CSS機能との衝突を避けるため、CSSWGはベストプラクティスの順守を推奨しています。これは不安定な機能独自拡張 の実装にも適用されます。

非実験的な実装

仕様が候補勧告(CR)段階に到達すると、非実験的な実装が可能となり、実装者は仕様通りに正しく実装できたCRレベル機能について、プレフィックス無し実装をリリースすべきです。

CSS実装間の相互運用性の確保と維持のため、CSS WGは非実験的なCSSレンダラーに対し、CSS機能についてプレフィックス無し実装をリリースする前に、実装報告書(必要に応じてそのテストケース)をW3Cに提出することを要請します。W3Cに提出されたテストケースはCSS WGによるレビューと校正の対象になります。

テストケースと実装報告の提出方法の詳細は、CSS WGのウェブサイト https://www.w3.org/Style/CSS/Test/ を参照してください。 質問は public-css-testsuite@w3.org メーリングリストへ。

CR脱却基準

この仕様が提案勧告(PR)に進むには、各機能について少なくとも2つの独立した、相互運用可能な実装が必要です。各機能は別々の製品が実装してもよく、すべての機能が単一製品で実装されている必要はありません。基準のため、以下の用語を定義します:

独立
各実装は別個の団体により開発され、他の有資格実装で使われているコードを共有・再利用・派生してはなりません。本仕様の実装に無関係なコード部分はこの要件から除外されます。
相互運用可能
公式CSSテストスイート、またはWebブラウザーでない場合は同等のテストを通過すること。各関連テストには、そうしたUAが適合性主張に用いる場合同等テストが作られているべきです。加えて、同等テストによる適合性主張に使うUAがある場合、同一方法でこれら同等テストを通過できるUAが他にも必要です。同等テストは査読のため公開される必要があります。
実装
ユーザーエージェント:
  1. 仕様を実装していること。
  2. 一般公開されていること。リリース製品またはパブリック向けバージョン(例:ベータ版、プレビュービルド、ナイトリービルド)であること。未リリース製品の場合、その機能が最低1ヶ月間実装されており、安定性が確認できること。
  3. 実験的でないこと(すなわち、テストスイート通過のためだけに設計され、今後通常利用されることが意図されていないバージョンではないこと)。

この仕様は最低6ヶ月間、候補勧告として維持されます。

索引

この仕様で定義される用語

参照で定義される用語

参考文献

規範的参考文献

[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 Language Specification. URL: https://tc39.es/ecma262/multipage/
[HTML]
Anne van Kesteren; 他. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. 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 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; 他. 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