(117) ページ先頭から任意の要素の上端・下端までのオフセット量を取得したい。

投稿者: | 2022年3月10日

489 views

この記事は最終更新から 1005日 が経過しています。

1. やりたいこと

任意の要素について、
ページ先頭から、要素上端までの距離[px]を知りたい。
同時に、
ページ先頭から、要素下端までの距離[px]を知りたい。

2. やってみる

以下の 3段階で求める必要があるのだそうな。

Step 1 : ページ上端から画面上端までの距離[px]を知る。

これは window.pageYOffset を参照すればよい。
スクロールしていなければ、この値は 0だ。
スクロールしていれば、この値はスクロール量になっている。

Step 2 : 画面上端から要素上端までの距離[px]を知る。

これは 要素.getBoundingClientRect().top を参照すればよい。

Step 3 : 両者を足し算する。

関数にしてみた。

// ■ 指定要素の上端のページY座標を得る関数。
// ※elemは native objectであること。(JQueryは NG)
function get_elem_pagePosY_top( elem ){
  const pos = elem.getBoundingClientRect();   // 指定要素のviewport内の相対位置を取得
  return window.pageYOffset + pos.top;
}

ついでに、この値に要素の高さを足せば、ページ先頭から要素下端までの距離が求められる。

// ■ 指定要素の下端のページY座標を得る関数。
// ※elemは native objectであること。(JQueryは NG)
function get_elem_pagePosY_bottom( elem ){
  const pos = elem.getBoundingClientRect();   // 指定要素のviewport内の相対位置を取得
  return window.pageYOffset + pos.top + pos.height;
}

getBoundingClientRectについては、こちらのページで仕様を説明してくださっている。 m(_ _)m
Element.getBoundingClientRect()

※注意
因みに、JQueryで $(elem).height() とすると border, paddingを除いた内部領域の高さが取得できる。
上記関数中の height は border, paddingを含む値、JQueryで書くならば $(elem).outerHeight() に相当する値が取得できる。

図にまとめると、以下のようになる。

3. 応用

(1) 実用的な関数にする。

応用と言うほどではないが、TOPと BOTTOMを同時に知りたいケースも多いので、これに対応する。
戻り値を配列で返すだけだ。

// ■ 指定要素の上端・下端のページY座標を得る関数。
// ※elemは native objectであること。(JQueryは NG)
function get_elem_pagePosY( elem ){
  const pos = elem.getBoundingClientRect();   // 指定要素のviewport内の相対位置を取得
  const topY = window.pageYOffset + pos.top;  // 指定要素上端のページY座標を算出
  const btmY = topY + pos.height;             // 指定要素下端のページY座標を算出
  return [topY, btmY];                        // Call元に配列で返却する。
}

この関数はこんな風に使えばよい。

var [posYtop, posYbottom] = get_elem_pageY(elem);

因みに、$(‘#AAA’) など JQueryで作ったオブジェクトを渡す場合 $(‘#AAA’).get(0) でネイティブに戻してから渡すこと。

var [posYtop, posYbottom] = get_elem_pageY(elem.get(0));

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)