jQueryで要素のサイズを取得する際、width()・innerWidth()・outerWidth()の違いや、画面スクロール後の正確な位置取得など、混乱しがちなポイントが多くあります。この記事では各メソッドの違い・実用的なサイズ取得パターン・レスポンシブ対応・getBoundingClientRectとの比較まで解説します。
この記事でわかること
- width() / innerWidth() / outerWidth() の違いを理解する
- ウィンドウ・ドキュメント全体のサイズを取得する
- リサイズ時にサイズを再取得する(debounce対応)
- 非表示要素のサイズを取得する
- getBoundingClientRect() との使い分け
width・innerWidth・outerWidth の違い
| メソッド | 含まれるもの | 主な用途 |
|---|---|---|
width() |
コンテンツ幅のみ | コンテンツ領域のサイズを知りたいとき |
innerWidth() |
コンテンツ + padding | padding込みのサイズが必要なとき |
outerWidth() |
コンテンツ + padding + border | 実際に画面に占める幅(通常はこれ) |
outerWidth(true) |
コンテンツ + padding + border + margin | 要素間隔込みのレイアウト計算 |
同様に高さは height()・innerHeight()・outerHeight() があります。
基本的なサイズ取得
$(function () {
var $box = $('#target-box');
console.log('width: ', $box.width()); // コンテンツ幅
console.log('innerWidth: ', $box.innerWidth()); // + padding
console.log('outerWidth: ', $box.outerWidth()); // + padding + border
console.log('outerWidth(margin):', $box.outerWidth(true)); // + margin も含む
console.log('height: ', $box.height());
console.log('innerHeight: ', $box.innerHeight());
console.log('outerHeight: ', $box.outerHeight());
});
box-sizing: border-box の場合に注意
CSSで
CSSで
box-sizing: border-box を設定している場合、width() が返すのはborderを含む幅になります(ブラウザのCSS仕様に準拠)。正確にはブラウザの開発者ツールで確認するか、getBoundingClientRect() を使うことを推奨します。ウィンドウ・ドキュメント全体のサイズを取得する
$(function () {
// ブラウザのビューポート(見えている領域)
var vw = $(window).width();
var vh = $(window).height();
console.log('ビューポート:', vw, 'x', vh);
// ドキュメント全体(スクロール可能な全領域)
var dw = $(document).width();
var dh = $(document).height();
console.log('ドキュメント全体:', dw, 'x', dh);
// スクロール位置
var scrollTop = $(window).scrollTop();
console.log('スクロール位置:', scrollTop);
});
リサイズ時にサイズを再取得する(debounce対応)
ウィンドウサイズ変更時にレイアウトを調整するパターンです。resize イベントは高頻度で発火するため debounce で間引きを行います。
function debounce(fn, delay) {
var timer;
return function () {
clearTimeout(timer);
timer = setTimeout(fn, delay);
};
}
$(function () {
function onResize() {
var w = $(window).width();
var h = $(window).height();
console.log('リサイズ後のサイズ:', w, 'x', h);
// 例: ウィンドウ幅に応じて要素の高さを調整
if (w < 768) {
$('#sidebar').height('auto');
} else {
$('#sidebar').height($('#main').outerHeight());
}
}
$(window).on('resize', debounce(onResize, 200));
onResize(); // 初回実行
});
非表示要素のサイズを取得する
display:none の要素は width() が 0 を返します。一時的に可視化してサイズを取得する方法です。
$(function () {
function getHiddenSize($el) {
// 見えない形で一時的に可視化
var $clone = $el.clone().css({
visibility: 'hidden',
display: 'block',
position: 'absolute',
top: '-9999px'
}).appendTo('body');
var size = {
width: $clone.outerWidth(),
height: $clone.outerHeight()
};
$clone.remove();
return size;
}
var size = getHiddenSize($('#hidden-panel'));
console.log('非表示要素のサイズ:', size.width, 'x', size.height);
});
getBoundingClientRect() との使い分け
$(function () {
var el = document.getElementById('target-box');
var rect = el.getBoundingClientRect();
console.log('幅(含border):', rect.width);
console.log('高さ(含border):', rect.height);
console.log('ビューポート上端からの距離:', rect.top);
console.log('ビューポート左端からの距離:', rect.left);
console.log('右端のx座標:', rect.right);
console.log('下端のy座標:', rect.bottom);
// ドキュメント全体での絶対位置
var scrollTop = window.pageYOffset || document.documentElement.scrollTop;
var scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;
var absTop = rect.top + scrollTop;
var absLeft = rect.left + scrollLeft;
console.log('ドキュメント基準の絶対位置:', absTop, absLeft);
});
| 方法 | 特徴 | 使い所 |
|---|---|---|
outerWidth() |
jQuery・整数値・スクロール位置影響なし | 要素サイズの取得が主目的 |
getBoundingClientRect() |
バニラJS・小数点精度・ビューポート基準の位置も取得 | アニメーション・交差判定・精密なレイアウト計算 |
offset() |
jQuery・ドキュメント基準の位置 | 要素の絶対座標(ページ内位置) |
まとめ
jQueryで要素のサイズを取得する際のポイントをまとめます。
width(): コンテンツ幅、innerWidth(): +padding、outerWidth(): +border- ウィンドウサイズ:
$(window).width()(ビューポート)/$(document).width()(全体) - リサイズ監視: debounceで間引き(200ms推奨)
- 非表示要素: cloneして一時表示 → サイズ取得 → 削除
- 精密な位置計算:
getBoundingClientRect()が高精度
関連記事: ヘッダーの高さを取得してコンテンツ位置を調整する方法 / スムーズスクロール完全ガイド
よくある質問(FAQ)
Qwidth()が0を返します。
A主な原因は2つです。①要素が
display:noneの場合(本記事の非表示要素取得を参照)。②DOM読み込み前に実行している場合($(function(){}) または $(document).ready() 内で実行してください)。動的に追加された要素は追加後に取得してください。QouterWidth()とCSSのwidthの値が違います。
A
box-sizing: border-box を設定している場合、CSSの width はborderを含む値になります。jQueryの width() はコンテンツ幅(paddingとborderを除く)を返すため、値が異なります。実際に画面に表示されている幅は outerWidth() または getBoundingClientRect().width で確認してください。Q要素が画面内に見えているかを判定したいです。
A
getBoundingClientRect() で判定できます:var rect = el.getBoundingClientRect(); var isVisible = rect.top < window.innerHeight && rect.bottom > 0;または IntersectionObserver を使うとより効率的にスクロール監視できます。Q要素のサイズが変わったときに検知したいです。
A
ResizeObserver を使うと要素単位でサイズ変化を監視できます:new ResizeObserver(entries => { console.log(entries[0].contentRect); }).observe(el)jQueryのresizeイベントはwindowにしか使えないため、要素監視にはResizeObserverが適切です。Qテキストの高さ(行の高さ)を取得したいです。
A
$(el).css("line-height") で行の高さを取得できます。テキストが折り返している場合の実際の高さは outerHeight() で取得できます。単一行のテキストだけを含む要素なら outerHeight() が行の高さになります。
