指定した要素のページ内での位置(絶対位置)を取得する - JavaScript

JavaScriptで指定した要素のページ内での位置を取得するコードを紹介します。

概要

JavaScriptで要素の位置を取得するには、getElementById() メソッドなどで要素のオブジェクトを取得し、getBoundingClientRect() メソッドを呼び出すと位置を取得できます。ただし、getBoundingClientRect() メソッドで取得できる位置はスクロールを考慮しないスクリーン上の位置のため、スクロール量であるwindow.pageXOffset, window.pageYOffset を加算してページ内での位置を求めます。

プログラム例

コード

下記のコードを記述します。
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <style>
      <!--
      .frame {
        height:120px;
        border:1px solid #0094ff;
      }
      -->
    </style>
    <script type="text/javascript">
      
      function onButtonClick() {
        var textbox =  document.getElementById('TextArea1');
        var elem = document.getElementById('frame1');
        var rect = elem.getBoundingClientRect();
        var elemtop = rect.top + window.pageYOffset;
        var elemleft = rect.left + window.pageXOffset;
        var elembottom = rect.bottom + window.pageYOffset;
        var elemright = rect.right + window.pageXOffset;
        textbox.value = 'top:' + elemtop+'\r\n'; 
        textbox.value += 'left:' + elemleft+'\r\n'; 
        textbox.value += 'bottom:' + elembottom +'\r\n'; 
        textbox.value += 'right:' + elemright+'\r\n'; 
      }
    </script>
</head>
<body>
  <div>Position Demo</div>
  <div><textarea id="TextArea1" rows="16" cols="80"></textarea></div>
  <div><input id="Button1" type="button" value="button" onclick="onButtonClick();" /></div>
  <div id="frame1" class="frame">frame1</div>
  <div id="frame2" class="frame">frame2</div>
  <div id="frame3" class="frame">frame3</div>
  <div id="frame4" class="frame">frame4</div>
  <div id="frame5" class="frame">frame5</div>
</body>
</html>

解説

下記のコードで textareaタグの要素と、"frame1" のIDを持つ要素を取得します。
"frame1"の要素に対して、getBoundingClientRect()メソッドを呼び出し、frame1の要素の位置座標を取得します。
  var textbox =  document.getElementById('TextArea1');

  var elem = document.getElementById('frame1');
  var rect = elem.getBoundingClientRect();

getBoundingClientRect()メソッドで取得した座標値はスクロールを考慮しない値のため、縦方向の座標には window.pageYOffsetの値を加算します。横宝庫の値には window.pageYOffset の値を加算します。加算した値をTextAreaに表示します。~
  var elemtop = rect.top + window.pageYOffset;
  var elemleft = rect.left + window.pageXOffset;
  var elembotom = rect.bottom + window.pageYOffset;
  var elemright = rect.right + window.pageXOffset;

実行結果

上記のHTMLファイルをWebブラウザで表示します。下図のページが表示されます。


[button]をクリックします。テキストボックスに"frame1" の座標値が表示されます。


続いて、ページを下方向にスクロールします。スクロール後に[button]をクリックします。


ページの上部に戻ります。スクロールする前と同じ値が表示されており、スクロール量を考慮したページ内での絶対座標が取得できていることが確認できました。


指定した要素のページ内での絶対座標が取得できました。

プログラム例 (枠がネストする場合)

コード

下記のHTMLファイルを作成します。
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <style>
      <!--
      #outerframe{
        border: 1px solid #ad1a1a;
        margin-top:16px;
        margin-left:16px;
        padding-top:32px;
        padding-left:16px;
      }
      .frame {
        height:120px;
        border:1px solid #0094ff;
      }
      -->
    </style>
    <script type="text/javascript">
      
      function onButtonClick() {
        var textbox =  document.getElementById('TextArea1');
        var elem = document.getElementById('frame1');
        var rect = elem.getBoundingClientRect();
        var elemtop = rect.top + window.pageYOffset;
        var elemleft = rect.left + window.pageXOffset;
        var elembottom = rect.bottom + window.pageYOffset;
        var elemright = rect.right + window.pageXOffset;
        textbox.value = 'top:' + elemtop+'\r\n'; 
        textbox.value += 'left:' + elemleft+'\r\n'; 
        textbox.value += 'bottom:' + elembottom+'\r\n'; 
        textbox.value += 'right:' + elemright+'\r\n'; 

      }
    </script>
</head>
<body>
    <div>Position Demo</div>
    <div><textarea id="TextArea1" rows="16" cols="80"></textarea></div>
    <div><input id="Button1" type="button" value="button" onclick="onButtonClick();" /></div>
    <div id="outerframe">
        <div id="frame1" class="frame">frame1</div>
        <div id="frame2" class="frame">frame2</div>
        <div id="frame3" class="frame">frame3</div>
        <div id="frame4" class="frame">frame4</div>
        <div id="frame5" class="frame">frame5</div>
    </div>
</body>
</html>

実行結果

上記のHTMLファイルをWebブラウザで表示します。下図のページが表示されます。


[button]をクリックします。frame1 の枠の座標値がテキストボックスに表示されます。ネストされていてもページの左上からの絶対座標で表示できていることが確認できます。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2019-06-30
iPentec all rights reserverd.