我想获得一个元素相对于浏览器的视口(显示页面的视口,而不是整个页面)的位置。如何在JavaScript中做到这一点?
非常感谢
我想获得一个元素相对于浏览器的视口(显示页面的视口,而不是整个页面)的位置。如何在JavaScript中做到这一点?
非常感谢
当前回答
有时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();
其他回答
你可以试试:
节点。offsetTop - window.scrollY
它在定义了视口元标签的Opera上工作。
有时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();
var element = document.querySelector('selector');
var bodyRect = document.body.getBoundingClientRect(),
elemRect = element.getBoundingClientRect(),
offset = elemRect.top - bodyRect.top;
我假设在web页面中存在一个id为btn1的元素,并且包含jQuery。这适用于所有现代浏览器的Chrome, FireFox, IE >=9和Edge。 jQuery只是用来确定相对于文档的位置。
var screenRelativeTop = $("#btn1").offset().top - (window.scrollY ||
window.pageYOffset || document.body.scrollTop);
var screenRelativeLeft = $("#btn1").offset().left - (window.scrollX ||
window.pageXOffset || document.body.scrollLeft);
jQuery非常优雅地实现了这一点。如果你查看jQuery的偏移量的源代码,你会发现它基本上是这样实现的:
var rect = elem.getBoundingClientRect();
var win = elem.ownerDocument.defaultView;
return {
top: rect.top + win.pageYOffset,
left: rect.left + win.pageXOffset
};