Signatur
Beschreibung
Die schreibgeschützte Eigenschaft dy der Schnittstelle SVGTextPositioningElement bildet das SVG-Attribut dy von <text>- und <tspan>-Elementen ab. Anders als y legt dy keine absolute Position fest, sondern eine relative Verschiebung entlang der y-Achse gegenüber der aktuellen Textposition. Jeder Wert der Liste gilt für ein Zeichen: Der erste Wert verschiebt das erste Zeichen, der zweite das zweite usw. Hat die Liste weniger Einträge als Zeichen vorhanden sind, werden die restlichen Zeichen nicht zusätzlich verschoben.
Der Rückgabewert ist ein SVGAnimatedLengthList-Objekt mit zwei Listen vom Typ SVGLengthList:
baseVal– der Grundwert aus dem Attribut; änderbar, Änderungen werden sofort ins DOM zurückgeschrieben.animVal– der aktuell animierte Wert (z. B. durch SMIL-<animate>); schreibgeschützt.
Typische Einsatzzwecke sind hoch- und tiefgestellte Textteile, Wellen- oder Treppeneffekte pro Buchstabe sowie Zeilenumbrüche in SVG-Text über mehrere <tspan>-Elemente mit dy="1.2em". Die Eigenschaft selbst kann nicht neu zugewiesen werden – verändert wird stattdessen der Inhalt von baseVal über Methoden wie appendItem(), clear() oder replaceItem(), oder alternativ direkt per setAttribute("dy", …).
Rückgabewert
baseVal (änderbare SVGLengthList) und animVal (schreibgeschützte, animierte SVGLengthList). Ist kein dy-Attribut gesetzt, sind beide Listen leer (numberOfItems === 0).Beispiele
dy-Werte eines Textes auslesen
// <svg id="bild" width="300" height="100">
// <text id="welle" x="10" y="50" dy="0 -5 5 -5 5">Hallo</text>
// </svg>
const text = document.getElementById("welle");
const liste = text.dy.baseVal;
console.log(liste.numberOfItems);
for (let i = 0; i < liste.numberOfItems; i++) {
const laenge = liste.getItem(i);
console.log(`Zeichen ${i}: ${laenge.valueAsString}`);
}
Wellen-Effekt pro Buchstabe per Skript erzeugen
const svg = document.getElementById("bild");
const text = document.getElementById("welle");
const liste = text.dy.baseVal;
liste.clear();
const zeichen = text.textContent.length;
for (let i = 0; i < zeichen; i++) {
const laenge = svg.createSVGLength();
// Sinuswelle: abwechselnd nach oben und unten verschieben
laenge.value = i === 0 ? 0 : Math.round(Math.sin(i) * 6);
liste.appendItem(laenge);
}
console.log(text.getAttribute("dy"));
Hochgestellten Text mit tspan und em-Einheit
// <text id="formel" x="10" y="40">E = mc<tspan id="hoch">2</tspan></text>
const svg = document.querySelector("svg");
const hoch = document.getElementById("hoch");
const verschiebung = svg.createSVGLength();
verschiebung.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_EMS, -0.5);
hoch.dy.baseVal.initialize(verschiebung);
hoch.setAttribute("font-size", "0.7em");
console.log(hoch.dy.baseVal.getItem(0).valueAsString);
// Wichtig · Fallstricke
- Relativ, nicht absolut:
dyverschiebt gegenüber der aktuellen Textposition und wirkt kumulativ – eine Verschiebung bleibt für alle folgenden Zeichen bestehen. Für absolute Positionenyverwenden. - Die Eigenschaft selbst ist schreibgeschützt:
text.dy = …hat keine Wirkung (bzw. wirft im strikten Modus einenTypeError). Änderungen erfolgen überdy.baseValodersetAttribute(). animValkann nicht verändert werden; Schreibversuche lösen eineNoModificationAllowedError-DOMExceptionaus.SVGLength-Objekte werden überSVGSVGElement.createSVGLength()erzeugt, nicht pernew SVGLength().- Ein
SVGLength-Objekt, das bereits in einer anderen Liste steckt, wird vonappendItem()/initialize()kopiert bzw. dort entfernt – je nach Browser leicht unterschiedlich. Sicherer ist es, für jede Liste neue Objekte anzulegen. - Relative Einheiten wie
emoder%liefern beivalueden in Benutzereinheiten umgerechneten Wert; der Rohwert steht invalueInSpecifiedUnits. - Kompatibilität: In allen modernen Browsern seit Langem verfügbar (SVG 1.1). SMIL-Animationen, die
animValbefüllen, werden ebenfalls breit unterstützt.