Signatur
Beschreibung
Die Eigenschaft animVal einer SVGAnimatedTransformList gibt eine schreibgeschützte SVGTransformList zurück. Sie enthält den Wert des Transformationsattributs, nachdem laufende SMIL-Animationen wie <animateTransform> angewendet wurden. Ohne aktive Animation entspricht animVal inhaltlich dem Basiswert baseVal.
Du erreichst die Schnittstelle über diese Eigenschaften:
SVGGraphicsElement.transformfür das Attributtransform(z. B. bei<rect>,<g>oder<path>)SVGGradientElement.gradientTransformfür das AttributgradientTransformSVGPatternElement.patternTransformfür das AttributpatternTransform
Mit animVal kannst du den aktuellen Animationszustand abfragen, etwa um Kollisionen zu prüfen, Koordinaten umzurechnen oder den Fortschritt einer animateTransform-Animation zu synchronisieren. Wenn du Transformationen ändern willst, benutze immer baseVal. Jeder Schreibzugriff auf animVal löst eine NoModificationAllowedError-DOMException aus.
Rückgabewert
SVGTransform-Objekten mit dem aktuell animierten Wert des Attributs. Die Liste wird automatisch aktualisiert, sobald sich Attribut oder Animation ändern.Beispiele
Transformationen eines Elements auslesen
// <svg><rect id="box" width="50" height="50" transform="translate(20 10) rotate(45)"/></svg>
const box = document.getElementById('box');
const list = box.transform.animVal;
const typNamen = {
[SVGTransform.SVG_TRANSFORM_MATRIX]: 'matrix',
[SVGTransform.SVG_TRANSFORM_TRANSLATE]: 'translate',
[SVGTransform.SVG_TRANSFORM_SCALE]: 'scale',
[SVGTransform.SVG_TRANSFORM_ROTATE]: 'rotate'
};
for (let i = 0; i < list.numberOfItems; i++) {
const t = list.getItem(i);
console.log(typNamen[t.type], t.matrix.e, t.matrix.f, t.angle);
}
Laufende animateTransform-Animation beobachten
// <rect id="spinner" width="40" height="40">
// <animateTransform attributeName="transform" type="rotate"
// from="0 20 20" to="360 20 20" dur="2s" repeatCount="indefinite"/>
// </rect>
const spinner = document.getElementById('spinner');
const ausgabe = document.getElementById('winkel');
const aktualisieren = () => {
const anim = spinner.transform.animVal;
const basis = spinner.transform.baseVal;
const winkel = anim.numberOfItems > 0 ? anim.getItem(0).angle : 0;
ausgabe.textContent = `Winkel: ${winkel.toFixed(1)}° (Basis-Einträge: ${basis.numberOfItems})`;
requestAnimationFrame(aktualisieren);
};
requestAnimationFrame(aktualisieren);
Gesamtmatrix bestimmen, ohne die Liste zu verändern
const el = document.querySelector('#box');
const list = el.transform.animVal;
// consolidate() ist auf animVal verboten, deshalb Matrizen selbst multiplizieren
let gesamt = new DOMMatrix();
for (let i = 0; i < list.numberOfItems; i++) {
gesamt = gesamt.multiply(list.getItem(i).matrix);
}
const punkt = new DOMPoint(0, 0).matrixTransform(gesamt);
console.log(`Ursprung liegt bei (${punkt.x}, ${punkt.y})`);
Schreibzugriff schlägt fehl – baseVal verwenden
const el = document.querySelector('#box');
const svg = el.ownerSVGElement;
const skalierung = svg.createSVGTransform();
skalierung.setScale(2, 2);
try {
el.transform.animVal.appendItem(skalierung);
} catch (err) {
console.log(err.name);
}
// Richtig: Basiswert ändern
el.transform.baseVal.appendItem(skalierung);
console.log(el.getAttribute('transform'));
// Wichtig · Fallstricke
- Schreibgeschützt:
appendItem(),insertItemBefore(),replaceItem(),removeItem(),clear(),initialize()undconsolidate()lösen aufanimValeineNoModificationAllowedErroraus. Auch die enthaltenenSVGTransform-Objekte kannst du nicht verändern. - Die CSS-Eigenschaft
transformwird nicht berücksichtigt: Transformationen aus Stylesheets, CSS-Animationen oder der Web Animations API erscheinen weder inanimValnoch inbaseVal. Den tatsächlich angewendeten Wert lieferngetComputedStyle(el).transformoderel.getCTM(). - Uneinheitliche Browser: Manche Engines haben
animVallange als Spiegel vonbaseValumgesetzt, ohne SMIL-Animationen einzurechnen. Deshalb istgetCTM()für präzise Positionsberechnungen robuster. - Die Liste ist „lebend“. Eine einmal geholte Referenz spiegelt spätere Änderungen wider. Brauchst du einen festen Zustand, kopiere die Matrizen (z. B. mit
DOMMatrix.fromMatrix()). - In SVG 2 hat
SVGTransformListzusätzlichlengthals Alias fürnumberOfItems. In älteren Browsern verwendest du bessernumberOfItems.