resize
イベントは、ブラウザウィンドウのサイズが変更された際に発生するイベントです。主に画面サイズに応じてレイアウトを調整したり、コンテンツをリサイズする際に利用されます。今回は、resize
イベントの基本的な使い方から応用例までをまとめていきたいと思います。
resize
イベントは、ウィンドウのサイズが変更されたときに発生するイベントで、主にwindow
オブジェクトにバインドして使用します。例えば、レスポンシブデザインや、windowサイズに応じて動的に要素のレイアウトを変更する場合に役立ちます。
- 対象オブジェクト:
resize
イベントはwindow
オブジェクトでのみサポートされます。 - 発生頻度:ウィンドウサイズの変更中、イベントは頻繁に発生します。そのため、必要に応じてパフォーマンスを考慮した対策(例: デバウンスやスロットリング)が必要です。
以下は、ウィンドウサイズが変更されるたびに現在の幅と高さを表示する例です。
See the Pen resize() by tones (@tonescodedesign) on CodePen.
const sizeDisplay = document.getElementById('size');
function updateWindowSize() {
sizeDisplay.textContent = `ウィンドウサイズ: ${window.innerWidth}px × ${window.innerHeight}px`;
}
// イベントリスナーを追加
window.addEventListener('resize', updateWindowSize);
// 初期表示
updateWindowSize();
<p id="size">ウィンドウサイズ: なし</p>
この例では、resize
イベントを監視し、ウィンドウサイズの変化に応じて表示内容を更新しています。
次に、ウィンドウ幅に応じて背景色を変更する例を示します。
See the Pen Untitled by tones (@tonescodedesign) on CodePen.
function updateBackgroundColor() {
if (window.innerWidth < 600) {
document.body.style.backgroundColor = 'lightblue';
} else if (window.innerWidth < 900) {
document.body.style.backgroundColor = 'lightgreen';
} else {
document.body.style.backgroundColor = 'lightcoral';
}
}
// イベントリスナーを追加
window.addEventListener('resize', updateBackgroundColor);
// 初期表示
updateBackgroundColor();
body {
margin: 0;
font-family: Arial, sans-serif;
transition: background-color 0.3s;
}
このコードでは、ウィンドウサイズに応じて背景色を動的に変更しています。
resize
イベントは頻繁に発生するため、イベントハンドラーが高頻度で呼び出されるとパフォーマンスに悪影響を及ぼすことがあります。そのため、デバウンスという技術を使ってイベント処理を最適化します。
See the Pen resize() by tones (@tonescodedesign) on CodePen.
const debounceSizeDisplay = document.getElementById('debounceSize');
function debounce(func, delay) {
let timeoutId;
return function (...args) {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => func.apply(this, args), delay);
};
}
function updateDebouncedWindowSize() {
debounceSizeDisplay.textContent = `ウィンドウサイズ: ${window.innerWidth}px × ${window.innerHeight}px`;
}
const debouncedResizeHandler = debounce(updateDebouncedWindowSize, 200);
// イベントリスナーを追加
window.addEventListener('resize', debouncedResizeHandler);
// 初期表示
updateDebouncedWindowSize();
<p id="debounceSize">ウィンドウサイズ: なし</p>
この例では、debounce
関数を使用して、resize
イベントが発生してから200ミリ秒後にイベントハンドラーを実行するようにしています。
- 頻発するイベントに対する対策:
resize
イベントはウィンドウサイズが変わるたびに頻繁に発生します。そのため、パフォーマンスを考慮してデバウンスやスロットリングを活用することをおすすめします。 - CSSで対応できる場合はCSSを優先: レスポンシブデザインの多くは、
@media
クエリを使用したCSSで対応可能です。JavaScriptでの制御は、CSSだけでは対応できない場合に限定しましょう。 - イベントの解除: 不要になった場合、イベントリスナーを必ず解除することでメモリリークを防ぐことができます。例えば、
removeEventListener
を使用します。 - アクセシビリティ: ウィンドウサイズ変更時に視覚的な変化がある場合、スクリーンリーダー利用者には伝わりません。そのため、変更内容を明示的に通知する仕組み(例えば、ARIAライブリージョン)を導入することを検討してください。
resize
イベントは、ブラウザウィンドウのサイズ変更を検知して動的な動作を実装する際に非常に役立つイベントです。しかし、頻繁に発生するため、パフォーマンスに配慮した実装が重要です。また、単純なレスポンシブデザインはCSSで対応できる場合が多いことも覚えておくと良いでしょう。