要素の正しいオフセットを取得する方法は?--jQuery


88

これはおそらく本当に単純な質問ですが、jQueryで要素の正しいオフセットを取得するにはどうすればよいですか?

できます:

$("#whatever").offset().left;

そしてそれは有効です。

しかし、それは次のようです:

$("#whatever").offset().right 

は未定義です。

では、jQueryでこれをどのように達成するのでしょうか?

ありがとう!

回答:


163

アレックス、ゲイリー:

リクエストに応じて、回答として投稿された私のコメントは次のとおりです。

var rt = ($(window).width() - ($whatever.offset().left + $whatever.outerWidth()));

知らせてくれてありがとうございます。

次のように表現できる擬似コードの場合:

右のオフセットは次のとおりです。

ウィンドウのマイナス
(要素の左オフセットと要素の外側の幅


これはCSS変換では機能しません。オフセットは変換の影響を受けますが、outerWidth(およびwidth)は影響を受けません。
ジョナサン。

2
これは、ウィンドウの右側からのオフセットです。ウィンドウの左側からのオフセットについては、cdZの回答を参照してください。
2015年

要素の右端は、より「ネイティブに」見つけることができます$whatever[0].getBoundingClientRect().right。これは、ウィンドウの左端を基準にしています。
pstanton 2017年

ブレンドンありがとう。役立つ答え。

29
var $whatever        = $('#whatever');
var ending_right     = ($(window).width() - ($whatever.offset().left + $whatever.outerWidth()));

参照:.outerWidth()


1
幅はその後、左、2である場合、私は10であり、そして右の12が、11ではないそれらを追加する必要性を考えると、その後マイナス1
nonopolarity

31
これは間違った答えです。CSSでは、「左」は「ウィンドウ/親の左からの要素の左端のポイントのオフセット」を意味し、「右」は「ウィンドウ/親の右からの要素の右端のポイントのオフセット」を意味します。 "。だから、正しい答えは次のようになりますvar rt = ($(window).width() - ($whatever.offset().left + $whatever.outerWidth()));
ブレンドン・クロフォード

5
@BrendonCrawfordそのコメントを回答に移動する必要があります。
ゲイリー

3
通りかかった人へのメモ-上記の回答は、ブレンドンのコメントを正しく反映するように編集されています。
Chris Marasti-Georg 2012

16

おそらく私はあなたの質問を誤解していますが、オフセットはあなたに2つの変数を与えることになっています:水平と垂直。これは、要素の位置を定義します。だからあなたが探しているのは:

$("#whatever").offset().left

そして

$("#whatever").offset().top

要素の正しい境界がどこにあるかを知る必要がある場合は、次を使用する必要があります。

$("#whatever").offset().left + $("#whatever").outerWidth()

9

グレッグが言ったことへの単なる追加:

$( "#whatever")。offset()。left + $( "#whatever")。outerWidth()

このコードは、左側に対して正しい位置を取得します。(CSSrightプロパティを使用する場合のように)右側を基準にして右側の位置を取得することを目的とした場合は、次のようにコードを追加する必要があります。

$( "#parent_container")。innerWidth()-($( "#whatever")。offset()。left + $( "#whatever")。outerWidth())

このコードはright、CSSで最初にプロパティを設定できないときに、右側を固定アンカーとして設定する必要があるアニメーションで役立ちます。


6

実際、これらはウィンドウが左上の位置からまったくスクロールされていない場合にのみ機能します。
要素がページ上にとどまるように要素を再配置するのに役立つオフセットを取得するには、ウィンドウのスクロール値を減算する必要があります。

var offset = $('#whatever').offset();

offset.right = ($(window).width() + $(window).scrollLeft()) - (offset.left + $('#whatever').outerWidth(true));
offset.bottom = ($(window).height() + $(window).scrollTop()) - (offset.top + $('#whatever').outerHeight(true));

5

Brendon Crawfordがここで(コメントで)最良の答えを持っていたので、彼が答えるまで(そしておそらく少し拡大するまで)それを答えに移します。

var offset = $('#whatever').offset();

offset.right = $(window).width() - (offset.left + $('#whatever').outerWidth(true));
offset.bottom = $(window).height() - (offset.top + $('#whatever').outerHeight(true));

5

これをすぐに実現するネイティブDOMAPIがあります— getBoundingClientRect

document.querySelector("#whatever").getBoundingClientRect().right

2
ただし、getBoundingClientRectは、offset()が提供するドキュメントではなく、ビューポートを基準にして戻ります。
サイダバック2017

2

のアンカーポイントを取得するdiv/table (left) = $("#whatever").offset().left;-OK!

のアンカーポイントを取得するには、div/table (right)以下のコードを使用できます。

 $("#whatever").width();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.