時給単価UP【3大特典付き】
コーディングテクニック集100選⋙

【jQuery】スクロール時に現在地ナビにクラス付与【カレント】

記事内に広告を含みます

パソ君
パソ君

・スクロールしたら現在地のナビメニューにクラス付与したい。どうやる?

こんな疑問にお答えします。

案件によっては、ヘッダーを固定することがありますよね。

その場合、今いる現在地のナビメニューに対してボーダーをつけたりしたいはず。

要は下記みたいなことですね↓

これ実は簡単に実装できちゃいます。

ジト
ジト

すぐにできるよ!

ということで、この記事では「スクロール時に現在地ナビにクラス付与」について解説していきます!

この記事でわかること

スクロール時に現在地ナビにクラス付与

【jQuery】スクロール時に現在地ナビにクラス付与【カレント】

そんなスクロールしたら現在地ナビにクラス付与するサンプルがこちら↓

See the Pen スクロールしたら現在地ナビにクラス付与➀ by jito-coder (@jito-coder) on CodePen.

スクロールしてみてください!
現在地のナビメニューにボーダーがついてますよね。

新たにクラスを付与し、CSSを適用して実装しております。

実装の重要な点がこちら↓

  1. リンクとidを一致させる
  2. ナビメニューにjs用のクラスをつけておく
  3. セクション毎にjs用のクラスをつけておく
  4. jQueryで現在地にクラス付与するコード記述
  5. CSSでクラス付与した場合の装飾を記述

順に見ていきましょう。

➀:リンクとidを一致させる

まずナビメニューのリンク先と、idを一致させておきましょう。

<li class="nav-test__item"><a href="#service" class="link">サービス</a></li>
<section class="test service" id="service">

上記でいうとリンク先が「#service」で、id名が「service」としています。

➁:ナビメニューにjs用のクラスをつけておく

続いてナビメニューにjs用のクラスをつけておきましょう。

これは保守性を上げるためですね。

<li class="nav-test__item js-nav"><a href="#service" class="link">サービス</a></li>
<li class="nav-test__item js-nav"><a href="#works" class="link">実績</a></li>
<li class="nav-test__item js-nav"><a href="#voice" class="link">お客様の声</a></li>
<li class="nav-test__item js-nav"><a href="#contact" class="link">お問い合わせ</a></li>

今回は例として「js-nav」というクラスをつけておきました。

➂:セクション毎にjs用のクラスをつけておく

続いてセクション毎にもjs用のクラスをつけておきます。

これも保守性を上げるため。

そして「そのセクションに行ったらクラスをつける」というイベントを実装するためにです。

<section class="js-section test service" id="service">
    <!-- セクション中身が入ります -->
</section>
<section class="js-section test works" id="works">
    <!-- セクション中身が入ります -->
</section>
<section class="js-section test voice" id="voice">
    <!-- セクション中身が入ります -->
</section>
<section class="js-section test contact" id="contact">
    <!-- セクション中身が入ります -->
</section>

今回は例として「js-section」というクラスをつけました。

➃:jQueryで現在地にクラス付与するコード記述

ここが一番重要ですね。

現在地のナビメニューに対して、新たにクラス付与するコードをjQueryで記述します。

そんなコードがこちら↓

$(function () {
    $(window).on("load scroll resize", function () {
        var st = $(window).scrollTop();
        var wh = $(window).height();
        $(".js-nav a").removeClass("active");
        $('.js-section').each(function (i) {
            var tg = $(this).offset().top;
            var id = $(this).attr('id');
            if (st > tg  - wh + (wh / 2)) {
                $(".js-nav a").removeClass("active");
                var link = $(".js-nav a[href *= " + id +"]");
                $(link).addClass("active");
            }
        });
    });
});

意味を簡単に説明すると
『スクロール位置がセクションの位置を超えた場合、対応するリンクに「active」というクラスを付ける』
という感じ。

対応するリンクを判断するためにも、➀~➂までにしたことが重要になります。

リンクとidを一致させたり、js用のクラス名をつけたりですね。

このコードにより現在地のナビメニューに対して「active」というクラスがつきました。

➄:CSSでクラス付与した場合の装飾を記述

あとは新たについた「active」というクラスに対して、CSSで装飾すれば完成です。

ここは案件やデザインカンプごとに、カスタマイズする感じになります。

今回は例として下記を指定しました↓

.l-header .nav-test__item .link::before {
  content: "";
  width: 100%;
  height: 3px;
  background-color: #000066;
  position: absolute;
  bottom: 0px;
  left: 0;
  transform: scale(0, 1);
  transform-origin: right top;
  transition: transform 0.5s;
}
.l-header .nav-test__item .link.active::before {
  transform-origin: left top;
  transform: scale(1, 1);
}

「active」がついたら、左から線が拡大するという指定です。

これでスクロールしたら現在地ナビに線をつけることができました。

See the Pen スクロールしたら現在地ナビにクラス付与➀ by jito-coder (@jito-coder) on CodePen.

【jQuery】スクロール時に現在地ナビにクラス付与【カレント】:まとめ

  • 判断用のjs用クラスをHTMLにつけておく
  • jQueryでスクロールしたら現在地ナビに新たなクラスをつける
  • CSSで新たなクラスに対して装飾する
ジト
ジト

スクロールしたら現在地ナビにクラス付与したいときに試してみてね!

コメントを残す

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

CAPTCHA