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

Kip*_*Kip 82 javascript dom offset

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

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

另外,我不能使用jQuery.

Sk8*_*ter 129

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

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

摘要

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

句法

var rectObject = object.getBoundingClientRect();

返回

返回的值是TextRectangle对象,它是getClientRects()为元素返回的矩形的并集,即与元素关联的CSS边框.

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

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

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

它得到了广泛的支持,并且非常易于使用,更不用说它真的很快.以下是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);
Run Code Online (Sandbox Code Playgroud)

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

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

注意:

我不得不提到的是,widthheight该属性的getBoundingClientRect()方法的返回值是undefined在Internet Explorer 8,它可以在Chrome 26.x,20.x的Firefox和Opera的12.x虽然.IE8中的解决方法:for width,你可以减去返回值的左右属性,因为height你可以减去bottom和top属性(比如这个).

  • 这是一个完全不同的用例吗?向下滚动页面并再次检查您的值...`getBoundingClientRect()`用于相对于滚动窗口的位置...当您滚过徽标时,您的最高值将变为负值. (55认同)
  • 我认为你应该编辑答案,以一种能够回答原始OP问题的方式包含此页面偏移片段.成为最受欢迎的答案会带来一些责任;) (14认同)
  • @jondavidjohn当然可以通过添加`window.pageYOffset`轻松调整(或者,如果你真的需要IE8兼容性,[`(window.pageYOffset!== undefined)?window.pageYOffset:(document.documentElement || document .body.parentNode || document.body).scrollTop`](https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollY#Notes)).水平滚动也是如此. (13认同)
  • 但是`getBoundingClientRect`不返回元素的`x`、`y`的`绝对`位置 (6认同)
  • 在我的例子中,`getBoundingClientRect` 从顶部返回了错误的偏移量。@eyelidless 的建议是有效的。 (5认同)
  • @user123444555621此语句不正确,虽然它可能适用于大多数用例,但如果您的元素位于不是页面主体的可滚动元素中,则“window.pageYOffset”将不起作用 (3认同)

eye*_*ess 119

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
    };
};
Run Code Online (Sandbox Code Playgroud)

(方法从PrototypeJS无耻地窃取;代码样式,变量名称和返回值已更改以保护无辜者)

  • 我喜欢评论下面的评论:D (13认同)
  • 请注意,元素的样式必须是相对的、绝对的或固定的,我想? (3认同)
  • 谢谢!我只有一票要给:) (2认同)