Signatur
Beschreibung
toMatrix() ist auf der abstrakten Basisschnittstelle CSSTransformComponent definiert und steht damit allen konkreten Transformationsbausteinen der CSS Typed OM zur Verfügung: CSSTranslate, CSSRotate, CSSScale, CSSSkew, CSSSkewX, CSSSkewY, CSSPerspective und CSSMatrixComponent. Die Methode berechnet die 4×4-Transformationsmatrix, die der jeweiligen CSS-Transformationsfunktion (etwa translate() oder rotate()) entspricht, und liefert sie als neues DOMMatrix-Objekt zurück.
Das ist nützlich, wenn Transformationen nicht nur gesetzt, sondern mathematisch ausgewertet werden sollen: etwa um Punkte mit DOMMatrix.transformPoint() umzurechnen, mehrere Transformationen per multiply() zu kombinieren oder die tatsächliche Verschiebung (e/f) bzw. Skalierung (a/d) auszulesen.
Die Eigenschaft is2D der Komponente bestimmt, ob eine 2D- oder 3D-Matrix entsteht. Voraussetzung für die Berechnung ist, dass alle Längenangaben absolut in Pixel umrechenbar sind (px, cm, in usw.). Relative Einheiten wie %, em oder vw kann die Methode ohne Layout-Kontext nicht auflösen und wirft dann einen TypeError.
Wer die Gesamtmatrix einer kompletten transform-Liste braucht, verwendet stattdessen CSSTransformValue.prototype.toMatrix(). Diese Methode multipliziert die Matrizen aller Komponenten in der richtigen Reihenfolge.
Rückgabewert
DOMMatrix-Objekt, das der Transformationsfunktion entspricht. Ist is2D der Komponente true, ist auch matrix.is2D true.Beispiele
Verschiebung in eine Matrix umwandeln
const translate = new CSSTranslate(CSS.px(10), CSS.px(20));
const matrix = translate.toMatrix();
console.log(matrix.is2D); // 2D-Matrix?
console.log(matrix.e, matrix.f); // Verschiebungsanteile
console.log(matrix.toString());
Rotation berechnen und einen Punkt transformieren
const rotate = new CSSRotate(CSS.deg(90));
const matrix = rotate.toMatrix();
// Punkt (100, 0) um 90° drehen
const p = matrix.transformPoint(new DOMPoint(100, 0));
console.log(Math.round(p.x), Math.round(p.y));
Berechnetes transform eines Elements Schritt für Schritt auswerten
const box = document.querySelector('.box');
box.attributeStyleMap.set('transform',
CSSStyleValue.parse('transform', 'translate(50px, 0) scale(2)'));
const transformValue = box.attributeStyleMap.get('transform'); // CSSTransformValue
for (const component of transformValue) {
const m = component.toMatrix();
console.log(component.constructor.name, m.toString());
}
// Gesamtmatrix aller Komponenten
console.log(transformValue.toMatrix().toString());
Fehlerfall: relative Einheiten abfangen
const translate = new CSSTranslate(CSS.percent(50), CSS.px(0));
try {
translate.toMatrix();
} catch (err) {
console.log(err.name); // Prozentwerte lassen sich nicht in px umrechnen
}
// Wichtig · Fallstricke
- Relative Einheiten: Enthält die Komponente Werte wie
%,em,rem,vwodercalc()mit solchen Einheiten, wirfttoMatrix()einenTypeError. Berechnete Werte auselement.computedStyleMap()sind meist schon absolut und daher unproblematisch. - Gleitkomma-Ungenauigkeit: Bei Rotationen entstehen Werte wie
6.123233995736766e-17statt0. Vor Vergleichen deshalb runden. - Kein Live-Bezug: Die zurückgegebene
DOMMatrixist eine unabhängige Kopie. Änderungen daran wirken sich weder auf die Komponente noch auf das Element aus. - 2D/3D: Wird
is2Deiner Komponente auftruegesetzt, verwirft die Berechnung eventuell vorhandene z-Anteile. - Browser-Kompatibilität: Die CSS Typed OM wird von Chromium-Browsern (ab Chrome/Edge 66) und Safari (ab 16.4) unterstützt, von Firefox bisher nicht. Vorher per
if ('CSSTranslate' in window)prüfen oder als Ausweichlösungnew DOMMatrix(getComputedStyle(el).transform)verwenden.