offsetTop与jQuery.offset()。top
我已经读了offsetLeft
和offsetTop
在所有浏览器中都不能正常工作。 jQuery.offset()
应该为此提供一个抽象,以提供正确的值xbrowser。
我正在试图做的是获取单元相对于元素左上angular的位置的坐标。
问题是, jQuery.offset().top
实际上给了我一个FFX 3.6(在IE和Chrome中,这两个值匹配)的十进制值。
http://jsfiddle.net/htCPp/展示了这个问题。 如果你点击底部的图像, jQuery.offset().top
返回327.5,但是offsetTop
返回328。
我想认为offset()
返回正确的值,我应该使用它,因为它可以跨浏览器。 但是,人们显然不能点击小数点的像素。 正确的方法来确定Math.Round()
jQuery返回的偏移量的真正偏移? 我应该改用offsetTop
还是其他一些方法?
我认为你是正确的说,人们不能点击半像素,所以亲自,我会使用圆整的jQuery抵消…
这是jQuery API Doc关于.offset()
:
获取第一个元素的当前坐标,或设置匹配元素集合中每个元素相对于文档的坐标。
这就是MDN Web API所说的.offsetTop
:
offsetTop返回当前元素相对于offsetParent节点顶部的距离
这是什么jQuery v.1.11 .offset()
基本上做的时候得到coords:
var box = { top: 0, left: 0 }; // BlackBerry 5, iOS 3 (original iPhone) 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
直观地表示页面滚动了多less -
docElem.scrollTop
是IE <9的后备(在jQuery 2中是不支持的) -
docElem.clientTop
是元素顶部边框的宽度(本例中是文档) -
elem.getBoundingClientRect()
获取相对于文档视口的坐标(参见注释)。 它可能会返回分数值,所以这是你的错误的来源。 当页面放大时,它也可能导致IE <8的错误 。 为了避免小数值,尝试迭代地计算位置
结论
- 如果你想要坐标相对于父节点 ,使用
element.offsetTop
。 如果您想要考虑父滚动,请添加element.scrollTop
。 (如果你是该库的粉丝,可以使用jQuery .position() ) - 如果你想要coords相对于视口使用
element.getBoundingClientRect().top
。 如果要将文档滚动考虑在内,请添加window.pageYOffset
。 如果文档没有边框(通常不是),则不需要减去文档的clientTop
,因此您具有相对于文档的位置 - 如果不考虑元素边框作为元素的一部分,则减去
element.clientTop
试试这个: parseInt(jQuery.offset().top, 10)
offset
可能是一个非整数,使用em
作为度量单位,相对font-sizes
以%
。
我也推测,当zoom
不是100%
时, offset
可能不是一个整数,而是取决于浏览器如何处理缩放。
您可以使用parseInt(jQuery.offset().top)
在所有浏览器中始终使用Integer(primitive – int
)值。