Signatur
Beschreibung
offsetParent gibt das Element zurück, von dem aus offsetTop und offsetLeft gemessen werden. In der Regel ist das der nächstgelegene Vorfahre, dessen berechnete position nicht static ist, also relative, absolute, fixed oder sticky. Gibt es keinen solchen Vorfahren, liefert die Eigenschaft das <body>-Element.
Ist das Element selbst nicht positioniert, zählen auch die Tabellenelemente <td>, <th> und <table> als offsetParent. Außerdem werden Vorfahren mit einem transform, einem filter oder will-change: transform in modernen Browsern zum Bezugselement, weil sie einen neuen Enthaltungsblock (containing block) bilden.
In folgenden Fällen ist der Wert null:
- Das Element oder einer seiner Vorfahren hat
display: none. - Das Element hat selbst
position: fixed(Ausnahme: Firefox gibt hier<body>zurück). - Das Element ist
<body>oder<html>. - Das Element hängt nicht im Dokument.
Sinnvoll ist die Eigenschaft vor allem, um die absolute Position eines Elements über alle offsetParent-Stufen aufzusummieren, um Tooltips und Popovers relativ zu einem Container auszurichten und um schnell zu prüfen, ob ein Element überhaupt dargestellt wird.
Rückgabewert
<td>, <th>, <table> oder <body>) oder null, wenn das Element nicht gerendert wird oder fest positioniert ist.Beispiele
Bezugselement ermitteln
// HTML: <div id="box" style="position: relative"><span id="label">Hallo</span></div>
const label = document.getElementById('label');
console.log(label.offsetParent.id);
console.log(label.offsetTop, label.offsetLeft); // relativ zu #box
Absolute Seitenposition über die offsetParent-Kette berechnen
const getPagePosition = (el) => {
let top = 0;
let left = 0;
let current = el;
while (current) {
top += current.offsetTop;
left += current.offsetLeft;
current = current.offsetParent;
}
return { top, left };
};
const pos = getPagePosition(document.querySelector('#target'));
console.log(`Ziel liegt bei ${pos.top}px / ${pos.left}px`);
Prüfen, ob ein Element sichtbar gerendert wird
// Schnelltest: null bedeutet display:none (auch bei einem Vorfahren)
const isRendered = (el) =>
el.offsetParent !== null || getComputedStyle(el).position === 'fixed';
const menu = document.querySelector('.dropdown-menu');
menu.style.display = 'none';
console.log(isRendered(menu));
menu.style.display = 'block';
console.log(isRendered(menu));
Tooltip relativ zum offsetParent eines Buttons positionieren
const button = document.querySelector('#hilfe');
const tooltip = document.createElement('div');
tooltip.className = 'tooltip';
tooltip.textContent = 'Klicken für Hilfe';
tooltip.style.position = 'absolute';
// Tooltip im selben Bezugssystem wie der Button einhängen
const container = button.offsetParent ?? document.body;
container.appendChild(tooltip);
tooltip.style.top = `${button.offsetTop + button.offsetHeight + 4}px`;
tooltip.style.left = `${button.offsetLeft}px`;
// Wichtig · Fallstricke
- Nur auf
HTMLElement: SVG-Elemente haben keineoffsetParent-Eigenschaft (der Wert istundefined). Für SVG nutzt mangetBoundingClientRect(). - Unterschiede bei
position: fixed: Chrome, Safari und Edge gebennullzurück, Firefox dagegen<body>. Deshalb taugtoffsetParent === nullnicht als alleinige Sichtbarkeitsprüfung. Moderne Alternative:element.checkVisibility(). - Performance: Wer
offsetParentliest, erzwingt eine synchrone Layoutberechnung (Reflow). Wechseln sich Lese- und Schreibzugriffe in Schleifen ab, kann das zu Layout-Thrashing führen, also zu ständig neu berechnetem Layout. - Transformationen:
transform,scale,rotateoder Scroll-Positionen stecken nicht in den Offset-Werten. Für die tatsächliche Position auf dem Bildschirm istgetBoundingClientRect()zuverlässiger. - Shadow DOM: Liegt der positionierte Vorfahre in einem geschlossenen Shadow-Tree, geben Browser ihn nicht preis. Stattdessen kommt der nächste Vorfahre außerhalb des Shadow-Trees zurück.
- Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wird ignoriert und wirft im Strict Mode einen
TypeError.