Signatur
Beschreibung
Die Eigenschaft width von SVGRectElement gibt das Attribut width eines <rect>-Elements als SVGAnimatedLength zurück. Die Eigenschaft selbst ist schreibgeschützt. Das zurückgegebene Objekt enthält aber zwei SVGLength-Werte: baseVal (der im Markup oder per Skript gesetzte Wert, veränderbar) und animVal (der aktuelle Wert während einer SMIL-Animation, nur lesbar).
Über baseVal.value erhältst du die Breite in Benutzereinheiten (User Units). baseVal.valueInSpecifiedUnits und baseVal.unitType geben dir den Wert in der ursprünglich angegebenen Einheit, zum Beispiel % oder em. Mit baseVal.newValueSpecifiedUnits() oder convertToSpecifiedUnits() kannst du Einheiten gezielt setzen oder umrechnen.
Typische Einsatzfälle sind interaktive Diagramme, Balkengrafiken, Fortschrittsbalken oder Editoren, bei denen du Rechteckbreiten typsicher auslesen und ändern willst, ohne Attribut-Strings selbst zu zerlegen. Seit SVG 2 ist width auch eine CSS-Geometrie-Eigenschaft. Ein per CSS gesetzter Wert hat daher Vorrang vor dem Attribut.
Rückgabewert
baseVal (veränderbares SVGLength) und animVal (nur lesbares SVGLength mit dem aktuell animierten Wert).Beispiele
Breite eines Rechtecks auslesen
const svgNS = 'http://www.w3.org/2000/svg';
const svg = document.createElementNS(svgNS, 'svg');
const rect = document.createElementNS(svgNS, 'rect');
rect.setAttribute('width', '120');
rect.setAttribute('height', '40');
svg.append(rect);
document.body.append(svg);
console.log(rect.width.baseVal.value); // Wert in Benutzereinheiten
console.log(rect.width.animVal.value); // aktueller (animierter) Wert
console.log(rect.width instanceof SVGAnimatedLength);
Fortschrittsbalken per baseVal aktualisieren
// <svg width="200" height="20"><rect id="bar" width="0" height="20" fill="teal"/></svg>
const bar = document.querySelector('#bar');
const maxWidth = 200;
const setProgress = (percent) => {
const clamped = Math.min(100, Math.max(0, percent));
bar.width.baseVal.value = (maxWidth * clamped) / 100;
};
setProgress(65);
console.log(bar.getAttribute('width'));
Mit Einheiten arbeiten
const rect = document.querySelector('rect');
const len = rect.width.baseVal;
// Breite auf 50 % setzen
len.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PERCENTAGE, 50);
console.log(len.valueAsString); // "50%"
console.log(len.unitType === SVGLength.SVG_LENGTHTYPE_PERCENTAGE);
// In Pixel/Benutzereinheiten umrechnen (hängt vom Viewport ab)
len.convertToSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PX);
console.log(len.valueAsString);
// Wichtig · Fallstricke
- Nicht direkt zuweisen:
rect.width = 100bewirkt nichts (im Strict-Modus gibt es einenTypeError). Setze stattdessenrect.width.baseVal.valueoder nutzesetAttribute('width', …). - animVal ist nur lesbar: Ein Schreibversuch auf
animValwirft einenNoModificationAllowedError. - CSS hat Vorrang: Wird
widthper CSS gesetzt (SVG 2), spiegeltbaseValweiterhin nur das Attribut wider. Die tatsächlich dargestellte Größe liefertgetBBox()odergetComputedStyle(). - Relative Einheiten: Prozent- oder
em-Werte lassen sich nur umrechnen, wenn das Element im Dokument hängt und einen Viewport hat. Andernfalls kannvalue0sein oder eine Ausnahme auftreten. - Negative Breiten sind ein Fehler, das Rechteck wird dann nicht gezeichnet. Bei
0wird es ebenfalls nicht gerendert. - Kompatibilität: Wird von allen modernen Browsern unterstützt. SMIL-Animationen (
animVal≠baseVal) funktionieren in Chromium, Firefox und Safari.