JavaScriptのwheel
イベントは、マウスホイールの動作を検知して処理を実行するためのイベントです。ページスクロールの制御やカスタムのスクロール効果を実装する際に便利なイベントで、デスクトップ環境では特に頻繁に使用されます。今回は、wheel
イベントの基本的な使い方から注意点までをまとめていきたいと思います。
目次 非表示
wheel
イベントは、マウスホイールやタッチパッドのスクロール操作を検知するためのイベントです。スクロールの方向や量を取得できるため、ページのスクロールだけでなく、独自のインタラクションを実現する際にも活用できます。
- デフォルトでは、
wheel
イベントはページのスクロールに関連付けられています。 - イベントオブジェクトからスクロール量や方向を取得できます。
- スムーズなスクロール処理を実現するには、適切なデバウンス処理を行う必要があります。
以下のように、要素にwheel
イベントリスナーを追加して使用します。
element.addEventListener('wheel', (event) => {
console.log('スクロール検知:', event.deltaY);
});
wheel
イベントのイベントオブジェクトには、次のような重要なプロパティがあります。
deltaY
: 縦方向のスクロール量(正値は下方向、負値は上方向)deltaX
: 横方向のスクロール量(正値は右方向、負値は左方向)deltaMode
: スクロール量の単位(1なら行単位、0ならピクセル単位)
次の例では、スクロール量をコンソールに表示します。
See the Pen wheel() by tones (@tonescodedesign) on CodePen.
const scrollArea = document.getElementById('scrollArea');
scrollArea.addEventListener('wheel', (event) => {
console.log(`スクロール量: ${event.deltaY}`);
});
<div class="scroll-area" id="scrollArea">
<p>この領域でマウスホイールを動かしてみてください。</p>
<p>スクロールの動作が検知されます。</p>
<p>サンプルのテキストを追加します。</p>
<p>サンプルのテキストを追加します。</p>
<p>サンプルのテキストを追加します。</p>
<p>サンプルのテキストを追加します。</p>
</div>
.scroll-area {
width: 300px;
height: 200px;
overflow: auto;
border: 1px solid #ccc;
padding: 10px;
}
このコードでは、指定した領域内でのスクロール動作を検知し、スクロール量をコンソールに出力します。
以下は、wheel
イベントを使って画像の拡大縮小を実現する例です。
See the Pen wheel() by tones (@tonescodedesign) on CodePen.
const image = document.getElementById('zoomImage');
let scale = 1;
image.addEventListener('wheel', (event) => {
event.preventDefault();
// スクロール方向に応じて拡大縮小
scale += event.deltaY * -0.01;
scale = Math.min(Math.max(0.5, scale), 2); // 最小0.5倍、最大2倍に制限
image.style.transform = `scale(${scale})`;
});
<div class="image-container">
<img src="https://placehold.jp/150x150.png" alt="サンプル画像" id="zoomImage">
</div>
.image-container {
width: 300px;
height: 300px;
overflow: hidden;
border: 1px solid #ccc;
display: flex;
justify-content: center;
align-items: center;
}
.image-container img {
width: 100%;
height: auto;
transition: transform 0.1s;
}
このコードでは、マウスホイールの上下操作によって画像のズームイン・ズームアウトが行えます。
wheel
イベントをカスタマイズして使用する場合は、event.preventDefault()
を適切に使用してブラウザのデフォルトのスクロール動作を無効化する必要があります。ただし、無効化しすぎるとユーザー体験を損なう可能性があるため、適切な場面で使用してください。
wheel
イベントは高頻度で発生するため、パフォーマンスに影響を与える場合があります。デバウンスやスロットリングを実装して、不要な処理を防ぎましょう。
let timeout;
window.addEventListener('wheel', (event) => {
clearTimeout(timeout);
timeout = setTimeout(() => {
console.log('デバウンス処理: ', event.deltaY);
}, 100);
});

スクロール操作がキーボードやタッチ操作では利用できない場合があります。wheel
イベントを使う際には、キーボードやタッチ操作に代替手段を提供しましょう。
wheel
イベントを使用することで、ユーザーのスクロール動作に応じたインタラクションを実現できます。基本的なスクロール処理だけでなく、ズームやカスタムアニメーションなど、多くの応用が可能です。