回答:
offsetParent
DOMの最上位までトラバースできます。
function getOffsetLeft( elem )
{
var offsetLeft = 0;
do {
if ( !isNaN( elem.offsetLeft ) )
{
offsetLeft += elem.offsetLeft;
}
} while( elem = elem.offsetParent );
return offsetLeft;
}
次のようにDOMをトラバースすることなく、トップとレフトを取得できます。
function getCoords(elem) { // crossbrowser version
var box = elem.getBoundingClientRect();
var body = document.body;
var docEl = document.documentElement;
var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;
var clientTop = docEl.clientTop || body.clientTop || 0;
var clientLeft = docEl.clientLeft || body.clientLeft || 0;
var top = box.top + scrollTop - clientTop;
var left = box.left + scrollLeft - clientLeft;
return { top: Math.round(top), left: Math.round(left) };
}
<html>
要素の境界線の値に対応します。
を使用element.getBoundingClientRect()
して、ビューポートに対する要素の位置を取得できます。
次に、を使用document.documentElement.scrollTop
してビューポートのオフセットを計算します。
2つの合計は、ドキュメントに対する要素の位置を示します。
element.getBoundingClientRect().top + document.documentElement.scrollTop
document.documentElement.scrollTop
Safariでは機能しません。window.scrollY
代わりに使用してください
私は使用をお勧めします
element.getBoundingClientRect()
ここで提案されている ように、offsetLeft、offsetTop、およびoffsetParentによる手動のオフセット計算の代わりに。ここ で提案されているとおり状況によっては*手動トラバーサルは無効な結果を生成します。このPlunkerを参照してください:http ://plnkr.co/pC8Kgj
*要素が静的(=デフォルト)の位置にあるスクロール可能な親の内部にある場合。
offsetLeft
そしてoffsetTop
、アカウントCSS3の変換、に取ることはありませんgetBoundingClientRect()
ありません。そのため、結果が無効になる場合があります。必要な場合は、を使用して、要素の親に対するオフセット(などoffsetLeft
)を取得できます(element.getBoundingClientRect().left - parent.getBoundingClientRect().left)
。
document-offset
(サードパーティのスクリプト)は興味深いものであり、ここで他の回答からのアプローチを活用しているようです。
var offset = require('document-offset')
var target = document.getElementById('target')
console.log(offset(target))
// => {top: 69, left: 108}
次のメソッドは、offsetTop / offsetLeftをトリップするエッジケースを処理するときに最も信頼できることがわかりました。
function getPosition(element) {
var clientRect = element.getBoundingClientRect();
return {left: clientRect.left + document.body.scrollLeft,
top: clientRect.top + document.body.scrollTop};
}
ドキュメントを基準にした、要素のさまざまな位置のx座標とy座標を取得したい場合。
const getCoords = (element, position) => {
const { top, left, width, height } = element.getBoundingClientRect();
let point;
switch (position) {
case "top left":
point = {
x: left + window.pageXOffset,
y: top + window.pageYOffset
};
break;
case "top center":
point = {
x: left + width / 2 + window.pageXOffset,
y: top + window.pageYOffset
};
break;
case "top right":
point = {
x: left + width + window.pageXOffset,
y: top + window.pageYOffset
};
break;
case "center left":
point = {
x: left + window.pageXOffset,
y: top + height / 2 + window.pageYOffset
};
break;
case "center":
point = {
x: left + width / 2 + window.pageXOffset,
y: top + height / 2 + window.pageYOffset
};
break;
case "center right":
point = {
x: left + width + window.pageXOffset,
y: top + height / 2 + window.pageYOffset
};
break;
case "bottom left":
point = {
x: left + window.pageXOffset,
y: top + height + window.pageYOffset
};
break;
case "bottom center":
point = {
x: left + width / 2 + window.pageXOffset,
y: top + height + window.pageYOffset
};
break;
case "bottom right":
point = {
x: left + width + window.pageXOffset,
y: top + height + window.pageYOffset
};
break;
}
return point;
};
getCoords(document.querySelector('selector'), 'center')
getCoords(document.querySelector('selector'), 'bottom right')
getCoords(document.querySelector('selector'), 'top center')
http://www.quirksmode.org/js/findpos.htmlこれを行うための最良の方法を説明します。全体として、オフセットを見つけて親のツリーをたどる必要がある正しい軌道に乗っています。