スクロールで表示・非表示が切り替わる固定ヘッダー実装【軽量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 の動作デモ集でも順次公開しています。
投稿者プロフィール
最新の投稿
webデザイン2026年2月21日スクロールで表示・非表示が切り替わる固定ヘッダー実装【軽量JS・実務向け】
webデザイン2026年2月14日IntersectionObserverでスクロール表示アニメーションを作る実践例【JS軽量・実務向け・コピペOK】
ブログの書き方2026年2月10日オウンドメディアを持つ意味とは?
SEO2026年2月9日SEOを意識しなくても検索で評価されるホームページの考え方


