HTML/JavaScriptでページ最上部からの位置を取得する方法
こんにちは、kz_moritaです。
最近はVue.js / Nuxt.js あたりで Web フロントを書いたりしています。
今回は、ページの最上部からある特定のDOMの位置座標を取得するのにちょっとつまづいたため、そのことについてまとめておきます。
試した方法 以下の二種類の方法を試しました。
HTMLElement.offsetTop Element.getBoundingClientRect().top + window.pageYOffset 結論から言うと、ページの最上部からの位置を取得する仕様は2つ目の方法で実現することができました。
HTMLElement.offetTop HTMLElement.offsetTopの仕様は以下のサイトに詳しく書いています。
https://developer.mozilla.org/ja/docs/Web/API/HTMLElement/offsetTop
それでは、offsetTopを使ってページ上部からの位置座標を取得してみます。
以下のコードは各DOMの位置を offsetTop から取得して、各DOMの innerText として表示している例です。
dom1が一番上に配置されているので0 dom2-1は dom1の高さ + dom1,dom2間のmargin + dom2のpadding = 120 + 10 + 10 = 140 となっており、期待通りに正しく動いているように見えます。
offsetTopの問題点 offetTopを取得したい要素の親要素に、 position: relative が指定されていると画面上部からのOffsetを取ることができません。
以下は、 #dom2 { position: relative; } を指定した場合のソースコードです。
dom2-1, dom2-2, dom2-3 の offsetTop が親要素である dom2 からの位置座標になっていることが分かります。
これはdom2に position: relative を指定することで、dom2-1, dom2-2, dom2-3 の offsetParentがdom2になるためです。