Start · Sprachen · JavaScript · Referenz · SVGTransformList.consolidate()

SVGTransformList.consolidate()

Methode

Multipliziert alle Transformationen einer <code>SVGTransformList</code> zu einer einzigen Matrix. Danach enthält die Liste genau ein <code>SVGTransform</code> vom Typ <code>SVG_TRANSFORM_MATRIX</code>.

seit JavaScript Baseline: alle Browser (SVG 1.1) Kategorie: webapi

Signatur

SVGTransformList.prototype.consolidate()

Beschreibung

consolidate() fasst alle Einträge einer SVGTransformList zu einer einzigen Transformation zusammen. Dazu werden die Matrizen der einzelnen SVGTransform-Objekte in Listenreihenfolge miteinander multipliziert. Danach enthält die Liste nur noch ein neues SVGTransform vom Typ SVG_TRANSFORM_MATRIX. Die Methode gibt dieses Objekt zurück.

Die Methode ist nützlich, wenn sich an einem Element viele Transformationen angesammelt haben. Das passiert z. B. bei interaktivem Ziehen, Drehen oder Skalieren, wenn bei jedem Schritt ein translate oder rotate angehängt wird. Nach der Konsolidierung bleibt die Liste kurz. Die weitere Arbeit läuft über eine einzige Matrix, die sich mit setMatrix() gezielt verändern lässt.

Sie wird meistens auf element.transform.baseVal aufgerufen. Das Attribut transform im DOM wird dabei aktualisiert und steht anschließend in der Form matrix(a b c d e f) da. Ist die Liste leer, wird nichts verändert, und die Methode gibt null zurück.

Rückgabewert

Typ
SVGTransform | null
Beschreibung
Das neue, einzige SVGTransform der Liste (Typ SVG_TRANSFORM_MATRIX) oder null, wenn die Liste leer war.

Beispiele

Mehrere Transformationen zu einer Matrix zusammenfassen

const svgNS = 'http://www.w3.org/2000/svg';
const svg = document.createElementNS(svgNS, 'svg');
const rect = document.createElementNS(svgNS, 'rect');
rect.setAttribute('width', '50');
rect.setAttribute('height', '50');
rect.setAttribute('transform', 'translate(10 20) scale(2)');
svg.appendChild(rect);
document.body.appendChild(svg);

const list = rect.transform.baseVal;
console.log('Vorher:', list.numberOfItems);

const t = list.consolidate();
console.log('Nachher:', list.numberOfItems);
console.log(t.type === SVGTransform.SVG_TRANSFORM_MATRIX);
const { a, b, c, d, e, f } = t.matrix;
console.log(a, b, c, d, e, f);
console.log(rect.getAttribute('transform'));
Vorher: 2 Nachher: 1 true 2 0 0 2 10 20 matrix(2 0 0 2 10 20) // genaue Schreibweise je nach Browser

Beim Ziehen die Transform-Liste kurz halten

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

const moveBy = (dx, dy) => {
  const list = shape.transform.baseVal;
  const step = svg.createSVGTransform();
  step.setTranslate(dx, dy);
  // Verschiebung vor die bisherige Transformation setzen
  list.insertItemBefore(step, 0);
  // Alles zu einer Matrix zusammenfassen
  list.consolidate();
};

let last = null;
shape.addEventListener('pointerdown', (e) => {
  last = { x: e.clientX, y: e.clientY };
  shape.setPointerCapture(e.pointerId);
});
shape.addEventListener('pointermove', (e) => {
  if (!last) return;
  moveBy(e.clientX - last.x, e.clientY - last.y);
  last = { x: e.clientX, y: e.clientY };
});
shape.addEventListener('pointerup', () => { last = null; });

Leere Liste ergibt null

const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
const result = circle.transform.baseVal.consolidate();
console.log(result);
null

// Wichtig · Fallstricke

  • Nur auf baseVal aufrufen: animVal ist schreibgeschützt. Ein Aufruf dort wirft NoModificationAllowedError.
  • Die ursprüngliche Zerlegung geht verloren: Nach der Konsolidierung lassen sich einzelne Werte wie Winkel oder Skalierungsfaktor nicht mehr direkt ablesen. angle ist 0, und das Attribut enthält nur noch matrix(...). Wer die Einzelwerte behalten will, sollte sie vorher sichern.
  • Die Reihenfolge zählt: Die Matrizen werden von links nach rechts in Listenreihenfolge multipliziert, genau wie im transform-Attribut. Ob eine neue Transformation vorne oder hinten eingefügt wird, ändert also das Ergebnis.
  • Frühere SVGTransform-Referenzen: Die alten Einträge stehen danach nicht mehr in der Liste. Änderungen an ihnen wirken sich nicht mehr auf das Element aus.
  • CSS-Transformationen über die Eigenschaft transform sind davon nicht betroffen, weil die Methode nur mit dem SVG-Attribut arbeitet.
  • Kompatibilität: wird seit Langem von allen modernen Browsern unterstützt (SVG 1.1, in SVG 2 übernommen).