Signatur
Beschreibung
appendItem() fügt eine neue Transformation (SVGTransform) am Ende einer SVGTransformList ein. Das Attribut transform des Elements wird dabei sofort aktualisiert. An die Liste kommen Sie meist über element.transform.baseVal (bei <linearGradient> über gradientTransform.baseVal, bei <pattern> über patternTransform.baseVal).
Weil SVG Transformationen von rechts nach links auf das Koordinatensystem anwendet, ist die Reihenfolge wichtig: Mit appendItem() hängen Sie die neue Transformation rechts an die bestehende Kette an. So wird sie im lokalen, schon transformierten Koordinatensystem ausgeführt. Ein translate nach einem rotate verschiebt das Element deshalb entlang der gedrehten Achsen.
Neue SVGTransform-Objekte erzeugen Sie mit svgRoot.createSVGTransform() oder svgRoot.createSVGTransformFromMatrix(matrix). Den Typ und die Werte legen Sie danach mit setTranslate(), setRotate(), setScale(), setSkewX(), setSkewY() oder setMatrix() fest. Für die Programmierung ist das oft sauberer, als das Attribut transform als Zeichenkette zusammenzusetzen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $newItem Pflicht | SVGTransform | Die Transformation, die ans Ende der Liste angehängt werden soll. Gehört das Objekt schon zu einer anderen Liste, wird es je nach Spezifikation und Browser entweder aus der alten Liste entfernt (SVG 1.1) oder als Kopie eingefügt (SVG 2). |
Rückgabewert
newItem sein. Arbeiten Sie deshalb mit dem Rückgabewert weiter, wenn Sie die Transformation später ändern wollen.Beispiele
Verschiebung an ein Rechteck anhängen
const svg = document.querySelector('svg');
const rect = svg.querySelector('rect');
// Neue Transformation erzeugen und als Verschiebung festlegen
const translate = svg.createSVGTransform();
translate.setTranslate(50, 20);
const list = rect.transform.baseVal;
list.appendItem(translate);
console.log(list.numberOfItems);
console.log(rect.getAttribute('transform'));
Mehrere Transformationen verketten (Reihenfolge beachten)
const svg = document.querySelector('svg');
const shape = svg.querySelector('#pfeil');
const list = shape.transform.baseVal;
const rotate = svg.createSVGTransform();
rotate.setRotate(45, 0, 0);
const move = svg.createSVGTransform();
move.setTranslate(100, 0);
// Erst drehen, dann entlang der gedrehten x-Achse verschieben
list.appendItem(rotate);
list.appendItem(move);
console.log([...Array(list.numberOfItems)].map((_, i) => list.getItem(i).type));
Rückgabewert für eine Animation weiterverwenden
const svg = document.querySelector('svg');
const wheel = svg.querySelector('#rad');
// Mit dem Rückgabewert arbeiten, denn er kann eine Kopie sein
const spin = wheel.transform.baseVal.appendItem(svg.createSVGTransform());
let angle = 0;
const tick = () => {
angle = (angle + 2) % 360;
spin.setRotate(angle, 50, 50); // um den Mittelpunkt (50|50) drehen
requestAnimationFrame(tick);
};
requestAnimationFrame(tick);
// Wichtig · Fallstricke
- Nur
baseVallässt sich ändern:transform.animValist schreibgeschützt. Ein Aufruf dort löst eineDOMExceptionvom TypNoModificationAllowedErroraus. - Kopie oder Original: SVG 1.1 und SVG 2 legen unterschiedlich fest, was mit einem
newItemgeschieht, das schon in einer anderen Liste steckt. Erzeugen Sie für jede Liste am besten ein eigenes Objekt mitcreateSVGTransform()und verwenden Sie den Rückgabewert weiter. - Reihenfolge:
appendItem()hängt die Transformation rechts an. Sie wirkt damit im schon transformierten Koordinatensystem. MitinsertItemBefore(item, 0)setzen Sie eine Transformation an den Anfang. - Viele Einträge: Wenn Sie wiederholt Transformationen anhängen, wird die Liste immer länger. Mit
consolidate()fassen Sie alle Einträge zu einer einzigen Matrix zusammen. - CSS-Transformationen: Setzt CSS eine
transform-Eigenschaft, überlagert sie das Attributtransform. Änderungen überappendItem()sind dann nicht zu sehen. - Die Methode wird von allen modernen Browsern unterstützt. Eine gleichwertige
appendItem()-Methode gibt es auch beiSVGLengthList,SVGNumberListundSVGPointList.