offsetTop与jQuery.offset()。top

我已经读了offsetLeftoffsetTop在所有浏览器中都不能正常工作。 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 )值。