Signatur
Beschreibung
SVGCircleElement ist die DOM-Schnittstelle für das SVG-Element <circle>. Sie erbt von SVGGeometryElement (und damit von SVGGraphicsElement, SVGElement, Element und EventTarget). Deshalb stehen Geometrie-Methoden wie getTotalLength(), getPointAtLength(), isPointInFill() und getBBox() direkt zur Verfügung.
Die Schnittstelle selbst definiert drei schreibgeschützte Eigenschaften vom Typ SVGAnimatedLength:
cx: x-Koordinate des Mittelpunktscy: y-Koordinate des Mittelpunktsr: Radius
Jede dieser Eigenschaften hat einen baseVal (den gesetzten Basiswert, also schreibbar) und einen animVal (den aktuellen Wert während einer SMIL-Animation, nur lesbar). Den numerischen Wert in Benutzereinheiten erhältst du über circle.r.baseVal.value.
Du brauchst die Schnittstelle, wenn du Kreise per JavaScript erzeugst, animierst oder vermisst, etwa für Diagramme, Fortschrittsringe, Datenpunkte in Scatterplots oder interaktive Grafiken. Neue Kreise werden immer mit document.createElementNS("http://www.w3.org/2000/svg", "circle") angelegt. Einen öffentlichen Konstruktor gibt es nicht.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $cx | SVGAnimatedLength | 0 | Schreibgeschützte Eigenschaft: x-Koordinate des Mittelpunkts. Wert über cx.baseVal.value lesen oder setzen. |
| $cy | SVGAnimatedLength | 0 | Schreibgeschützte Eigenschaft: y-Koordinate des Mittelpunkts. |
| $r | SVGAnimatedLength | 0 | Schreibgeschützte Eigenschaft: Radius. Bei 0 wird nichts gezeichnet, negative Werte sind ein Fehler. |
Rückgabewert
document.createElementNS(SVG_NS, "circle") oder von DOM-Abfragen wie querySelector("circle") zurückgegeben.Beispiele
Kreis per JavaScript erzeugen
const SVG_NS = "http://www.w3.org/2000/svg";
const svg = document.createElementNS(SVG_NS, "svg");
svg.setAttribute("width", "200");
svg.setAttribute("height", "200");
const circle = document.createElementNS(SVG_NS, "circle");
circle.setAttribute("cx", "100");
circle.setAttribute("cy", "100");
circle.setAttribute("r", "50");
circle.setAttribute("fill", "tomato");
svg.append(circle);
document.body.append(svg);
console.log(circle instanceof SVGCircleElement);
console.log(circle.r.baseVal.value);
Radius über baseVal ändern und Umfang messen
const circle = document.querySelector("circle");
// Radius direkt über die DOM-Schnittstelle setzen
circle.r.baseVal.value = 40;
console.log(circle.getAttribute("r"));
// getTotalLength() stammt aus SVGGeometryElement
console.log(circle.getTotalLength().toFixed(2));
Fortschrittsring mit stroke-dasharray
const SVG_NS = "http://www.w3.org/2000/svg";
const ring = document.createElementNS(SVG_NS, "circle");
Object.entries({ cx: 60, cy: 60, r: 50, fill: "none", stroke: "steelblue", "stroke-width": 10 })
.forEach(([k, v]) => ring.setAttribute(k, v));
const svg = document.createElementNS(SVG_NS, "svg");
svg.setAttribute("viewBox", "0 0 120 120");
svg.append(ring);
document.body.append(svg);
const setProgress = (percent) => {
const circumference = 2 * Math.PI * ring.r.baseVal.value;
ring.style.strokeDasharray = `${circumference}`;
ring.style.strokeDashoffset = `${circumference * (1 - percent / 100)}`;
};
setProgress(75);
console.log(ring.style.strokeDashoffset);
Klick-Prüfung mit isPointInFill
const circle = document.querySelector("circle");
const svg = circle.ownerSVGElement;
const point = svg.createSVGPoint();
point.x = 100;
point.y = 100;
// Liegt der Punkt (in Benutzerkoordinaten) im Kreis?
console.log(circle.isPointInFill(point));
// Wichtig · Fallstricke
- Namensraum:
document.createElement(\"circle\")erzeugt einHTMLUnknownElement, das nicht gezeichnet wird. Nimm immercreateElementNSmithttp://www.w3.org/2000/svg. - Nur lesbar:
circle.r = 10hat keine Wirkung (im Strict Mode gibt es einenTypeError). Setze stattdessencircle.r.baseVal.valueoder nutzesetAttribute(\"r\", ...). - Einheiten: Wenn ein Wert in Prozent oder
emangegeben ist, liefertbaseVal.valueBenutzereinheiten. Die Originalangabe steht inbaseVal.valueAsString. Prozentangaben fürrbeziehen sich auf die normierte Diagonale des Viewports. - CSS-Geometrie: In modernen Browsern (SVG 2) lassen sich
cx,cyundrauch als CSS-Eigenschaften setzen und per CSS animieren.animValspiegelt aber nur SMIL-Animationen wider, keine CSS-Animationen. - Kompatibilität: Die Schnittstelle wird in allen Browsern unterstützt.
isPointInFill()undisPointInStroke()sind neuer, sie sind seit etwa 2019/2020 in allen großen Browsern verfügbar. - Performance: Tausende einzelne
<circle>-Knoten belasten das DOM. Bei sehr vielen Datenpunkten ist Canvas meist die bessere Wahl.