Signatur
Beschreibung
Die schreibgeschützte Eigenschaft width gibt die Breite eines Rechtecks als Gleitkommazahl in CSS-Pixeln zurück. DOMRectReadOnly ist die Basis von DOMRect. Deshalb gibt es die Eigenschaft auf allen Rechteck-Objekten, die zum Beispiel Element.getBoundingClientRect(), Element.getClientRects(), Range.getBoundingClientRect() oder ResizeObserverEntry.contentRect zurückgeben.
Ein Rechteck wird intern durch Ursprung (x, y) und Ausdehnung (width, height) beschrieben. Die Ausdehnung darf negativ sein: Dann liegt der Ursprung auf der rechten Seite. Die abgeleiteten Eigenschaften left und right werden dagegen immer normalisiert, also left = min(x, x + width) und right = max(x, x + width).
Bei getBoundingClientRect() steht width für die Breite der sichtbaren Rahmenbox (Inhalt + Innenabstand + Rahmen), und zwar nach CSS-Transformationen. Deshalb unterscheidet sich der Wert oft von offsetWidth: offsetWidth ist ganzzahlig gerundet und ignoriert Transformationen.
Weil die Eigenschaft schreibgeschützt ist, wird eine Zuweisung im nicht-strikten Modus stillschweigend ignoriert und löst im strikten Modus einen TypeError aus. Für ein veränderbares Rechteck nimmt man DOMRect. Dort ist width beschreibbar.
Rückgabewert
double). Kann 0, negativ oder ein Bruchteil sein.Beispiele
Rechteck erzeugen und Breite auslesen
const rect = new DOMRectReadOnly(10, 20, 150, 80);
console.log(rect.width); // 150
console.log(rect.right); // 160 (x + width)
Negative Breite und normalisierte Kanten
const rect = DOMRectReadOnly.fromRect({ x: 100, y: 0, width: -40, height: 20 });
console.log(rect.width); // -40
console.log(rect.left); // 60
console.log(rect.right); // 100
// Echte Breite unabhängig vom Vorzeichen:
console.log(Math.abs(rect.width)); // 40
Gerenderte Breite eines Elements (inkl. Transformation)
const box = document.querySelector('#card');
box.style.transform = 'scale(1.5)';
const { width } = box.getBoundingClientRect();
console.log(`Gerendert: ${width}px, offsetWidth: ${box.offsetWidth}px`);
Breitenänderungen mit ResizeObserver verfolgen
const panel = document.querySelector('.panel');
const observer = new ResizeObserver((entries) => {
for (const entry of entries) {
const w = entry.contentRect.width; // DOMRectReadOnly
panel.classList.toggle('kompakt', w < 400);
console.log(`Inhaltsbreite: ${w.toFixed(1)}px`);
}
});
observer.observe(panel);
// Wichtig · Fallstricke
- Schreibgeschützt:
rect.width = 10hat beiDOMRectReadOnlykeine Wirkung. Im strikten Modus wirft die Zuweisung einenTypeError. Wer Werte ändern will, erzeugt einDOMRect. - Negative Werte: Bei selbst erzeugten Rechtecken kann
widthnegativ sein. Für die tatsächliche Ausdehnung nimmt manMath.abs(rect.width)oderrect.right - rect.left. - Box-Modell:
getBoundingClientRect().widthenthält Innenabstand und Rahmen.ResizeObserverEntry.contentRect.widthenthält nur die Inhaltsbox. - Performance: Wer
widthübergetBoundingClientRect()liest, kann ein synchrones Layout erzwingen („Layout Thrashing“). Lese- und Schreibzugriffe aufs DOM besser bündeln oderResizeObserververwenden. - Nicht sichtbare Elemente: Elemente mit
display: noneliefern die Breite0. - Kompatibilität: Wird von allen modernen Browsern unterstützt. Der Konstruktor
new DOMRectReadOnly()fehlt in alten Edge-Versionen (EdgeHTML) und im Internet Explorer. Dort liefertgetBoundingClientRect()einClientRect, das keine Eigenschaftenxundyhat.