javascriptを使ったHTML要素の位置取得

javascriptから取得できるHTML要素の位置は様々な種類があるので、後から参照できるようにまとめておく。jqueryなどのライブラリを使う方法については省略。ネイティブ環境で使えるもののみ扱う。各見出しはMDN web docsへのリンクになっているので、詳細はそちらを参照。

HTML要素の位置取得

style.xxx

基本情報

cssのプロパティを取得、設定する。

getBoundingClientRect()

基本情報
相対要素 margin border padding
viewport x o o

viewport相対なので、scrollによって変化する。

取得できる値

大体はgetClientRects()と同じだが、こちらで取得すると要素のボーダーを含む全体についての値が得られる。

  • top
  • left
  • bottom
  • left
  • x
  • y
  • width
  • height

getClientRects()

基本情報
相対要素 margin border padding
viewport x o o

viewport相対なので、scrollによって変化する。

取得できる値

大体はgetBoundingClientRect()と同じだが、こちらで取得すると一行ずつの値がリストで得られる。一行ずつというのは、インライン要素が途中で折り返して複数行に渡って表示される場合、各行についての値を取得できるということ。ブロック要素の場合は、リストの要素は一つだけ。この要素は、getBoundingClientRect()で得られるものと同じ。

  • [
    • top -left
    • bottom
    • left
    • x
    • y
    • width
    • height

    ]

getClientRects()についての参考

<div>
 <strong>span's rect</strong>
 <p>
  <span>Paragraph that spans multiple lines</span>
 </p>
</div>

上の画像において、span's rectにおいて赤色で示されているのが、spanの各行に関するgetClientRects()の戻り値。

[read-only] offsetTop

[read-only] offsetLeft

相対要素 margin border padding
offsetParent x o o
取得できる値

offsetTopとoffsetLeftは、offsetParentに対する一行目の相対位置。すなわち、getClientRects()が返すリストの初めの要素をoffsetParentが基準となるように変換しても得られる。

offsetTop
  • offsetTop
offsetLeft
  • offsetLeft

[read-only] offsetWidth

[read-only] offsetHeight

相対要素 margin border padding
offsetParent x o o
取得できる値
offsetWidth
  • offsetWidth
offsetHeight
  • offsetHeight

offsetxxxについての参考

[read-only] offsetParent

positionがrelative、absolute、fixedのいずれかである要素のうち直近の先祖。

取得できる値

<div>
  <span>Short span. </span>
  <span>Long span that wraps within this div.</span>
</div>

この画像の中で赤色で示されているものが、二つ目のspanのoffsetxxxの値。top、left、width、heightに二つ目のspan要素のoffsetxxxで得られる値を設定している。

mouseイベント、touchイベントの位置取得

mouseイベントやtouchイベントでは、clickまたはtouchした場所を取得できる。その値と実際の場所の関係を書いておく。

f:id:babyron64:20180823194945p:plain

上の図では、pointで示される場所にclickまたはtouchしたと想定している。

viewport上の位置への変換

何らかの基準に対する相対位置が得られたときに、それをviewport上への位置に変換する方法を書いておく。先ほど示したように、pageとviewportの関係は、window.pageX/YOffsetで得られる。これはすなわちbodyとviewportの関係なので、viewportに対する相対位置にwindow.pageX/YOffsetを加えることで、body上での位置が得られる。

具体的には、

var client_rec = document.getElementById(...).getBoundingClientRect();
var element_x = window.pageXOffset + client_rec.x;
var element_x = window.pageYOffset + client_rec.y;

とすることで、elementの座標element_xとelement_yが得られる。

参考

page、screen、viewportとかの関係

スマホの場合 (iphone上のsafarichromeで確認)

f:id:babyron64:20180823200436p:plain

基本的には上の図のようになるが、viewportが画面に収まるようにブラウザが自動的に拡大・縮小することがある。

パソコンの場合 (mac上のsafariで確認)

f:id:babyron64:20180823200559p:plain

外部ページ