JavaScriptでスクロールに応じて要素を表示・非表示する方法

JavaScriptでスクロールに応じて要素を表示・非表示する方法

現在のウェブサイトは、スクロールするとアイテムが表示されたり非表示になったりする機能が使われることが多いです。本記事では、JavaScriptのスクロールイベントを使って要素を表示・非表示する方法を解説します。

実装のポイント

スクロールによって、要素を表示したり非表示にする場合は、一般的に次の歩が必要です。

  1. HTMLとCSSの準備 … 表示・非表示を制御するためのスタイルを設定する。
  2. JavaScriptのコードscroll イベントでスクロール位置を検出し、条件を満たしたら要素を表示・非表示する。

HTMLとCSSの準備

まず、HTMLとCSSでベースを作成します。

HTML

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>スクロールで表示・非表示</title>
  <style>
    body {
      height: 2000px; /* スクロール用の高さ */
    }
    #target {
      opacity: 0; /* 初期は非表示 */
      transition: opacity 1s ease-in-out; /* フェードイン効果 */
      background-color: lightblue;
      text-align: center;
      padding: 20px;
      margin-top: 1000px; /* スクロール位置 */
    }
    #target.visible {
      opacity: 1; /* 表示するとき */
    }
  </style>
</head>
<body>
  <h1>スクロールで要素を表示・非表示する方法</h1>
  <p>スクロールして要素を表示、トップで再度非表示にします。</p>
  <div id="target">ここで表示されます!</div>

  <script>
    document.addEventListener("DOMContentLoaded", function () {
      const target = document.getElementById("target");
      const targetPosition = target.offsetTop - window.innerHeight / 2;

      window.addEventListener("scroll", function () {
        const scrollPosition = window.scrollY;

        // 条件を満たしたら表示
        if (scrollPosition > targetPosition) {
          target.classList.add("visible");
        } 
        // トップに戻ったら非表示
        else {
          target.classList.remove("visible");
        }
      });
    });
  </script>
</body>
</html>

JavaScriptの解説

  1. scroll イベントの正使用
  • window.addEventListener("scroll", ...) でスクロールを検出します。
  1. 要素の表示条件を設定
  • scrollY の値と要素の位置を比較して、visibleクラスを加えます。
  1. トップに戻ったら非表示する動作
  • 条件を満たさない場合は、classList.remove("visible") でクラスを削除します。
  1. CSSのアニメーション効果
  • opacity を利用し、表示・非表示にフェード効果を適用します。

動作の確認

  1. ページをロードし、スクロールして位置を確認します。
  2. 要素が指定の位置に達すると、フェードインしながら表示されます。
  3. スクロールを戻すと、要素が再び非表示になります。

まとめ

JavaScriptのscrollイベントを使うと、要素の表示・非表示を簡単に制御できます。
この技術は、アイテムのロードアニメーションやショーケースでよく使われる技術です。