这就是jQuery API Doc所说的.offset()
:
获取第一个元素的当前坐标,或设置匹配元素集中相对于document的每个元素的坐标。
这就是MDN Web API所说的.offsetTop
:
offsetTop返回当前元素相对于offsetParent节点顶部的距离
这是jQuery v.1.11.offset()
在获取坐标时的基本操作:
var box = { top: 0, left: 0 };
if ( typeof elem.getBoundingClientRect !== strundefined ) {
box = elem.getBoundingClientRect();
}
win = getWindow( doc );
return {
top: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ),
left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
};
pageYOffset
直观地说页面滚动了多少
docElem.scrollTop
是IE <9的后备(jQuery 2不支持BTW)
docElem.clientTop
是元素顶部边框的宽度(在这种情况下为文档)
elem.getBoundingClientRect()
获取相对于文档 视口的坐标(请参见注释)。它可能返回分数值,因此这是您的错误的来源。缩放页面时,它也可能导致IE <8中的错误。为了避免分数值,请尝试迭代计算位置
结论
- 如果要相对于父节点的坐标,请使用
element.offsetTop
。element.scrollTop
如果要考虑父级滚动,请添加。(如果您是该库的粉丝,请使用jQuery .position())
- 如果要相对于视口的坐标,请使用
element.getBoundingClientRect().top
。window.pageYOffset
如果要考虑文档滚动,请添加。clientTop
如果文档没有边框(通常没有边框),则无需减去文档的数量,因此您具有相对于文档的位置
element.clientTop
如果您不将元素边框视为元素的一部分,则减去