Start · Sprachen · JavaScript · Referenz · SVGSVGElement.createSVGTransformFromMatrix()

SVGSVGElement.createSVGTransformFromMatrix()

Methode

Erstellt ein freistehendes <code>SVGTransform</code>-Objekt vom Typ <code>SVG_TRANSFORM_MATRIX</code>, dessen Matrix eine Kopie der übergebenen Matrix ist.

seit JavaScript Baseline: alle Browser (SVG 1.1, DOMMatrix-Unterst Kategorie: webapi

Signatur

SVGSVGElement.prototype.createSVGTransformFromMatrix(matrix)

Beschreibung

Die Methode createSVGTransformFromMatrix() eines <svg>-Elements erzeugt ein neues SVGTransform-Objekt, das noch keinem Element zugeordnet ist. Die Transformation hat den Typ SVGTransform.SVG_TRANSFORM_MATRIX (Wert 1), und ihre Werte a bis f werden aus der übergebenen Matrix kopiert. Spätere Änderungen an der Ausgangsmatrix wirken sich also nicht auf die Transformation aus.

Gebraucht wird sie vor allem, wenn man eine berechnete Matrix, etwa aus getCTM(), getScreenCTM() oder einer Verkettung mehrerer DOMMatrix-Operationen, in die Transformationsliste eines Elements (element.transform.baseVal) einfügen will. Übliche Einsatzfälle sind Drag-and-Drop, Zoomen und Schwenken in SVG-Editoren oder das Zusammenfassen mehrerer Transformationen zu einer einzigen.

Das Ergebnis lässt sich mit SVGTransformList.appendItem(), insertItemBefore(), replaceItem() oder initialize() an ein Element hängen. Ein kürzerer Weg ist SVGTransformList.createSVGTransformFromMatrix() zusammen mit consolidate(). Das Gleiche erreicht man auch mit createSVGTransform() und einem anschließenden setMatrix().

Parameter

Name Typ Default Beschreibung
$matrix Pflicht DOMMatrix | DOMMatrixReadOnly | SVGMatrix | DOMMatrix2DInit Die Matrix, deren Werte a, b, c, d, e und f in die neue Transformation kopiert werden. Seit SVG 2 ist auch ein einfaches Objekt nach dem Muster von DOMMatrix2DInit möglich, z. B. { a: 1, d: 1, e: 10 }.

Rückgabewert

Typ
SVGTransform
Beschreibung
Ein neues, freistehendes SVGTransform-Objekt mit type === 1 (SVG_TRANSFORM_MATRIX) und einer Kopie der übergebenen Matrix.

Beispiele

Transformation aus einer DOMMatrix erzeugen und anhängen

const svg = document.querySelector('svg');
const rect = svg.querySelector('rect');

// Verschieben und drehen zu einer Matrix verketten
const matrix = new DOMMatrix().translate(50, 20).rotate(30);

const transform = svg.createSVGTransformFromMatrix(matrix);
rect.transform.baseVal.appendItem(transform);

console.log(transform.type === SVGTransform.SVG_TRANSFORM_MATRIX);
console.log(rect.getAttribute('transform'));
true matrix(0.866025 0.5 -0.5 0.866025 50 20) (genaue Formatierung je nach Browser)

Die Matrix wird kopiert, nicht referenziert

const svg = document.querySelector('svg');
const m = new DOMMatrix([1, 0, 0, 1, 10, 10]);

const t = svg.createSVGTransformFromMatrix(m);
m.e = 999; // die Ausgangsmatrix nachträglich ändern

console.log(t.matrix.e);
10

Mehrere Transformationen durch eine einzige ersetzen (Drag-Verschiebung)

const svg = document.querySelector('svg');
const shape = svg.querySelector('#shape');

const moveBy = (dx, dy) => {
  const list = shape.transform.baseVal;
  // Aktuelle Gesamtmatrix ermitteln (oder die Einheitsmatrix, wenn die Liste leer ist)
  const current = list.numberOfItems
    ? list.consolidate().matrix
    : new DOMMatrix();
  // Verschiebung vorn anfügen, damit sie im Koordinatensystem des Elternelements wirkt
  const next = new DOMMatrix().translate(dx, dy).multiply(current);
  list.initialize(svg.createSVGTransformFromMatrix(next));
};

moveBy(25, 0);
console.log(shape.transform.baseVal.numberOfItems);
1

// Wichtig · Fallstricke

  • Kopie statt Referenz: Die Werte der Matrix werden beim Aufruf kopiert. Wer die Transformation später ändern will, nutzt transform.setMatrix() oder die Methoden setTranslate(), setRotate() usw.
  • Nur 2D: SVG-Transformationen kennen nur die sechs Werte a bis f. 3D-Anteile einer DOMMatrix werden verworfen. Eine Matrix mit is2D === false führt in manchen Browsern zu einem Fehler.
  • Freistehend: Das Objekt ist erst dann sichtbar, wenn es in eine SVGTransformList eingefügt wurde. Fügt man es in eine zweite Liste ein, wird es aus der ersten entfernt.
  • Kompatibilität: Die Methode wird von allen modernen Browsern unterstützt. Ältere Browser erwarten ein SVGMatrix-Objekt, das man mit svg.createSVGMatrix() erzeugt. In aktuellen Browsern ist SVGMatrix nur noch ein Alias für DOMMatrix.
  • Die Methode gibt es nur auf SVGSVGElement (dem <svg>-Element) und auf SVGTransformList, nicht auf anderen SVG-Elementen.