我想获得一个元素相对于浏览器的视口(显示页面的视口,而不是整个页面)的位置。如何在JavaScript中做到这一点?
非常感谢
我想获得一个元素相对于浏览器的视口(显示页面的视口,而不是整个页面)的位置。如何在JavaScript中做到这一点?
非常感谢
当前回答
你可以试试:
节点。offsetTop - window.scrollY
它在定义了视口元标签的Opera上工作。
其他回答
现有的答案现在已经过时了。原生的getBoundingClientRect()方法已经存在很长一段时间了,它所做的正是问题所要求的。此外,所有浏览器都支持它(似乎包括IE 5 !)
来自MDN页面:
返回值是一个TextRectangle对象,它包含以像素为单位的描述边界框的只读左、上、右和下属性,其中左上角相对于viewport的左上角。
你可以这样使用它:
var viewportOffset = el.getBoundingClientRect();
// these are relative to the viewport, i.e. the window
var top = viewportOffset.top;
var left = viewportOffset.left;
在我的例子中,为了安全起见,我添加了窗口。滚动到方程式:
var element = document.getElementById('myElement');
var topPos = element.getBoundingClientRect().top + window.scrollY;
var leftPos = element.getBoundingClientRect().left + window.scrollX;
这允许我获得文档上元素的真实相对位置,即使它已经被滚动。
你可以试试:
节点。offsetTop - window.scrollY
它在定义了视口元标签的Opera上工作。
var element = document.querySelector('selector');
var bodyRect = document.body.getBoundingClientRect(),
elemRect = element.getBoundingClientRect(),
offset = elemRect.top - bodyRect.top;
有时getBoundingClientRect()对象的属性值在IE中显示为0。在这种情况下,你必须为元素设置display = 'block'。您可以使用下面的代码为所有浏览器获得偏移。
扩展jQuery功能:
(function($) {
jQuery.fn.weOffset = function () {
var de = document.documentElement;
$(this).css("display", "block");
var box = $(this).get(0).getBoundingClientRect();
var top = box.top + window.pageYOffset - de.clientTop;
var left = box.left + window.pageXOffset - de.clientLeft;
return { top: top, left: left };
};
}(jQuery));
使用:
var elementOffset = $("#" + elementId).weOffset();