jQueryで要素の位置を取得したり移動させるにはoffset()
を使います。
ページのトップへ戻るボタンなど、スクロール系のイベントでよく使いますね。
位置がズレたり、何故かエラーになる場合もご紹介します。
目次
offset() の基本
offset()
の使い方を見る前に、offset()
がどこを基準に位置を表示しているか見てみましょう。
offset() の起点
offset()
は以下のようにドキュメントの左上を起点にしています。
ブラウザの左上ではなく、ドキュメントの左上となります。
ですので、スクロールしたら起点はブラウザ上からは見えなくなります。
offset() で値を取得
次に値を取得してみましょう。
offset() で取得できる値
offset()
では、ドキュメントの左上の起点と、指定要素の左上の距離を取得します。
そして取得できる値は、上からの距離と左からの距離の2つのみで、右や下からの距離は取得できないので注意しましょう。
試しにoffset()
の中身をコンソールに出力してみましょう。
jQuery
1 2 3 4 5 6 7 8 9 |
$(function() { // 要素の位置を取得して変数に格納 var offset = $('span').offset(); // コンソールに表示 console.log(offset); }); |
結果(コンソール)
Object {top: 150, left: 50}
上記のようにtop
からの位置とleft
からの位置の2つのみが取得できていますね。
コンソールについては下記ページでご紹介しています。
top と left の値を出力
それでは、offset()
で上からと左からの距離をそれぞれコンソールに表示してみましょう。
jQuery
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$(function() { // topの位置を取得して変数に格納 var offsetTop = $('span').offset().top; // leftの位置を取得して変数に格納 var offsetLeft = $('span').offset().left; // コンソールにtopの位置を表示 console.log(offsetTop); // コンソールにleftの位置を表示 console.log(offsetLeft); }); |
結果(コンソール)
150
50
指定した<span>
要素のtop
left
の位置をそれぞれ取得できました。
ちなみに以下のように、出力時にtop
left
を付けることも可能です。
jQuery
1 2 3 4 5 6 7 8 9 10 11 12 |
$(function() { // 要素の位置を取得して変数に格納 var offset = $('span').offset(); // コンソールにtopの位置を表示 console.log(offset.top); // コンソールにleftの位置を表示 console.log(offset.left); }); |
上記のように、offset()
でtop
left
をまとめて変数に格納し、出力の際に.top
.left
を付けてそれぞれ出力することもできます。
offset() で要素を移動
offset()
は要素を指定位置に移動させることも可能です。
jQuery
1 2 3 4 5 6 7 8 9 10 11 12 |
$(function() { // offset()の引数に移動先の位置を指定 var offset = $('span').offset({top: 3000, left: 450}); // コンソールにtopの位置を表示 console.log(offset.top); // コンソールにleftの位置を表示 console.log(offset.left); }); |
結果(コンソール)
3000
450
offset()
の引数にオブジェクト形式で移動先の位置を指定するだけで、要素が移動しました。
以下の書式です。
$( 要素 ).offset( { top: topからの位置, left: leftからの位置 } )
offset() で位置がずれる
offset()
で画像を読み込む前に位置を取得してしまうことで、位置がずれる場合があります。
HTML
1 2 3 4 5 |
<!--読み込みに時間がかかる巨大な画像--> <p><img src="top.jpg" width="4912" height="3264"></p> <!--下記spanの位置を取得--> <p><span>要素の位置を取得</span></p> |
jQuery
1 2 3 4 5 6 7 8 9 10 |
// DOMが読み込まれたら実行させる $(function() { // 要素の位置を取得して変数に格納 var offset = $('span').offset(); // コンソールにtopの位置を表示 console.log(offset.top); }); |
結果(コンソール)
150
上記のように、巨大な画像が読み込まれてないまま offset()
で位置を取得してしまうため、画像サイズ分ずれて取得してしまいます。
下記のように、画像を読み込んだ後に実行するようにしましょう。
jQuery
1 2 3 4 5 6 7 8 9 10 |
// 画像が読み込まれたら実行させる $(window).load(function() { // 要素の位置を取得して変数に格納 var offset = $('span').offset(); // コンソールにtopの位置を表示 console.log(offset.top); }); |
結果(コンソール)
3414
上記のように、画像の高さが含まれた位置が取得できましたね。
jQueryを読み込むタイミングを以下のようにしました。
DOM読み込み時(よく使われる)
1 2 |
// DOMが読み込まれたら実行させる $(function() { |
↓
画像も読み込んだ後
1 2 |
// 画像が読み込まれたら実行させる $(window).load(function() { |
画像のサイズを取得する場合などは、上記のように 画像も読み込んだ後に実行するようにしましょう。
参考:jQueryのready()やload()のタイミングの違い
undefined や 0 になる
undefined
のエラーが出てしまう場合は以下のような原因が考えられます。
指定要素に css で display: none; を設定している
display: none;
を指定した要素はoffset()
では0
となり、位置を取得できません。
ただしopacity: 0;
で透明化した要素は取得できるようです。
window をセレクタに指定している
以下のようにwindow
やdocument
をセレクタに指定するとundefined
(未定義)エラーとなります。
$(window).offset();