スクロールイベント活用術:メインビジュアルを過ぎたらサイドナビを表示するjQueryテクニック

by interlife

HTML

<section id="kv-area">
  <h1>メインビジュアル</h1>
</section>
<section id="contents-area">
  <h1>コンテンツエリア</h1>
</section>
<div class="side-nav">
  <p>サイドナビ</p>
</div>

SCSS

#kv-area,#contents-area {
  padding: 200px 0;
  background: #ccc;
  h1 {
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 50px;
  }
}

#contents-area { background: #f3f8fc; }

.side-nav {
  padding: 10px;
  width: 125px;
  text-align: center;
  background: #fff;
  position: fixed;
  right: 0;
  top: 20px;
  z-index: 1;
  box-shadow: 0 0 35px 0 rgba(0, 0, 0, .1);
  border-radius: 10px 0 0 10px;
  line-height: 1.2;
  font-weight: bold;
  overflow: hidden;
  opacity: 0;
  transition: .3s;
}

JavaScript

//サイドナビをKVを過ぎてから表示
$(function () {
  // ウィンドウのスクロール量を保持する変数
  let start_position = 0,
    window_position;
  // サイドナビ要素を取得
  const sideNav = $(".side-nav");
  // 最初のsection要素の高さを取得
  const firstSectionHeight = $("section").outerHeight();
  // スクロールイベントを設定
  $(window).scroll(function () {
    // 現在のウィンドウのスクロール量を取得
    window_position = $(window).scrollTop();
    // 最初のsection要素を過ぎたらサイドナビ表示
    if (window_position >= firstSectionHeight) {
      sideNav.css("opacity", "1");
    } else {
      // 最初のsection要素を過ぎるまではサイドナビ非表示
      sideNav.css("opacity", "0");
    }
    // 現在の位置を更新
    start_position = window_position;
  });
  // ページ読み込み時に中途半端な位置でロードされたときでも正しくヘッダーの表示を設定するためにスクロールイベントを発生させる
  $(window).trigger("scroll");
});