Signatur
Beschreibung
Die Schnittstelle SVGAnimatedLengthList wird für SVG-Attribute verwendet, die eine Liste von Längenangaben enthalten und über SMIL (<animate>) animiert werden können. Typisch sind die Attribute x, y, dx und dy der Elemente <text> und <tspan>. Dort kann man jedem einzelnen Zeichen eine eigene Position zuweisen, etwa x="10 20 30".
Die Schnittstelle hat zwei schreibgeschützte Eigenschaften, die jeweils ein SVGLengthList-Objekt liefern:
baseVal: der Basiswert des Attributs, also der Wert, der im Markup steht bzw. per Skript gesetzt wurde. Diese Liste kannst du ändern, zum Beispiel mitappendItem(),replaceItem()oderclear(). Jede Änderung wird sofort in das Attribut zurückgeschrieben.animVal: der aktuelle animierte Wert. Er ist nur lesbar. Läuft keine Animation, enthält er dieselben Werte wiebaseVal.
Die Schnittstelle bietet sich an, wenn du Zeichenpositionen typsicher lesen oder ändern willst, ohne Attribut-Strings selbst zu zerlegen. Für einfache Fälle reicht meist setAttribute(). Die Listen-API hat dagegen den Vorteil, dass sie Einheiten (SVGLength.unitType) und Umrechnungen (convertToSpecifiedUnits()) direkt mitbringt.
Rückgabewert
SVGTextPositioningElement.x, .y, .dx und .dy zurückgegeben. Enthält baseVal und animVal, beide vom Typ SVGLengthList.Beispiele
Instanz abrufen und Basiswerte auslesen
document.body.insertAdjacentHTML('beforeend', `
<svg width="200" height="50">
<text id="label" x="10 25 40" y="30">ABC</text>
</svg>`);
const text = document.getElementById('label');
const xList = text.x; // SVGAnimatedLengthList
console.log(xList instanceof SVGAnimatedLengthList);
console.log(xList.baseVal.numberOfItems);
const werte = Array.from({ length: xList.baseVal.numberOfItems },
(_, i) => xList.baseVal.getItem(i).value);
console.log(werte);
Zeichenpositionen per baseVal verändern
const svg = document.querySelector('svg');
const text = svg.querySelector('text');
const liste = text.x.baseVal;
liste.clear();
// Jedes Zeichen 20 Einheiten weiter rechts platzieren
[...text.textContent].forEach((_, i) => {
const len = svg.createSVGLength();
len.value = 10 + i * 20;
liste.appendItem(len);
});
console.log(text.getAttribute('x'));
animVal während einer SMIL-Animation lesen
document.body.insertAdjacentHTML('beforeend', `
<svg width="300" height="50">
<text id="wander" x="10" y="30">Hallo
<animate attributeName="x" from="10" to="200" dur="2s" fill="freeze" />
</text>
</svg>`);
const t = document.getElementById('wander');
setTimeout(() => {
console.log('Basis:', t.x.baseVal.getItem(0).value);
console.log('Animiert:', t.x.animVal.getItem(0).value);
}, 1000);
// Wichtig · Fallstricke
animValist nur lesbar: Wer versucht,animValzu ändern, löst eineNoModificationAllowedError-DOMExceptionaus. Änderungen gehören immer anbaseVal.- Getrennte Objekte:
baseValundanimValsind verschiedene Objekte. Manche Browser liefern füranimValwährend einer Animation keine zuverlässigen Zwischenwerte, sondern einfach denselben Wert wiebaseVal. - Live-Listen:
SVGLengthListist „live“. Wird einSVGLengtheingefügt, das schon zu einer anderen Liste gehört, wird es kopiert und nicht verschoben. Neue Längen legst du mitSVGSVGElement.createSVGLength()an. - Keine Array-Methoden: Die Liste ist kein Array. Nutze
getItem()undnumberOfItems. Moderne Browser erlauben zusätzlich Index-Zugriff undlength, sehr alte Engines dagegen nicht. - Kompatibilität: Die Schnittstelle wird von allen aktuellen Browsern unterstützt. SMIL-Animationen funktionieren in Chromium, Firefox und Safari. Der alte Internet Explorer unterstützt SMIL nicht, dort bleibt
animValimmer gleichbaseVal.