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引数(ここでは200ms)が「止んだ」と判断する待機時間です。用途に合わせて調整してください。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 比較
| 比較項目 | jQuery | Vanilla JS |
|---|---|---|
| 依存ライブラリ | jQuery 必須 | 不要 |
| ウィンドウサイズ取得 | $(window).width() | window.innerWidth |
| イベント登録 | .resize(fn) | addEventListener('resize', fn) |
| 複数リスナー登録 | △ 上書きの可能性あり | ◎ 追加登録が安全 |
| ブラウザ対応 | IE8+ 対応可 | モダンブラウザ全般 |