Signatur
Beschreibung
SVGLengthList steht für eine geordnete Liste von Längenangaben (SVGLength). Man bekommt sie nicht per Konstruktor, sondern über die Eigenschaften baseVal und animVal eines SVGAnimatedLengthList-Objekts. Solche Objekte liefern zum Beispiel SVGTextPositioningElement.x, .y, .dx und .dy der Elemente <text> und <tspan>.
Die Liste hat eine eigene, an SVG angelehnte API:
- Eigenschaften:
lengthundnumberOfItems(beide geben die Anzahl der Einträge an). - Methoden:
clear(),initialize(newItem),getItem(index),insertItemBefore(newItem, index),replaceItem(newItem, index),removeItem(index)undappendItem(newItem). - Indexzugriff: In modernen Browsern geht auch
list[index].
Die Liste ist live: Änderungen an baseVal schreiben sich sofort in das zugehörige Attribut zurück, und Änderungen am Attribut sieht man sofort in der Liste. Deshalb eignet sich die Schnittstelle gut, um Glyphen einzeln zu positionieren, ohne Attribut-Strings selbst zusammenzubauen oder zu zerlegen. Neue Einträge erzeugt man mit SVGSVGElement.prototype.createSVGLength().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $newItem Pflicht | SVGLength | Wird von initialize(), appendItem(), insertItemBefore() und replaceItem() erwartet. Diesen Eintrag erzeugt man mit svg.createSVGLength(). |
|
| $index Pflicht | number | Wird von getItem(), insertItemBefore(), replaceItem() und removeItem() erwartet. Die Zählung beginnt bei 0. Ist der Index bei insertItemBefore() größer als die Liste, wird der Eintrag am Ende angehängt. |
Rückgabewert
getItem(), appendItem(), insertItemBefore(), replaceItem(), removeItem() und initialize() geben jeweils den betroffenen SVGLength-Eintrag zurück. clear() gibt undefined zurück.Beispiele
x-Positionen eines Textes auslesen
// HTML: <svg id="grafik"><text id="t" x="10 25 40" y="50">ABC</text></svg>
const text = document.querySelector('#t');
const liste = text.x.baseVal; // SVGLengthList
console.log(liste.numberOfItems);
for (let i = 0; i < liste.numberOfItems; i++) {
console.log(`Zeichen ${i}: ${liste.getItem(i).value}px`);
}
Neue Position anhängen und Eintrag ersetzen
const svg = document.querySelector('#grafik');
const text = document.querySelector('#t');
const liste = text.x.baseVal;
// Neue Länge in Pixeln erzeugen
const neu = svg.createSVGLength();
neu.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PX, 55);
liste.appendItem(neu);
// Den ersten Eintrag durch eine Angabe in em ersetzen
const start = svg.createSVGLength();
start.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_EMS, 1);
liste.replaceItem(start, 0);
console.log(text.getAttribute('x'));
Buchstaben gleichmäßig verteilen
const verteilen = (svg, text, startX, abstand) => {
const liste = text.x.baseVal;
liste.clear();
[...text.textContent].forEach((_, i) => {
const len = svg.createSVGLength();
len.value = startX + i * abstand; // Einheit: Benutzereinheiten
liste.appendItem(len);
});
return liste.length;
};
const anzahl = verteilen(
document.querySelector('#grafik'),
document.querySelector('#t'),
10,
20
);
console.log(anzahl, document.querySelector('#t').getAttribute('x'));
animVal ist schreibgeschützt
const text = document.querySelector('#t');
try {
text.x.animVal.clear();
} catch (err) {
console.log(err.name);
}
// Wichtig · Fallstricke
- Schreibschutz: Die Liste aus
animValist nur lesbar. Jede Änderung wirft einenNoModificationAllowedError. Ändern Sie immerbaseVal. - Ungültiger Index:
getItem(),replaceItem()undremoveItem()werfen einenIndexSizeError, wenn der Index nicht in der Liste liegt. - Einträge wiederverwenden: Ob ein
SVGLengthin die Liste kopiert oder aus einer anderen Liste herausgelöst wird, war in SVG 1.1 und SVG 2 unterschiedlich geregelt. Erzeugen Sie für jeden Eintrag am besten ein eigenes Objekt mitcreateSVGLength(), damit sich das Verhalten in allen Browsern gleicht. - Relative Einheiten: Bei
%oderemhängtvaluevom Kontext ab, zum Beispiel vom Viewport oder von der Schriftgröße. Das Element muss dafür im Dokument hängen. - Kompatibilität: Die Methoden gibt es in allen aktuellen Browsern. Den Indexzugriff
list[i]und die Eigenschaftlengthhat erst SVG 2 eingeführt. Für sehr alte Browser istgetItem()undnumberOfItemsder sichere Weg. - Keine Array-Methoden: Die Liste ist kein Array. Methoden wie
mapundforEachfehlen. Bei Bedarf wandeln Sie sie mitArray.from({ length: l.numberOfItems }, (_, i) => l.getItem(i))um.