Signatur
Beschreibung
Die Eigenschaft ry eines SVGEllipseElement entspricht dem Attribut ry eines <ellipse>-Elements, also dem vertikalen Radius. Sie gibt keine einfache Zahl zurück, sondern ein SVGAnimatedLength-Objekt mit zwei Unterobjekten: baseVal (der im Attribut bzw. per Skript gesetzte Grundwert) und animVal (der aktuelle Wert, auch während einer SMIL-Animation).
Die Eigenschaft selbst ist schreibgeschützt. Das zurückgegebene SVGAnimatedLength gehört aber fest zum Element: Änderst du ry.baseVal.value oder rufst du ry.baseVal.newValueSpecifiedUnits() auf, wird das Attribut ry sofort aktualisiert und die Ellipse neu gezeichnet.
Nützlich ist das, wenn du Geometrie per Skript auslesen oder ändern willst, ohne Attribut-Strings mit getAttribute() selbst zu parsen. Das gilt z. B. für Animationen mit requestAnimationFrame, interaktive Diagramme oder Kollisionsberechnungen. Über baseVal.unitType und valueInSpecifiedUnits kommst du außerdem an die ursprüngliche Einheit (z. B. % oder em).
Rückgabewert
baseVal und animVal (jeweils SVGLength). baseVal.value enthält den vertikalen Radius in Benutzereinheiten (User Units).Beispiele
Vertikalen Radius auslesen
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
const ellipse = document.createElementNS('http://www.w3.org/2000/svg', 'ellipse');
ellipse.setAttribute('cx', '100');
ellipse.setAttribute('cy', '50');
ellipse.setAttribute('rx', '80');
ellipse.setAttribute('ry', '40');
svg.append(ellipse);
document.body.append(svg);
console.log(ellipse.ry.baseVal.value);
console.log(ellipse.ry.animVal.value);
Radius per Skript ändern (Attribut wird synchronisiert)
const ellipse = document.querySelector('ellipse');
// Neuen Radius in Benutzereinheiten setzen
ellipse.ry.baseVal.value = 25;
console.log(ellipse.getAttribute('ry'));
// Mit expliziter Einheit setzen (Prozent)
ellipse.ry.baseVal.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PERCENTAGE, 10);
console.log(ellipse.getAttribute('ry'));
"Atmende" Ellipse mit requestAnimationFrame
const ellipse = document.querySelector('ellipse');
const baseRy = ellipse.ry.baseVal.value;
const tick = (time) => {
// Radius schwingt um ±10 Einheiten
ellipse.ry.baseVal.value = baseRy + Math.sin(time / 300) * 10;
requestAnimationFrame(tick);
};
requestAnimationFrame(tick);
Flächeninhalt aus rx und ry berechnen
const ellipse = document.querySelector('ellipse');
const rx = ellipse.rx.baseVal.value;
const ry = ellipse.ry.baseVal.value;
const area = Math.PI * rx * ry;
console.log(`Fläche: ${area.toFixed(2)}`);
// Wichtig · Fallstricke
- Nicht direkt zuweisen:
ellipse.ry = 30hat keine Wirkung (im Strict Mode gibt es einenTypeError). Setze stattdessenellipse.ry.baseVal.valueoder nutzesetAttribute('ry', …). animValist schreibgeschützt: Wenn duanimVal.valuesetzt, wird ein Fehler ausgelöst. Schreiben kannst du nur überbaseVal.- CSS-Eigenschaft
ry: In SVG 2 istryeine Geometrie-Eigenschaft und lässt sich deshalb auch per CSS setzen.ry.baseValgibt nur den Attributwert wieder, nicht den per CSS berechneten Wert. Den bekommst du übergetComputedStyle(ellipse).ry. autound fehlende Werte: In SVG 2 übernimmtry="auto"den Wert vonrx. Fehlt das Attribut, liefertbaseVal.valueje nach Browser0. Ist der Radius0, wird die Ellipse nicht gezeichnet. Negative Werte sind ungültig.- Relative Einheiten: Bei Prozentwerten bezieht sich
baseVal.valueauf die Höhe des Viewports. Das Element muss dafür im Dokument eingehängt sein, sonst kann die Umrechnung fehlschlagen oder falsche Werte liefern. - Kompatibilität: Wird von allen modernen Browsern seit Langem unterstützt. Das Verhalten bei
autound die CSS-Geometrie-Eigenschaften können zwischen den Browsern leicht abweichen.