Signatur
Beschreibung
Die schreibgeschützte Eigenschaft transform von SVGGraphicsElement gibt ein SVGAnimatedTransformList-Objekt zurück. Es bildet das transform-Attribut eines Elements wie <rect>, <g>, <circle> oder <text> ab. Über baseVal erreichst du den statischen Attributwert, über animVal den aktuellen, möglicherweise durch SMIL-Animationen veränderten Wert.
Schreibgeschützt ist nur die Eigenschaft selbst: Du kannst ihr kein neues Objekt zuweisen. Die enthaltene SVGTransformList (baseVal) lässt sich dagegen verändern. Mit appendItem(), insertItemBefore(), removeItem() oder clear() bearbeitest du die Liste, und jedes SVGTransform-Objekt stellt Methoden wie setTranslate(), setRotate() oder setScale() bereit. Jede Änderung wird sofort in das Attribut zurückgeschrieben.
Nützlich ist das vor allem, wenn du Transformationen per Code auswerten oder schrittweise ändern willst, ohne den Attribut-String selbst zu zerlegen. Typische Fälle sind Drag & Drop, Zoomen oder Drehen von SVG-Gruppen. Mit consolidate() fasst du alle Einträge zu einer einzigen Matrix zusammen.
Rückgabewert
baseVal (veränderbare SVGTransformList des Attributs) und animVal (schreibgeschützte SVGTransformList mit dem animierten Wert).Beispiele
Transformationen eines Elements auslesen
// <svg><rect id="box" width="50" height="50" transform="translate(20 10) rotate(45)"/></svg>
const rect = document.getElementById('box');
const list = rect.transform.baseVal;
console.log(list.numberOfItems);
for (const t of Array.from({ length: list.numberOfItems }, (_, i) => list.getItem(i))) {
// t.type: 2 = TRANSLATE, 4 = ROTATE
console.log(t.type, t.angle, t.matrix.e, t.matrix.f);
}
Element per Code verschieben (Drag-Grundlage)
const svg = document.querySelector('svg');
const group = svg.querySelector('g');
// Neue Verschiebung erzeugen und an den Anfang der Liste setzen
const move = svg.createSVGTransform();
move.setTranslate(100, 40);
group.transform.baseVal.insertItemBefore(move, 0);
console.log(group.getAttribute('transform'));
Alle Transformationen zu einer Matrix zusammenfassen
// <circle id="dot" r="5" transform="translate(10 0) scale(2)"/>
const dot = document.getElementById('dot');
const combined = dot.transform.baseVal.consolidate();
if (combined) {
const { a, b, c, d, e, f } = combined.matrix;
console.log([a, b, c, d, e, f]);
}
console.log(dot.transform.baseVal.numberOfItems);
Drehung schrittweise animieren
const svg = document.querySelector('svg');
const rect = svg.querySelector('rect');
const rotation = svg.createSVGTransform();
rect.transform.baseVal.appendItem(rotation);
let angle = 0;
const tick = () => {
angle = (angle + 2) % 360;
rotation.setRotate(angle, 25, 25); // um den Mittelpunkt drehen
requestAnimationFrame(tick);
};
requestAnimationFrame(tick);
// Wichtig · Fallstricke
- Nur das SVG-Attribut:
transform.baseValenthält nur dastransform-Attribut. Setzt du die CSS-Eigenschafttransform(etwa per Stylesheet oderelement.style.transform), taucht sie hier nicht auf. Das effektive Ergebnis erhältst du übergetCTM()bzw.getScreenCTM(). - Keine Zuweisung:
el.transform = …hat keine Wirkung und wirft im Strict Mode einenTypeError. Bearbeite stattdessenbaseVal. animValist schreibgeschützt: Änderungen daran lösen eineDOMException(NoModificationAllowedError) aus.- Leere Liste: Hat das Element kein
transform-Attribut, istnumberOfItemsgleich0, undconsolidate()liefertnull. appendItem()verschiebt Objekte: Gehört das übergebeneSVGTransformschon zu einer anderen Liste, wird es dort entfernt.- Kompatibilität: Wird von allen modernen Browsern unterstützt.
SVGTransformListist nicht iterierbar, deshalb funktioniertfor…ofnicht direkt. VerwendegetItem(i)oderArray.from()mitlength/numberOfItems. - Leistung: Wenn du ein vorhandenes
SVGTransform-Objekt mitsetTranslate()odersetRotate()änderst, ist das bei Animationen schneller, als in jedem Frame den Attribut-String neu zu setzen.