【jQuery】指定した要素の幅・高さを取得する完全ガイド|width/height・innerWidth・outerWidth・getBoundingClientRect比較まで

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で 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の値が違います。
Abox-sizing: border-box を設定している場合、CSSの width はborderを含む値になります。jQueryの width() はコンテンツ幅(paddingとborderを除く)を返すため、値が異なります。実際に画面に表示されている幅は outerWidth() または getBoundingClientRect().width で確認してください。
Q要素が画面内に見えているかを判定したいです。
AgetBoundingClientRect() で判定できます:var rect = el.getBoundingClientRect(); var isVisible = rect.top < window.innerHeight && rect.bottom > 0;または IntersectionObserver を使うとより効率的にスクロール監視できます。
Q要素のサイズが変わったときに検知したいです。
AResizeObserver を使うと要素単位でサイズ変化を監視できます:new ResizeObserver(entries => { console.log(entries[0].contentRect); }).observe(el)jQueryのresizeイベントはwindowにしか使えないため、要素監視にはResizeObserverが適切です。
Qテキストの高さ(行の高さ)を取得したいです。
A$(el).css("line-height") で行の高さを取得できます。テキストが折り返している場合の実際の高さは outerHeight() で取得できます。単一行のテキストだけを含む要素なら outerHeight() が行の高さになります。