Signatur
Beschreibung
Die Eigenschaft animVal der Schnittstelle SVGAnimatedLengthList gibt eine SVGLengthList zurück. Diese Liste enthält den aktuellen, gegebenenfalls animierten Wert eines SVG-Attributs, das eine Liste von Längen (<length>, <percentage> oder <number>) akzeptiert. Typische Beispiele sind die Attribute x, y, dx und dy von <text>- und <tspan>-Elementen, mit denen einzelne Zeichen positioniert werden.
Im Unterschied zu baseVal, das den im Markup bzw. per Skript gesetzten Grundwert enthält, spiegelt animVal den Wert wider, der sich durch eine laufende SMIL-Animation (z. B. <animate>) ergibt. Läuft keine Animation, sind animVal und baseVal inhaltlich identisch.
Sowohl die Eigenschaft selbst als auch die zurückgegebene Liste sind schreibgeschützt: Du kannst die Einträge nur lesen (über numberOfItems, length und getItem()), aber nicht verändern. Änderungen nimmst du immer über baseVal vor.
Nützlich ist animVal vor allem, wenn du in einem Skript den tatsächlich dargestellten Zustand einer animierten Textposition abfragen möchtest, etwa um andere Elemente daran auszurichten oder für Debugging-Zwecke.
Rückgabewert
SVGLengthList mit SVGLength-Objekten, die den aktuellen (animierten) Wert des Attributs darstellen.Beispiele
Zeichenpositionen eines Textes auslesen
const svgNS = 'http://www.w3.org/2000/svg';
const svg = document.createElementNS(svgNS, 'svg');
const text = document.createElementNS(svgNS, 'text');
text.setAttribute('x', '10 25 40');
text.setAttribute('y', '50');
text.textContent = 'ABC';
svg.append(text);
document.body.append(svg);
const list = text.x.animVal;
console.log(list.numberOfItems);
for (let i = 0; i < list.numberOfItems; i++) {
console.log(`Zeichen ${i}: x = ${list.getItem(i).value}`);
}
animVal und baseVal während einer SMIL-Animation vergleichen
// HTML:
// <svg width="300" height="100">
// <text id="label" x="10" y="50">Hallo
// <animate attributeName="x" from="10" to="200" dur="4s" repeatCount="indefinite" />
// </text>
// </svg>
const label = document.getElementById('label');
setInterval(() => {
const basis = label.x.baseVal.getItem(0).value;
const animiert = label.x.animVal.numberOfItems
? label.x.animVal.getItem(0).value
: basis;
console.log(`baseVal: ${basis}, animVal: ${animiert.toFixed(1)}`);
}, 1000);
Schreibversuch auf animVal abfangen
const text = document.querySelector('text');
try {
text.x.animVal.clear();
} catch (err) {
console.log(err.name);
}
// Richtig: Änderungen immer über baseVal
text.x.baseVal.getItem(0).value = 30;
console.log(text.getAttribute('x'));
// Wichtig · Fallstricke
- Schreibschutz: Methoden wie
clear(),appendItem()oder das Setzen vonSVGLength.valueauf Einträgen vonanimValwerfen eineDOMExceptionvom TypNoModificationAllowedError. Nutze stattdessenbaseVal. - Browser-Unterschiede: Nicht alle Engines aktualisieren
animValzuverlässig während SMIL-Animationen – in manchen Browsern liefertanimValdenselben Wert wiebaseVal. Für robuste Messungen der tatsächlichen Position kanngetStartPositionOfChar()odergetBBox()sinnvoller sein. - CSS-Animationen:
animValberücksichtigt nur SMIL-Animationen, keine CSS-Transitions oder Web-Animations-API-Effekte auf Transformationen. - Leere Liste: Ist das Attribut nicht gesetzt, ist
numberOfItemsgleich0; ein Aufruf vongetItem(0)wirft dann einenIndexSizeError. - Die Liste ist „live“: Eine einmal gespeicherte Referenz spiegelt spätere Änderungen wider.