如何在 Javascript 中获取对象在页面上的绝对位置?

IT技术 javascript dom offset
2021-01-17 06:41:27

我想在 Javascript 中获取页面上对象的绝对 x,y 位置。我怎样才能做到这一点?

我试过obj.offsetTopand obj.offsetLeft,但那些只给出相对于父元素的位置。我想我可以循环并添加父级的偏移量及其父级的偏移量,依此类推,直到我到达没有父级的对象,但似乎应该有更好的方法。谷歌搜索并没有出现太多,甚至 SO 站点搜索也没有找到任何东西。

另外,我不能使用 jQuery。

2个回答
var cumulativeOffset = function(element) {
    var top = 0, left = 0;
    do {
        top += element.offsetTop  || 0;
        left += element.offsetLeft || 0;
        element = element.offsetParent;
    } while(element);

    return {
        top: top,
        left: left
    };
};

(方法无耻地从PrototypeJS中盗取;代码风格、变量名和返回值都改了,以保护无辜)

谢谢!我只有一票要给:)
2021-03-15 06:41:27
也喜欢评论!:)
2021-03-18 06:41:27
请注意,元素的样式必须是相对的、绝对的或固定的,我想?
2021-03-28 06:41:27
我喜欢代码下方的评论:D
2021-04-04 06:41:27

我肯定会建议使用element.getBoundingClientRect()

https://developer.mozilla.org/en-US/docs/Web/API/element.getBoundingClientRect

概括

返回包含一组文本矩形的文本矩形对象。

句法

var rectObject = object.getBoundingClientRect();

退货

返回值是一个TextRectangle对象,它是getClientRects()为元素返回的矩形的联合,即与元素关联的 CSS 边框框。

返回值是一个TextRectangle对象,其中包含只读 lefttoprightbottom描述该边界框,以像素为单位,与左上相对于属性左上方视口。

这是从链接的 MDN 站点获取的浏览器兼容性表:

+---------------+--------+-----------------+-------------------+-------+--------+
|    Feature    | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
+---------------+--------+-----------------+-------------------+-------+--------+
| Basic support | 1.0    | 3.0 (1.9)       | 4.0               | (Yes) | 4.0    |
+---------------+--------+-----------------+-------------------+-------+--------+

它得到了广泛的支持,并且非常易于使用,更不用说它的速度非常快。这是 John Resig 的一篇相关文章:http : //ejohn.org/blog/getboundingclientrect-is-awesome/

你可以这样使用它:

var logo = document.getElementById('hlogo');
var logoTextRectangle = logo.getBoundingClientRect();

console.log("logo's left pos.:", logoTextRectangle.left);
console.log("logo's right pos.:", logoTextRectangle.right);

这是一个非常简单的示例http : //jsbin.com/awisom/2(您可以通过单击右上角的“在 JS Bin 中编辑”来查看和编辑代码)。

或者这是另一个使用 Chrome 控制台的: 在 Chrome 中使用 element.getBoundingClientRect()

笔记:

我不得不提一下,方法返回值widthheight属性在 Internet Explorer 8 中。不过它在 Chrome 26.x、Firefox 20.x 和 Opera 12.x 中有效。IE8 中的解决方法: for ,您可以减去返回值的 right 和 left 属性,而 for ,您可以减去 bottom 和 top 属性(像这样)。getBoundingClientRect()undefinedwidthheight

@jondavidjohn 当然,但可以通过添加轻松调整window.pageYOffset(或者,如果您确实需要 IE8 兼容性,(window.pageYOffset !== undefined) ? window.pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop)。水平滚动也一样。
2021-03-15 06:41:27
这是一个完全不同的用例吗?向下滚动页面并再次检查您的值...getBoundingClientRect()是相对于滚动窗口的位置...当您滚动经过徽标时,您的最高值将变为负值。
2021-03-20 06:41:27
我认为您应该编辑答案,以回答原始 OP 问题的方式包含此页面偏移代码段。成为最受欢迎的答案会带来一些责任;)
2021-03-28 06:41:27
getBoundingClientRect不返回absolute元素的位置xy
2021-03-28 06:41:27
在我的情况下,getBoundingClientRect从顶部返回错误的偏移量。@eyelidless 的建议是有效的。
2021-03-29 06:41:27