Written by Toshiki

【脱jQuery】スクロールしたら画面上部に追従ヘッダーを表示する方法

JavaScript Web制作

こんにちは、トシキです。
今回は以前に投稿した、「スクロールしたら画面上部に追従ヘッダーを表示する方法(jQuery使用)」のJavaScriptバージョンを解説していきます。

本記事の内容

スポンサードサーチ

①【脱jQuery】スクロールしたら画面上部に追従ヘッダーを表示する方法

挙動はjQueryバージョンと変わりません。
また、HTML/CSSはそのままです。

See the Pen 【脱jQuery】スクロールしたら画面上部にスライド表示されるメニュー by tosshii (@totototosshii) on CodePen.

1-01. HTML


<header class="ly_header">
  <div class="ly_header_inner">
    <nav class="bl_headerNav">
      <ul class="bl_headerNav_list">
        <li><a href="#1">ヘッダーメニュー01</a></li>
        <li><a href="#2">ヘッダーメニュー02</a></li>
        <li><a href="#3">ヘッダーメニュー03</a></li>
        <li><a href="#4">ヘッダーメニュー04</a></li>
      </ul>
    </nav>
  </div>
  <div class="ly_fixedNav" aria-hidden="true" aria-label="追従ヘッダー">
    <nav class="bl_fixedNav">
      <ul class="bl_fixedNav_list">
        <li><a href="#1">追従メニュー01</a></li>
        <li><a href="#2">追従メニュー02</a></li>
        <li><a href="#3">追従メニュー03</a></li>
        <li><a href="#4">追従メニュー04</a></li>
      </ul>
    </nav>
  </div>
</header>

<section class="ly_cont">
  <h2>メインコンテンツ</h2>
</section>

変更なしです。

1-02. CSS


/* ヘッダー */
.ly_header,
.ly_fixedNav {
  padding-block: 1rem;
}

.ly_header {
  background-color: #DDD;
}

.ly_header_inner,
.bl_fixedNav {
  padding-inline: 1rem;
}

.ly_fixedNav {
  background-color: #B6E1B5;
  position: fixed;
  inset-block-start: -100%;
  inset-inline-start: 0;
  z-index: 30;
  inline-size: 100%;
  transition: inset-block-start .4s, visibility .4s;
  visibility: hidden;
}

.ly_fixedNav.is_active {
  inset-block-start: 0;
  visibility: visible;
}

.bl_headerNav_list,
.bl_fixedNav_list {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;

  a {
    display: inline-block;
    line-height: 1.5;
    padding-inline: 1em;
  }
}
/* ヘッダーここまで */

/* メインコンテンツ */
.ly_cont {
  background-color: lightblue;
  text-align: center;
  block-size: 1000px;
  padding-block-start: 60px;
}

こちらも変更なしです。

1-03. JavaScript


// 追従ヘッダーの関数
const showFixedHeader = () => {
  const scrollTop = window.scrollY;
  const headerHeight = document.querySelector('.ly_header').offsetHeight;
  const fixedNav = document.querySelector('.ly_fixedNav');
  const isHeaderVisible = scrollTop < headerHeight;
  if (isHeaderVisible) {
    fixedNav.classList.remove('is_active');
    fixedNav.setAttribute('aria-hidden', 'true');
  } else {
    fixedNav.classList.add('is_active');
    fixedNav.setAttribute('aria-hidden', 'false');
  }
}

// 画面をスクロールをしたら発火
window.addEventListener('scroll', () => {
  showFixedHeader();
})

const scrollTop = window.scrollY;

window.scrollYで現在のスクロール位置を取得します。


const headerHeight = document.querySelector('.ly_header').offsetHeight;

offsetHeightで、通常ヘッダー(.ly_header)の高さを取得します。


const fixedNav = document.querySelector('.ly_fixedNav');

追従ヘッダー(.ly_fixedNav)の要素を取得します。


const isHeaderVisible = scrollTop < headerHeight;

scrollTop < headerHeightの条件を使って、スクロール位置が通常ヘッダーの高さより小さいかどうかを判定します。
スクロール量が少なく、まだ通常ヘッダーが画面内に表示されている場合はtrue、逆にスクロール量が通常ヘッダーの高さを超えて画面外へ消えた場合はfalseとなり、その値がisHeaderVisibleに代入されます。


if (isHeaderVisible) {
  fixedNav.classList.remove('is_active');
  fixedNav.setAttribute('aria-hidden', 'true');
} else {
  fixedNav.classList.add('is_active');
  fixedNav.setAttribute('aria-hidden', 'false');
}

isHeaderVisibleの値に応じて、fixedNav(追従ヘッダー)に.is_activeの追加・削除と、aria-hidden属性の設定を行います。

isHeaderVisibletrue(通常ヘッダーがまだ見えている状態)の場合

  • classList.remove.is_activeを削除。
  • setAttributearia-hidden属性の値をtrueに設定。

isHeaderVisiblefalse(スクロールが進み、通常ヘッダーが見えなくなった状態)の場合

  • classList.add.is_activeを追加。
  • setAttributearia-hidden属性の値をfalseに設定。

②まとめ

今回はJavaScriptバージョンを解説しました。
jQueryバージョンに比べて記述量は増えますが、基本的な処理内容は変わりません。通常ヘッダーと追従ヘッダーの情報を取得し、スクロール位置に応じて.is_activeクラスの付け外しやaria-hidden属性の変更を行います。
処理の順番もjQueryバージョンと同じなので、脱jQueryを目指している方は、ぜひ見比べてみてください。

この記事が役に立ったら、応援してくれると嬉しいです! 投げ銭で応援する

人気記事Webサイトにフォントサイズ変更ボタンを実装する方法(jQuery使用)

人気記事【脱jQuery】スクロールしたら画面上部に追従ヘッダーを表示する方法