2011-07-21 12 views
4

divの中に要素があるとします(または他の要素を含むか、おそらく文書の本文にある)。どのようにその要素の(x、y)座標をそのコンテナに対して相対的に取得するのですか?純粋なJavascriptでの要素座標

そして、私は純粋なJavaScriptでそれを行うことができるようにする必要があり...

+0

jQueryの純粋ジャバスクリプトです:

次の関数は、これを達成します。 :Dコファスクリプトやサーバ - >バイトコード - > JavaScirptのハッキングのようなインタラプタはありません。 – William

答えて

4

はShankarSangoliのポストのオフに行く

以下
document.getElementById("elementId").offsetTop; 
document.getElementById("elementId").offsetLeft; 
0

を使用して、それがこの方法を拡張することができます。親(コンテナ)との差と子(問題の要素)を取得します:

var parentOffsetTop = document.getElementById("parentId").offsetTop; 
var parentOffsetLeft = document.getElementById("parentId").offsetLeft; 
var childOffsetTop = document.getElementById("childId").offsetTop; 
var childOffsetLeft = document.getElementById("childId").offsetLeft; 

var xOffset = parentOffsetLeft - childOffsetLeft; 
var yOffset = parentOffsetTop - childOffsetTop; 

編集:私は間違っていたようで、offsetLeftとoffsetTopはとにかく親のオフに基づいています。これを手動で行う必要はありません!

5

offsetTopoffsetLeftのプロパティはoffsetParentからの相対値で、親に対して相対的な位置を自由に得ることができます。ポジション全体をbodyに関連付ける場合は、offsetParentチェーンをトラバースして値を合計する必要があります。

function findPos(obj) { 
    var curleft = 0, curtop = 0; 
    if (obj.offsetParent) { 
     do { 
      curleft += obj.offsetLeft; 
      curtop += obj.offsetTop; 
     } while (obj = obj.offsetParent); 
     return { x: curleft, y: curtop }; 
    } 
    return undefined; 
} 
+0

このコードには2つの問題があります。まず、グローバル名前空間にカレントをリークします。 var行は "var curleft = 0、curtop = 0;"と読みます。次に、渡されたオブジェクトにoffsetParentがない場合は何も返しません。 – HBP

+0

@ハンス - スコープの漏れをうまく話してください。一定。他の問題に関しては、すべての要素に 'offsetParent'があります。そのようなプロパティを持たないすべての渡されたオブジェクトに対して、結果*は未定義であるべきです。私はそれを明示した。 –

+0

当時、私はこの技術がここで使われているのを最初に見たことがあります。http://www.quirksmode.org/js/findpos.html –

関連する問題