スクロールで表示・非表示が切り替わる固定ヘッダー実装【軽量JS・実務向け】

スクロールで表示・非表示が切り替わる固定ヘッダー実装【軽量JS・実務向け】

ページをスクロールしたときに、

  • 下へスクロール → ヘッダーを隠す
  • 上へスクロール → ヘッダーを表示する

この動きのあるヘッダーは、ユーザーの閲覧体験を邪魔せず、ナビゲーションも確保できるため、実務サイトでもよく使われます。

今回は、ライブラリ不要・軽量JavaScriptのみで実装できる方法を紹介します。

実際に動くサンプルはこちらです。

▶ デモを見る
https://disegno-k.biz/demo/js/scroll-fixed-header-demo.html


この実装でできること

このサンプルでは次の動作を実現します。

  • ヘッダーを常に固定配置
  • 下スクロール時はヘッダーを隠す
  • 上スクロール時はヘッダーを再表示
  • 軽量JSのみで制御
  • スマホでも動作

コーポレートサイト、店舗サイト、LPなど幅広く使えます。


HTML

まずはヘッダーとダミーコンテンツを用意します。

<header class="site-header" id="header">
  <div class="inner">
    <div class="logo">Site Logo</div>
    <nav>Menu</nav>
  </div>
</header>

CSS

ヘッダーを固定し、隠すときは上にスライドさせます。

.site-header {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  background: #111;
  color: #fff;
  transition: transform .3s ease;
  z-index: 1000;
}

.site-header.hide {
  transform: translateY(-100%);
}

.inner {
  display: flex;
  justify-content: space-between;
  padding: 16px 20px;
}

JavaScript

スクロール方向を判定してクラスを切り替えます。

const header = document.getElementById('header');

let lastScroll = 0;

window.addEventListener('scroll', () => {
  const current = window.pageYOffset;

  if (current > lastScroll && current > 80) {
    header.classList.add('hide');
  } else {
    header.classList.remove('hide');
  }

  lastScroll = current;
});

処理のポイント

前回のスクロール位置を記録

lastScroll

を保存しておくことで、

  • 今回のスクロール量
  • 前回との差

から方向を判定しています。

少しスクロールしてから発動

current > 80

を入れている理由:

  • ページ上部でチラつくのを防ぐ
  • UXが安定する

実務ではほぼ必ず入れます。

カスタマイズ例

表示アニメーションをゆっくりに

transition: transform .5s ease;

影を付ける

box-shadow: 0 4px 12px rgba(0,0,0,.15);

注意点

  • position: fixed 分の余白を本文側に付ける
  • ヘッダー高さ分の padding-top を入れる
  • iOSでの挙動確認

実動作デモ

実際の動きを確認したい場合はこちら。

▶ デモページ
https://disegno-k.biz/demo/js/scroll-fixed-header-demo.html

まとめ

スクロール連動ヘッダーは、

  • 見た目の質が上がる
  • UXが良くなる
  • 実務使用率が高い

わりに実装はシンプルです。

軽量JSだけでも十分実用レベルにできます。


実装サンプルは
Disegno-K の動作デモ集でも順次公開しています。

投稿者プロフィール

yajio