Start · Sprachen · JavaScript · Referenz · DOMRectList

DOMRectList

Schnittstelle

Array-ähnliche Sammlung von <code>DOMRect</code>-Objekten, wie sie z. B. <code>Element.getClientRects()</code> und <code>Range.getClientRects()</code> zurückgeben.

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

interface DOMRectList

Beschreibung

DOMRectList ist eine schreibgeschützte, array-ähnliche Sammlung von DOMRect-Objekten. Sie begegnet dir vor allem als Rückgabewert von Element.prototype.getClientRects() und Range.prototype.getClientRects(). Jedes enthaltene Rechteck beschreibt eine CSS-Box (bzw. ein Box-Fragment) relativ zum Viewport.

Wichtig wird das bei Inline-Elementen, die über mehrere Zeilen umbrechen: Während getBoundingClientRect() nur ein einziges umschließendes Rechteck liefert, bekommst du über getClientRects() für jede Zeile ein eigenes Rechteck. Damit lassen sich z. B. Textmarkierungen, Tooltips an der richtigen Zeile oder eigene Hervorhebungen exakt positionieren.

Die Schnittstelle bietet nur die Eigenschaft length und die Methode item(index); zusätzlich ist ein Indexzugriff per list[i] möglich. DOMRectList ist iterierbar, du kannst sie also mit for...of, Spread-Syntax oder Array.from() verarbeiten.

Die Liste ist ein statischer Schnappschuss: Sie aktualisiert sich nicht, wenn sich Layout, Scrollposition oder Inhalt später ändern. Frag die Rechtecke bei Bedarf einfach neu ab.

Parameter

Name Typ Default Beschreibung
$length number Schreibgeschützte Eigenschaft: Anzahl der enthaltenen DOMRect-Objekte.
$item(index) (index: number) => DOMRect | null Methode: gibt das DOMRect an Position index zurück, oder null, wenn der Index außerhalb des gültigen Bereichs liegt.
$[index] DOMRect | undefined Indexzugriff wie bei Arrays; liefert bei ungültigem Index undefined (nicht null).

Rückgabewert

Typ
DOMRectList
Beschreibung
Eine schreibgeschützte, iterierbare Sammlung von DOMRect-Objekten (Koordinaten relativ zum Viewport, in CSS-Pixeln).

Beispiele

Rechtecke eines umbrechenden Inline-Elements auslesen

// <p style="width:150px">Text mit <span id="hl">einem längeren hervorgehobenen Abschnitt</span></p>
const span = document.querySelector('#hl');
const rects = span.getClientRects();

console.log(rects instanceof DOMRectList); // true
console.log('Anzahl Zeilen:', rects.length);

for (const rect of rects) {
  console.log(`x=${Math.round(rect.x)} y=${Math.round(rect.y)} w=${Math.round(rect.width)}`);
}
true Anzahl Zeilen: 3 x=8 y=16 w=62 x=8 y=34 w=141 x=8 y=52 w=97

item() vs. Indexzugriff und Umwandlung in ein Array

const rects = document.body.getClientRects();

console.log(rects.item(0) === rects[0]); // true
console.log(rects.item(99));            // null
console.log(rects[99]);                 // undefined

// Für Array-Methoden zuerst umwandeln
const widths = Array.from(rects, (r) => r.width);
const total = [...rects].reduce((sum, r) => sum + r.height, 0);
console.log(widths, total);
true null undefined [1264] 820

Markierte Textauswahl zeilenweise hervorheben

document.addEventListener('mouseup', () => {
  document.querySelectorAll('.sel-box').forEach((el) => el.remove());

  const selection = window.getSelection();
  if (!selection || selection.rangeCount === 0 || selection.isCollapsed) return;

  const rects = selection.getRangeAt(0).getClientRects(); // DOMRectList

  for (const { left, top, width, height } of rects) {
    const box = document.createElement('div');
    box.className = 'sel-box';
    Object.assign(box.style, {
      position: 'absolute',
      left: `${left + window.scrollX}px`,
      top: `${top + window.scrollY}px`,
      width: `${width}px`,
      height: `${height}px`,
      background: 'rgba(255, 220, 0, 0.35)',
      pointerEvents: 'none'
    });
    document.body.append(box);
  }
});

// Wichtig · Fallstricke

  • Kein echtes Array: Methoden wie map(), filter() oder forEach() gibt es nicht. Verwende Array.from() oder Spread-Syntax.
  • Statischer Schnappschuss: Nach Scrollen, Größenänderungen oder DOM-Änderungen sind die Werte veraltet. Die Koordinaten beziehen sich auf den Viewport, für Dokumentkoordinaten musst du window.scrollX/scrollY addieren.
  • Leere Liste: Bei Elementen mit display: none oder ohne zugehörige Box ist length gleich 0. Frag das also vor dem Zugriff auf rects[0] ab.
  • Performance: Jeder Aufruf von getClientRects() kann ein synchrones Layout (Reflow) erzwingen. Vermeide es, Lesen und Schreiben in Schleifen abzuwechseln (sogenanntes Layout-Thrashing).
  • Legacy-Schnittstelle: Laut Spezifikation soll DOMRectList nur aus Kompatibilitätsgründen bestehen bleiben, neue APIs geben stattdessen normale Arrays zurück. Die Unterstützung ist in allen modernen Browsern stabil.