Signatur
Beschreibung
Das Interface SVGEllipseElement steht für jedes <ellipse>-Element in einem SVG-Dokument. Die Vererbungskette lautet SVGGeometryElement → SVGGraphicsElement → SVGElement → Element. Dadurch stehen neben den ellipsen-spezifischen Eigenschaften auch Geometrie-Methoden wie getTotalLength(), getPointAtLength(), isPointInFill() und getBBox() zur Verfügung.
Das Interface bietet vier schreibgeschützte Eigenschaften vom Typ SVGAnimatedLength:
cx– x-Koordinate des Mittelpunktscy– y-Koordinate des Mittelpunktsrx– horizontaler Radiusry– vertikaler Radius
Jede dieser Eigenschaften hat einen baseVal (den im Attribut gesetzten Wert, veränderbar) und einen animVal (den aktuellen Wert unter SMIL-Animation, nur lesbar). Über el.rx.baseVal.value = 40 lässt sich der Radius direkt als Zahl setzen, ohne Strings zusammenzubauen.
Einsetzen lässt sich das Interface vor allem für interaktive Grafiken, Datenvisualisierungen und Animationen, bei denen Ellipsen per Skript erzeugt, verschoben oder in der Größe verändert werden. Neue Elemente müssen dabei mit document.createElementNS() im SVG-Namensraum angelegt werden.
Rückgabewert
<ellipse> im Markup oder per document.createElementNS("http://www.w3.org/2000/svg", "ellipse"). Einen eigenen Konstruktor gibt es nicht.Beispiele
Ellipse per Skript erzeugen
const SVG_NS = 'http://www.w3.org/2000/svg';
const svg = document.createElementNS(SVG_NS, 'svg');
svg.setAttribute('width', '200');
svg.setAttribute('height', '120');
const ellipse = document.createElementNS(SVG_NS, 'ellipse');
ellipse.setAttribute('cx', '100');
ellipse.setAttribute('cy', '60');
ellipse.setAttribute('rx', '80');
ellipse.setAttribute('ry', '40');
ellipse.setAttribute('fill', 'steelblue');
svg.append(ellipse);
document.body.append(svg);
console.log(ellipse instanceof SVGEllipseElement);
console.log(ellipse.rx.baseVal.value);
Radien über baseVal ändern (Hover-Effekt)
// <svg><ellipse id="e" cx="100" cy="60" rx="50" ry="30" fill="tomato"/></svg>
const el = document.querySelector('#e');
el.addEventListener('mouseenter', () => {
el.rx.baseVal.value = 70;
el.ry.baseVal.value = 45;
});
el.addEventListener('mouseleave', () => {
el.rx.baseVal.value = 50;
el.ry.baseVal.value = 30;
});
console.log(el.getAttribute('rx')); // Attribut wird synchronisiert
Umfang und Treffertest mit Geometrie-Methoden
const el = document.querySelector('ellipse');
// Näherungsweiser Umfang der Ellipse
console.log(el.getTotalLength().toFixed(1));
// Liegt der Mittelpunkt in der Füllfläche?
const svg = el.ownerSVGElement;
const pt = svg.createSVGPoint();
pt.x = el.cx.baseVal.value;
pt.y = el.cy.baseVal.value;
console.log(el.isPointInFill(pt));
// Bounding Box
const { x, y, width, height } = el.getBBox();
console.log(x, y, width, height);
Ellipse animieren mit requestAnimationFrame
const el = document.querySelector('ellipse');
const start = performance.now();
const tick = (now) => {
const t = (now - start) / 1000;
// Pulsieren zwischen 20 und 60
el.rx.baseVal.value = 40 + 20 * Math.sin(t * 2);
el.ry.baseVal.value = 40 - 20 * Math.sin(t * 2);
requestAnimationFrame(tick);
};
requestAnimationFrame(tick);
// Wichtig · Fallstricke
- Namensraum beachten:
document.createElement('ellipse')erzeugt ein wirkungslosesHTMLUnknownElement. Richtig istcreateElementNS('http://www.w3.org/2000/svg', 'ellipse'). - Keine direkte Zuweisung:
el.rx = 40bewirkt nichts, weilrxein schreibgeschütztesSVGAnimatedLength-Objekt ist. Stattdessenel.rx.baseVal.valuesetzen odersetAttribute()verwenden. animValvs.baseVal: Während einer SMIL-Animation liefert nuranimValden sichtbaren Wert. CSS-Animationen vonrx/ry(seit SVG 2 als Geometrie-Eigenschaften erlaubt) spiegeln sich dagegen nicht inanimValwider. DafürgetComputedStyle()nutzen.auto-Werte: Laut SVG 2 übernimmtrxbzw.rybeiautooder fehlendem Wert den jeweils anderen Radius. Ältere Browser setzen das nicht einheitlich um. Beide Radien sollte man deshalb immer ausdrücklich angeben.- Prozentwerte beziehen sich auf den Viewport (
rxauf die Breite,ryauf die Höhe).baseVal.valuegibt immer Benutzereinheiten zurück, der Einheitentyp steht inbaseVal.unitType. getTotalLength()ist bei Ellipsen nur eine Näherung und kann je nach Browser leicht abweichen.- Browser-Kompatibilität: Das Interface wird von allen modernen Browsern unterstützt.
isPointInFill()/isPointInStroke()aufSVGGeometryElementsind erst seit etwa 2018–2020 flächendeckend verfügbar.