我想获取元素相对于浏览器视口(显示页面的视口,而不是整个页面)的位置。如何用JavaScript完成?
非常感谢
我想获取元素相对于浏览器视口(显示页面的视口,而不是整个页面)的位置。如何用JavaScript完成?
非常感谢
Answers:
现有答案现在已过时。本机getBoundingClientRect()
方法已经存在了很长一段时间,并且可以完全满足问题的要求。另外,所有浏览器(似乎包括IE 5)都支持它。
从MDN页面:
返回的值是一个TextRectangle对象,该对象包含只读的left,top,right和bottom属性,以像素为单位描述边框,以左上角相对于视口的左上角。
您可以这样使用它:
var viewportOffset = el.getBoundingClientRect();
// these are relative to the viewport, i.e. the window
var top = viewportOffset.top;
var left = viewportOffset.left;
getBoundingClientRect().top
不在我的IE11中,它返回0。您有解决方案吗?
就我而言,为了安全起见,我将window.scroll添加到公式中:
var element = document.getElementById('myElement');
var topPos = element.getBoundingClientRect().top + window.scrollY;
var leftPos = element.getBoundingClientRect().left + window.scrollX;
这使我可以获取元素在文档中的真实相对位置,即使它已经滚动了。
getBoundingClientRect().top
不在我的IE11中,它返回0。您有解决方案吗?
window.scrollY || window.pageYOffset
可能会改善支持
编辑: 添加一些代码以进行页面滚动。
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帖子。
你可以试试:
node.offsetTop - window.scrollY
它在Opera中定义了视口元标记。
offsetTop
则是相对于最接近的元素。根据页面结构,它可能是根元素,也可能不是根元素。
此页面上的函数将返回一个矩形,其中包含相对于浏览器视口的传递元素的顶部,左侧,高度和宽度坐标。
localToGlobal: function( _el ) {
var target = _el,
target_width = target.offsetWidth,
target_height = target.offsetHeight,
target_left = target.offsetLeft,
target_top = target.offsetTop,
gleft = 0,
gtop = 0,
rect = {};
var moonwalk = function( _parent ) {
if (!!_parent) {
gleft += _parent.offsetLeft;
gtop += _parent.offsetTop;
moonwalk( _parent.offsetParent );
} else {
return rect = {
top: target.offsetTop + gtop,
left: target.offsetLeft + gleft,
bottom: (target.offsetTop + gtop) + target_height,
right: (target.offsetLeft + gleft) + target_width
};
}
};
moonwalk( target.offsetParent );
return rect;
}
function inViewport(element) {
let bounds = element.getBoundingClientRect();
let viewWidth = document.documentElement.clientWidth;
let viewHeight = document.documentElement.clientHeight;
if (bounds['left'] < 0) return false;
if (bounds['top'] < 0) return false;
if (bounds['right'] > viewWidth) return false;
if (bounds['bottom'] > viewHeight) return false;
return true;
}
我假设btn1
网页中存在一个id为的元素,并且还包括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);
有时,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();