如何获取元素相对于浏览器视口的顶部位置?

IT技术 javascript
2021-02-20 23:45:57

我想获取元素相对于浏览器视口(显示页面的视口,而不是整个页面)的位置。这如何在 JavaScript 中完成?

非常感谢

6个回答

现有的答案现在已经过时了。本机getBoundingClientRect()方法已经存在了很长一段时间,并且完全满足问题的要求。此外,所有浏览器都支持它(似乎包括 IE 5!)

MDN 页面

返回值是一个 TextRectangle 对象,它包含描述边框的只读左、上、右和下属性,以像素为单位,左上角相对于视口的左上角

你像这样使用它:

var viewportOffset = el.getBoundingClientRect();
// these are relative to the viewport, i.e. the window
var top = viewportOffset.top;
var left = viewportOffset.left;
问题是询问相对于浏览器的窗口。
2021-04-20 23:45:57
@DenilsongetBoundingClientRect().top不在我的 IE11 中,它返回 0。你有什么解决方案。
2021-04-22 23:45:57
适合大多数情况,但它假定元素不在嵌入式 iframe 内,对吗?问题是询问相对于浏览器的窗口。el.getBoundingClientRect() 将返回相对于 iframe 的窗口,而不是浏览器窗口。
2021-04-23 23:45:57
使用浏览器缩放 (Android Chrome) 时,这可能无法正常工作。@rism 的解决方案(见下文)在这种情况下有效
2021-05-10 23:45:57
你把它简化一点 const { top, left } = viewportOffset
2021-05-13 23:45:57

就我而言,为了安全起见,我将 window.scroll 添加到等式中:

var element = document.getElementById('myElement');
var topPos = element.getBoundingClientRect().top + window.scrollY;
var leftPos = element.getBoundingClientRect().left + window.scrollX;

这使我能够获得元素在文档上的真实相对位置,即使它已被滚动。

您不应该添加滚动位置而不是减去它吗?
2021-04-19 23:45:57
我同意, pageYOffset 有更好的跨浏览器兼容性。
2021-04-19 23:45:57
@FabiogetBoundingClientRect().top不在我的 IE11 中,它返回 0。你有什么解决方案。
2021-04-28 23:45:57
@Arifwindow.scrollY || window.pageYOffset可能会改进支持
2021-05-07 23:45:57
我赞成答案,但@lulian Onofrei 仍然是对的。请编辑。
2021-05-13 23:45:57
var element =  document.querySelector('selector');
var bodyRect = document.body.getBoundingClientRect(),
    elemRect = element.getBoundingClientRect(),
    offset   = elemRect.top - bodyRect.top;
这似乎是从文档顶部计算的,而不是视口
2021-05-07 23:45:57

编辑: 添加一些代码来解释页面滚动。

function findPos(id) {
    var node = document.getElementById(id);     
    var curtop = 0;
    var curtopscroll = 0;
    if (node.offsetParent) {
        do {
            curtop += node.offsetTop;
            curtopscroll += node.offsetParent ? node.offsetParent.scrollTop : 0;
        } while (node = node.offsetParent);

        alert(curtop - curtopscroll);
    }
}

id 参数是您想要其偏移量的元素的 id。改编自quirksmode 帖子

哦,好的,我明白了。不知道该怎么做……如果我想出什么,我会编辑我的答案。
2021-04-16 23:45:57
感谢您的回答,但我认为您误解了我的问题,我知道如何获得相对于页面的元素的顶部,我想要做的是获得相对于“视口”(即浏览器窗口)的位置, 不是文档)
2021-04-20 23:45:57
不,只是您看到页面的窗口。如果页面被滚动,这将与文档顶部不同,否则它们是相同的。
2021-04-29 23:45:57
我使上面的代码更丑一些,但它有效......使用 offsetParent.scrollTop
2021-04-29 23:45:57
抱歉,您对“视口”的使用让我感到厌烦。那么,您是说要考虑浏览器的 chrome,即书签工具栏、位置栏等?
2021-05-15 23:45:57

jQuery 非常优雅地实现了这一点。如果您查看 jQuery's 的源代码offset,您会发现它基本上是这样实现的:

var rect = elem.getBoundingClientRect();
var win = elem.ownerDocument.defaultView;

return {
    top: rect.top + win.pageYOffset,
    left: rect.left + win.pageXOffset
};