ウィンドウのリサイズ完了を検知する方法

jQuery と Vanilla JS それぞれで、リサイズが「終わった瞬間」だけ処理を実行する debounce パターンを解説します。

jQuery の.resize() イベントを使う場合

.resize() イベントはリサイズ中に何十回も連続して発火します。重い処理(レイアウト再計算・Ajax など)をそのまま登録すると、スクロールのカクつきやパフォーマンス低下の原因になります。

解決策は debounce(遅延実行)パターン。リサイズイベントが来るたびにタイマーをリセットし、一定時間(例: 200ms)止んだら初めて処理を実行します。

var finishResize = function() { var timer = false; var $window = $(window); var windowW = $window.width(); var windowH = $window.height(); $window.resize(function() { // タイマーが動いていたらリセット if (timer !== false) { clearTimeout(timer); } // リサイズが 200ms 止んだら実行 timer = setTimeout(function() { windowW = $window.width(); windowH = $window.height(); console.log('リサイズ完了:', windowW, 'x', windowH); // ↑ ここにリサイズ完了後の処理を記述 }, 200); });};finishResize();
JavaScript
  • リサイズイベントが発火するたびに clearTimeout で前のタイマーをキャンセルします。
  • setTimeout の第2引数(ここでは 200 ms)が「止んだ」と判断する待機時間です。用途に合わせて調整してください。
  • windowW / windowH をクロージャ内で保持しているので、他の処理からも参照できます。

jQuery なしで同じことをする

jQuery が不要な場合は addEventListener と window.innerWidth / innerHeight で全く同じ挙動を実現できます。モダンブラウザは全て対応済みです。

(function() { let timer = null; let windowW = window.innerWidth; let windowH = window.innerHeight; window.addEventListener('resize', () => { // タイマーが動いていたらリセット if (timer !== null) { clearTimeout(timer); } // リサイズが 200ms 止んだら実行 timer = setTimeout(() => { windowW = window.innerWidth; windowH = window.innerHeight; console.log('リサイズ完了:', windowW, 'x', windowH); // ↑ ここにリサイズ完了後の処理を記述 }, 200); });})();
JavaScript
  • 即時関数 (function(){...})() でスコープを閉じているので、グローバル汚染がありません。
  • window.innerWidth / innerHeight は jQuery の .width() / .height() に相当する標準プロパティです。
  • addEventListener はコールバックを複数登録できるため、既存の resize リスナーを壊しません。

jQuery vs Vanilla JS 比較

比較項目jQueryVanilla JS
依存ライブラリjQuery 必須不要
ウィンドウサイズ取得$(window).width()window.innerWidth
イベント登録.resize(fn)addEventListener('resize', fn)
複数リスナー登録△ 上書きの可能性あり◎ 追加登録が安全
ブラウザ対応IE8+ 対応可モダンブラウザ全般

read next