Signatur
Beschreibung
toMatrix() gehört zum CSS Typed Object Model (Houdini). Ein CSSTransformValue ist eine Liste einzelner Transformationen wie CSSTranslate, CSSRotate, CSSScale, CSSSkew, CSSPerspective oder CSSMatrixComponent. Die Methode wandelt jede davon in eine Matrix um und multipliziert sie von links nach rechts. Heraus kommt eine einzige DOMMatrix, die genau der Transformation entspricht, die der Browser auf das Element anwendet.
Das hilft, wenn du mit einer Transformation rechnen musst, statt sie nur zu setzen. Typische Fälle: einen Punkt mit DOMMatrix.transformPoint() in das transformierte Koordinatensystem umrechnen, die Transformation mit inverse() umkehren (z. B. um Mauskoordinaten zurückzurechnen) oder mehrere Transformationen zu einem matrix()-String zusammenfassen.
Die zurückgegebene Matrix ist ein neues, unabhängiges Objekt. Wenn du sie änderst, ändert sich der ursprüngliche CSSTransformValue nicht. Sind alle Bestandteile zweidimensional (is2D === true), ist auch die Matrix 2D (matrix.is2D === true). Sonst entsteht eine 4×4-Matrix.
Rückgabewert
DOMMatrix: das Produkt der Matrizen aller Transformationsbestandteile, in der Reihenfolge der Liste.Beispiele
Transformation aufbauen und in eine Matrix umwandeln
const transform = new CSSTransformValue([
new CSSTranslate(CSS.px(100), CSS.px(50)),
new CSSRotate(CSS.deg(90))
]);
const matrix = transform.toMatrix();
const round = (n) => Math.round(n * 1000) / 1000;
console.log(matrix.is2D);
console.log([matrix.a, matrix.b, matrix.c, matrix.d, matrix.e, matrix.f].map(round));
Punkt eines Elements in transformierte Koordinaten umrechnen
const box = document.querySelector('.box');
box.attributeStyleMap.set('transform', new CSSTransformValue([
new CSSTranslate(CSS.px(20), CSS.px(10)),
new CSSScale(2, 2)
]));
const transform = box.attributeStyleMap.get('transform');
const matrix = transform.toMatrix();
// Wohin wandert die Ecke (50|25) durch die Transformation?
const p = matrix.transformPoint(new DOMPoint(50, 25));
console.log(p.x, p.y);
// Umgekehrt: Bildschirmpunkt ins ursprüngliche Koordinatensystem zurückrechnen
const back = matrix.inverse().transformPoint(p);
console.log(back.x, back.y);
Mehrere Transformationen zu einem matrix()-String zusammenfassen
const transform = new CSSTransformValue([
new CSSScale(2, 3),
new CSSTranslate(CSS.px(5), CSS.px(5))
]);
// Reihenfolge zählt: erst skalieren, dann (im skalierten System) verschieben
console.log(transform.toMatrix().toString());
Relative Einheiten führen zu einem TypeError
const transform = new CSSTransformValue([
new CSSTranslate(CSS.percent(50), CSS.px(0))
]);
try {
transform.toMatrix();
} catch (err) {
console.log(err.name); // Prozentwerte lassen sich ohne Layout nicht auflösen
}
// Wichtig · Fallstricke
- TypeError bei relativen Längen: Enthält ein Bestandteil Längen, die sich nicht ohne Layout in
pxumrechnen lassen (z. B.%,em,vwoder eincalc()mit solchen Einheiten), wirfttoMatrix()einenTypeError. Die Methode kennt die Elementgröße nicht. Nutze absolute Einheiten (px,deg,rad,turn) oder fange den Fehler ab. - Reihenfolge: Die Matrizen werden in der Reihenfolge der Liste multipliziert, genau wie bei der CSS-Eigenschaft
transform.translate+rotateergibt ein anderes Ergebnis alsrotate+translate. - Kein Transform-Origin:
transform-originwird nicht eingerechnet. Die Matrix bezieht sich auf den Nullpunkt. Für die tatsächliche Position auf dem Bildschirm musst du den Ursprung selbst mit einer Verschiebung davor und danach berücksichtigen. - Rundung: Winkelfunktionen liefern Gleitkommawerte wie
6.123e-17statt0. Runde vor Vergleichen oder Ausgaben. - Browser-Unterstützung: CSS Typed OM gibt es in Chromium-Browsern (ab Version 66) und in Safari (ab 16.4), aber nicht in Firefox. Prüfe vorher, ob die API vorhanden ist, z. B. mit
if ('CSSTransformValue' in window). Als Ersatz kannst dunew DOMMatrix(getComputedStyle(el).transform)verwenden. - Für
transform: noneliefertcomputedStyleMap().get('transform')einCSSKeywordValue, keinenCSSTransformValue. Dort gibt es keintoMatrix().