offsetLeft
とoffsetTop
がすべてのブラウザーで正しく機能しないことを読みました。 jQuery.offset()
は、正しい値xbrowserを提供するためにこれを抽象化することになっています。
私がやろうとしているのは、要素が左上を基準としてクリックされた場所の座標を取得することです。
問題は、jQuery.offset().top
が実際にFFX 3.6で10進値を与えていることです(IEとChromeでは、2つの値が一致します)。
このフィドル は問題を示しています。下の画像をクリックすると、jQuery.offset().top
は327.5を返しますが、offsetTop
は328を返します。
offset()
は正しい値を返していると考えたいのですが、これはブラウザ間で機能するため、使用する必要があります。しかし、明らかにピクセルの小数をクリックすることはできません。 Math.round()
への真のオフセットを決定する適切な方法は、jQueryが返すオフセットですか?代わりにoffsetTop
を使用する必要がありますか、または他のメソッドを完全に使用する必要がありますか?
人々はハーフピクセルをクリックできないと言って正しいと思うので、個人的には、丸みのあるjQueryオフセットを使用します...
これが jQuery API Doc が.offset()
について言っていることです:
documentを基準にして、一致する要素のセット内の最初の要素の現在の座標を取得するか、すべての要素の座標を設定します。
これが MDN Web API が.offsetTop
について言うことです:
offsetTopは、offsetParentノードの上端に対する現在の要素の距離を返します
これは、jQuery v.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のフォールバックです(BTWはjQuery 2ではサポートされていません)docElem.clientTop
は、要素(この場合はドキュメント)の上境界線の幅ですelem.getBoundingClientRect()
は、 結論
element.offsetTop
を使用します。親のスクロールを考慮に入れる場合は、element.scrollTop
を追加します。 (または、jQuery 。position() を使用します(そのライブラリのファンの場合))element.getBoundingClientRect().top
を使用します。ドキュメントのスクロールを考慮に入れる場合は、window.pageYOffset
を追加します。文書にclientTop
を引く必要はありません。文書に境界線がない(通常は境界線がない)ので、documentelement.clientTop
を引きますこれを試してください:parseInt(jQuery.offset().top, 10)
offset
は、em
を測定単位として使用し、font-sizes
内の相対%
を使用して、非整数にすることができます。
また、offset
が100%
でない場合、zoom
は整数ではないかもしれないと理論化しますが、それはブラウザーがスケーリングを処理する方法に依存します。