【HTML】スクロールイベントを検知する方法【基本と応用】

【HTML】スクロールイベントを検知する方法【基本と応用】

スクロールイベントの基本

スクロールイベントとは、ユーザーがページをスクロールした際に発生するイベントのことです。主に以下の用途で使用されます:

  • スクロール位置の取得
  • スクロール方向の判定
  • 特定のスクロール量に達した際の処理
  • 遅延読み込み(Lazy Loading)
  • 無限スクロールの実装

scrollイベントリスナーの使い方

JavaScriptでスクロールイベントを検知するには、window オブジェクトに scroll イベントリスナーを設定します。


window.addEventListener("scroll", function() {
    console.log("スクロールされました!");
});
        

このコードを実行すると、ページをスクロールするたびにコンソールに「スクロールされました!」と表示されます。

スクロールの方向を検知する

スクロールの方向(上方向か下方向か)を判定するには、スクロール前後の位置を比較します。


let lastScrollY = window.scrollY;

window.addEventListener("scroll", function() {
    let currentScrollY = window.scrollY;
    if (currentScrollY > lastScrollY) {
        console.log("下にスクロール");
    } else {
        console.log("上にスクロール");
    }
    lastScrollY = currentScrollY;
});
        

このコードでは、前回のスクロール位置(lastScrollY)と現在のスクロール位置(currentScrollY)を比較し、スクロールの方向を判定します。

スクロール位置の取得

ページのスクロール位置を取得するには、window.scrollY を使用します。


window.addEventListener("scroll", function() {
    console.log("現在のスクロール位置: " + window.scrollY);
});
        

また、横方向のスクロール位置は window.scrollX で取得できます。

スクロールの進行度を取得

ページのスクロールの進行度を取得するには、document.documentElement.scrollHeightwindow.innerHeight を活用します。


window.addEventListener("scroll", function() {
    let scrollTop = window.scrollY;
    let scrollHeight = document.documentElement.scrollHeight - window.innerHeight;
    let scrollPercent = (scrollTop / scrollHeight) * 100;
    console.log("スクロール進行度: " + scrollPercent + "%");
});
        

無限スクロールの実装

無限スクロールを実装するには、スクロール位置がページの最下部に到達したかを判定します。


window.addEventListener("scroll", function() {
    if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) {
        console.log("最下部に到達!");
        // 新しいコンテンツを読み込む処理を追加
    }
});
        

遅延読み込み(Lazy Loading)の実装

画像やコンテンツを遅延読み込みするには、IntersectionObserver を使用する方法があります。


document.addEventListener("DOMContentLoaded", function() {
    let images = document.querySelectorAll("img.lazy");
    
    let observer = new IntersectionObserver(function(entries, observer) {
        entries.forEach(entry => {
            if (entry.isIntersecting) {
                let img = entry.target;
                img.src = img.dataset.src;
                img.classList.remove("lazy");
                observer.unobserve(img);
            }
        });
    });

    images.forEach(img => observer.observe(img));
});
        

このコードでは、クラス名 lazy が付いた画像がスクロールによって表示領域に入ったときに、data-src の値を src にセットして画像を読み込みます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です