offsetTopとjQuery.offset()。top


82

私はそれを読みましたが、すべてのブラウザで正しく動作するわけではoffsetLeftありoffsetTopません。 jQuery.offset()正しい値xbrowserを提供するために、これを抽象化することになっています。

私がやろうとしているのは、要素の左上を基準にして要素がクリックされた場所の座標を取得することです。

問題はjQuery.offset().top、FFX 3.6で実際に10進値が表示されることです(IEとChromeでは、2つの値が一致します)。

このフィドルは問題を示しています。下の画像をクリックすると、jQuery.offset().top327.5がoffsetTop返されますが、328が返されます。

それがoffset()正しい値を返していると思います。ブラウザ間で機能するので、それを使用する必要があります。ただし、人々は明らかにピクセルの小数をクリックすることはできません。Math.round()jQueryが返すオフセットに対する真のオフセットを決定する適切な方法はありますか?offsetTop代わりに使用する必要がありますか、それとも他の方法を完全に使用する必要がありますか?

回答:


15

人々は半分のピクセルをクリックできないと言っているのは正しいと思うので、個人的には、丸められたjQueryオフセットを使用します...


4
CSSズームを使用するとjQueryオフセットにバグが発生する
Mladen Janjetovic 2014年

77

これはjQueryAPIDocが言っていること.offset()です:

ドキュメントを基準にして、一致した要素のセット内の最初の要素の現在の座標を取得するか、すべての要素の座標を設定します

これはMDNWebAPIが言っていること.offsetTopです:

offsetTopは、offsetParentノードの上部を基準にした現在の要素の距離を返します。

これは、jQueryv.1.11が座標を.offset()取得するときに基本的に行うことです。

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 ページがどれだけスクロールされたかを直感的に示します
  • docElem.scrollTop IE <9のフォールバックです(jQuery 2ではサポートされていません)
  • docElem.clientTop 要素(この場合はドキュメント)の上部の境界線の幅です
  • elem.getBoundingClientRect()ドキュメント ビューポートに関連する座標を取得します(コメントを参照)。小数値が返される場合があるため、これがバグの原因です。また、ページをズームすると、IE <8でバグが発生する可能性があります。小数値を避けるために、位置を繰り返し計算してみてください

結論

  • 親ノードを基準にした座標が必要な場合は、を使用しますelement.offsetTopelement.scrollTop親のスクロールを考慮に入れたい場合は追加します。(またはjQuery .position()を使用します、そのライブラリのファンである場合は、ください)
  • ビューポートに関連する座標が必要な場合は、を使用しますelement.getBoundingClientRect().topwindow.pageYOffsetドキュメントのスクロールを考慮に入れる場合は追加します。clientTopドキュメントに境界線がない場合(通常は境界線がない場合)、ドキュメントを差し引く必要はないため、ドキュメントに対する相対的な位置があります
  • element.clientTop要素の境界を要素の一部と見なさない場合は減算します

Element.getBoundingClientRect()ドキュメントではなく、ビューポートに関連する位置を示します
Klaus

@クラウス:違いは正確に何ですか?
–JanTuroň 2017

2
@JanTuroň:違いは、ドキュメントの「真の上部」ではなく、ブラウザウィンドウの上部を基準にしていることです。たとえば、ウィンドウの上部を超えて上部をスクロールすると、負の値が返されます。
ライアンバドール2017


2

それは可能性があるoffset使用、非整数とすることができるem測定装置として、相対的font-sizes%

またtheoriseことを私offsetときかもしれないが、全体数ではないzoomではありません100%が、それは、ブラウザのハンドルがスケーリング方法によって決まります。


2
ズームが100%でない場合、offset()。topは他の問題を多数発生させます... bugs.jquery.com/ticket/8362
commonpike

-1

を使用parseInt(jQuery.offset().top)して、intすべてのブラウザで常に整数(プリミティブ- )値を使用できます。


1
parseInt()は、それらを2倍にするか、切り捨てますか?
爆発の丸薬2011

数値の整数部分を取るだけで、すべてのブラウザで同じになります。
ShankarSangoli 2011

OPは、あるブラウザでは327.5を返し、別のブラウザでは328を与えると述べています。したがって、整数部分を取る(切り捨てる)場合、OP自体はすべてのブラウザで同じではない例です。この例では、少なくとも両方が同じ数を与えるために丸める必要があります。
Jimbo Jonny 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.