次のDOM構造があります
<body>
<div>
<table>
<outerElement>
<innerElement />
</outerElement>
<table>
</div>
</body>
DIV のオーバーフローは auto に設定されているため、テーブルが大きくなると、DIV 内でスクロールします。
このシナリオでtable.offsetParent
は、ボディを返しながらDivtable.parentNode
を返すのはなぜですか?parentElement
ウィンドウ内の現在の位置を計算する必要があるinnerElement
ため、そこからすべての親要素をトラバースして、それらの値offsetTop
とoffsetLeft
値を収集します。DIV が正常に機能するまでは、offsetParent
それを直接本文にスキップします。ある時点でスクロールが関係している場合の問題は、上記の例の DIV のように、考慮する必要がscrollTop
あります。scrollLeft
問題は、使用するoffsetParent
と、親の 1 つとして DIV に遭遇しないことです。
アップデート
これはトラバースを行うコードの一部です。
while (oElem && getStyle(oElem, 'position') != 'absolute' && getStyle(oElem, 'position') != 'relative') {
curleft += oElem.offsetLeft;
curtop += oElem.offsetTop;
oElem = oElem.offsetParent;
}
wheregetStyle
は、この場合位置スタイルを取得するカスタム関数です。