div / spanタグの位置を取得する


103

誰かがどのように得るために私を示すことができるtopleftの位置divまたはspan1が指定されていないときの要素を?

つまり:

<span id='11a' style='top:55px;' onmouseover="GetPos(this);">stuff</span>
<span id='12a' onmouseover="GetPos(this);">stuff</span>

上記で、私が行う場合:

document.getElementById('11a').style.top

の値55pxが返されます。ただし、span「12a」に対してそれを試した場合、何も返されません。

/ プロパティを指定できないページにdiv/ がたくさんありspanますが、その要素のすぐ下に表示する必要があります。topleftdiv

回答:


100

この関数は、ページに対する要素のx、y位置を通知します。基本的に、すべての要素の親をループアップし、それらのオフセットを一緒に追加する必要があります。

function getPos(el) {
    // yay readability
    for (var lx=0, ly=0;
         el != null;
         lx += el.offsetLeft, ly += el.offsetTop, el = el.offsetParent);
    return {x: lx,y: ly};
}

ただし、要素のコンテナに対する相対的なx、y位置が必要な場合は、必要なのは次のとおりです。

var x = el.offsetLeft, y = el.offsetTop;

要素をこの要素のすぐ下に配置するには、その高さも知る必要があります。これは、offsetHeight / offsetWidthプロパティに格納されます。

var yPositionOfNewElement = el.offsetTop + el.offsetHeight + someMargin;

5
残念ながら、要素が境界線のあるテーブル内にある場合、Chromeではこのメソッドは失敗します。また、BODYマージンのため、IE6標準モードでも失敗します。
GetFree

1
このコードのユーザーへの警告です。これは、ウィンドウではなくページに関連しています。ユーザーがスクロールバーを使用してスクロールすると、同じ値が返されます。注意してください。
Isaac Bolinger 2014

ありがとう、@ IsaacBolingerが気づきました。ウィンドウのサイズが変更されたとき、またはユーザーがスクロールしたときに値を変更する方法を誰かに教えてもらえますか?
DavidFariña2016年

@DavidFariñaそのために、道場のジオメトリモジュール「dom-geometry」を使用しました。私はそれをネイティブで行う方法がわかりません。
Isaac Bolinger

反対投票-経験豊富なユーザーには明らかかもしれませんが、elに渡す必要があるものを正確に指定していません(つまり、使用例を提供してください)。
Matt

183

getBoundingClientRect()要素への参照でメソッドを呼び出すことができます。次に、あなたが調べることができtopleftrightおよび/またはbottom性質を...

var offsets = document.getElementById('11a').getBoundingClientRect();
var top = offsets.top;
var left = offsets.left;

jQueryを使用している場合は、より簡潔なコードを使用できます...

var offsets = $('#11a').offset();
var top = offsets.top;
var left = offsets.left;

11
この回答の+1をgetBoundingClientRect()使用する必要があります-これが受け入れられる回答です。ただし、これが機能するために「最新のブラウザ」は必要ありません。ここで示した互換性リストを参照してください:stackoverflow.com/questions/1480133/…。IE 4.0以降(!)、Chrome 1.0以降、FF 3.0以降、Safari 4.0以降、Operaで正常に動作します。
Sk8erPeter 2013年

25
getBoundingClientRect()ドキュメントではなく、ビューポートに関連する値を返すことに注意してください。そのためには、次のようなものが必要ですtop = el.getBoundingClientRect().top + window.pageYOffset - el.ownerDocument.documentElement.clientTop
ザックブルーム

1
また、ノートgetBoundingClientRect取りtransform考慮。
ExpExc 2016

絶対配置されていない最初の子にmargin-topまたはmargin-leftがある場合、これは正確ではありません。現在、このページには正確な解決策はありません。誰かが知っている場合は、回答を投稿してください。
カーティス

16

@nickfの答えは機能しますが。古いブラウザを気にしない場合は、この純粋なJavaScriptバージョンを使用できます。IE9 +などで動作します

var rect = el.getBoundingClientRect();

var position = {
  top: rect.top + window.pageYOffset,
  left: rect.left + window.pageXOffset
};

12

Alexが指摘したように、jQuery offset()を使用して、ドキュメントフローに対する相対位置を取得できます。親を基準にしたx、y座標には、position()を使用します。

編集:単にDOMを準備するのではなく、すべての要素を待機してサイズを取得するために切り替えdocument.readyられましwindow.loadload。私の経験では、loadJavaScriptで正しく配置されていない要素が少なくなります。

$(window).load(function(){ 
  // Log the position with jQuery
  var position = $('#myDivInQuestion').position();
  console.log('X: ' + position.left + ", Y: " + position.top );
});

9

上または左の位置だけが必要な場合は、@ Nickfの読み取り可能なコードを少し変更するだけでうまくいきます。

function getTopPos(el) {
    for (var topPos = 0;
        el != null;
        topPos += el.offsetTop, el = el.offsetParent);
    return topPos;
}

そして

function getLeftPos(el) {
    for (var leftPos = 0;
        el != null;
        leftPos += el.offsetLeft, el = el.offsetParent);
    return leftPos;
}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.