JavaScriptで特定の場所までスクロールしたら要素にクラスを追加する方法

特定の場所までスクロールしたら処理を発動させる方法

Webサイトを運営していると、「特定のセクションまでスクロールしたら、ヘッダーの色を変えたい」「途中からサイドバーを追従させたい」といった動きを実装したい場面がありますよね。

今回は、JavaScript (jQuery) を使って、指定した要素の位置までスクロールしたら、特定の要素(例:ヘッダー)にCSSクラスを追加・削除する方法をご紹介します。

デモ:スクロールでヘッダーの色が変わる

まずは実際の動作デモをご覧ください。下にスクロールしていき、2つ目のセクション(「切り替えポイント」)が画面上部に達すると、ヘッダーの背景色が変わります。

実装コード (JavaScript / jQuery)

使用するコードは以下の通りです。この例ではjQueryを使用しています。


const fix_items = $('#header'); // スタイルを変更したい要素(ヘッダー)
const switch_point = $('.js-switch_point').offset().top; // 切り替えの目印となる要素の高さ(ページ上端からの距離)を取得

$(window).on("scroll", function() {
  // ウィンドウのスクロール量をチェック
  if ($(this).scrollTop() > switch_point) {
    // スクロール量が切り替えポイントを超えたら 'fix' クラスを追加
    fix_items.addClass('fix');
  } else {
    // スクロール量が切り替えポイントより上に戻ったら 'fix' クラスを削除
    fix_items.removeClass('fix');
  }
});

※別途CSSで.fixクラスのスタイル(例:background-color: #333;など)を定義しておく必要があります。

コードの解説:処理のキーポイント

このJavaScriptコードの重要なポイントは、以下の2点です。

1. 切り替えポイントの高さを取得する

const switch_point = $('.js-switch_point').offset().top;

.offset().topは、指定した要素(ここでは.js-switch_point)が、ページの最上部からどれだけ離れているかの距離(Y座標)を取得するメソッドです。この値が、スクロールイベントを発動させる「しきい値」となります。

2. スクロール量を監視し、クラスを切り替える


$(window).on("scroll", function() {
  if ($(this).scrollTop() > switch_point) {
    // ...
  }
});

$(window).on("scroll", ...)で、ブラウザのスクロールイベントを監視します。

$(this).scrollTop()は、ユーザーが現在どれだけページを垂直にスクロールしたかの値を取得します。

if文を使って、「現在のスクロール量(scrollTop())」が「取得しておいた切り替えポイントの高さ(switch_point)」を超えたかどうかを判定し、クラスの追加(addClass)と削除(removeClass)を行っています。

まとめ

今回は、jQueryのoffset().topscrollTop()を利用して、特定の位置までスクロールしたらCSSクラスを変更する方法を解説しました。ヘッダーのスタイル変更だけでなく、スクロールに応じてアニメーションを発動させたり、特定のUIを表示させたりと、幅広く応用できるテクニックです。ぜひあなたのWebサイト制作に役立ててください。

よくある質問(FAQ)

Q. JavaScript(jQuery)を使わずに、CSSだけで似たようなことはできますか?

A. 要素を画面上部に固定するだけであれば、CSSのposition: sticky;を使用することで、JavaScriptなしで実装できる場合があります。ただし、この記事のように「特定の位置を通過したら別の要素のスタイルを変える」といった複雑な連動処理は、JavaScript(またはIntersection Observer API)を使用するのが一般的です。

Q. offset().top とは何ですか?

A. jQueryのメソッドの一つで、選択した要素の「ドキュメント(ページ全体)の左上端」を基準とした相対的なY座標(上からの距離)を取得します。似たメソッドにposition().topがありますが、こちらは親要素からの相対位置を取得する点で異なります。ページ全体のスクロール位置を基準にする場合はoffset().topが便利です。

Q. ヘッダー以外(例:サイドバー)にも応用できますか?

A. はい、もちろん可能です。コード内のconst fix_items = $('#header');で指定しているセレクタ(#header)を、スタイルを変更したい任意の要素(例:サイドバーのIDやクラス)に変更するだけで応用できます。同様に、切り替えの基準点(.js-switch_point)も、ページ内の任意の位置にある要素を指定できます。

CONTACT

webサイト制作、デザインに関するご相談、御見積のご依頼など、弊社へのお問い合わせはこちら