次の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は、この場合位置スタイルを取得するカスタム関数です。