Answers:
您可以遍历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
来计算视口偏移。
两者之和将给出元素相对于文档的位置:
element.getBoundingClientRect().top + document.documentElement.scrollTop
document.documentElement.scrollTop
不能在Safari中工作,请window.scrollY
改用
我建议使用
element.getBoundingClientRect()
如此处所建议, 而不是通过offsetLeft,offsetTop和offsetParent进行手动偏移计算。如提出这里 在某些情况下*手动遍历产生无效的结果。看到这个柱塞:http ://plnkr.co/pC8Kgj
*当元素位于具有静态(=默认)位置的可滚动父级内部时。
offsetLeft
,offsetTop
却没有考虑CSS3转换getBoundingClientRect()
。因此,结果可能无效。如果需要,您可以使用来获得元素相对于父元素的偏移量(如offsetLeft
)(element.getBoundingClientRect().left - parent.getBoundingClientRect().left)
。
document-offset
(3rd-party脚本)很有趣,并且似乎可以利用此处其他答案中的方法。
var offset = require('document-offset')
var target = document.getElementById('target')
console.log(offset(target))
// => {top: 69, left: 108}
对于那些想要获取元素相对于文档的各个位置的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介绍了最佳方法,总而言之,您在正确的位置上必须找到偏移量并遍历父级树。