固定配置ヘッダー(CSSのみ)実装解説|CSS position: fixed Header Guide

固定配置ヘッダー デザイン見本

CSS の position: fixed を使ってヘッダーをページ上部に固定し、スクロール時も常に表示し続ける実装デモ。コピーしてすぐ使えるコードを掲載しています。

① position: fixed — スクロールに追従する固定ヘッダー

ロゴ
Menu 1 Menu 2 Menu 3

コンテンツエリア

↓↓↓

スクロールできます

↓↓↓

スクロールできます

↓↓↓

スクロールできます

↓↓↓

スクロールできます

現在: sticky(追従中)

HTML
<div class="header-box"></div>
<header>
  <div class="logo">ロゴ</div>
  <nav>
    <ul>
      <li><a href="#">Menu 1</a></li>
      <li><a href="#">Menu 2</a></li>
      <li><a href="#">Menu 3</a></li>
    </ul>
  </nav>
</header>
CSS
header {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 60px;
  background: #1e293b;
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 20px;
  z-index: 100;
  box-sizing: border-box;
}

nav ul {
  display: flex;
  gap: 16px;
  list-style: none;
  padding: 0;
  margin: 0;
}

nav a {
  color: rgba(255, 255, 255, 0.9);
  text-decoration: none;
  font-size: 0.8rem;
}

.header-box {
  height: 60px;
}
position: fixed の動作

position: fixed を指定すると、要素はスクロールに関係なく画面上の指定位置に固定されます。top: 0; left: 0; width: 100%; の組み合わせで画面上端いっぱいにヘッダーを広げられます。z-index を他の要素より高く設定して最前面に表示させることも重要です。なお、このデモは記事内での確認のため position: sticky で代用しています。実際の実装では position: fixed を使用してください。

② header-box — コンテンツが隠れるのを防ぐ余白

ロゴ
Menu 1 Menu 2 Menu 3

🔴 コンテンツの先頭行

コンテンツ 2行目

コンテンツ 3行目

現在: header-box あり — 先頭行が見えています

HTML
<div class="header-box"></div>
<header> ... </header>
<main>
  <p>コンテンツの先頭行</p>
</main>
CSS
.header-box {
  height: 60px;
}
position: fixed の落とし穴と対処法

position: fixed を指定すると、その要素は通常のドキュメントフローから外れます。ページ読み込み直後の状態でも、固定ヘッダーの下にコンテンツが潜り込んで先頭が見えなくなります。ヘッダーと同じ高さの空 div(.header-box)をヘッダーの直前に置くだけで解決できます。

③ レスポンシブ対応 — PC / モバイルでメニューを切り替える

ロゴ
Menu 1 Menu 2 Menu 3

コンテンツエリア

現在: PC表示(ナビメニュー表示中)

HTML
<header>
  <div class="logo">ロゴ</div>
  <nav class="pc-menu">
    <ul>
      <li><a href="#">Menu 1</a></li>
      <li><a href="#">Menu 2</a></li>
      <li><a href="#">Menu 3</a></li>
    </ul>
  </nav>
  <div class="mobile-menu">
    <div class="line"></div>
    <div class="line"></div>
    <div class="line"></div>
  </div>
</header>
CSS
header {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 60px;
  background: #1e293b;
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 16px;
  z-index: 100;
  box-sizing: border-box;
}

.pc-menu ul {
  display: flex;
  gap: 16px;
  list-style: none;
  padding: 0;
  margin: 0;
}

.pc-menu a {
  color: rgba(255, 255, 255, 0.9);
  text-decoration: none;
  font-size: 0.8rem;
}

.mobile-menu {
  display: none;
  width: 30px;
  height: 22px;
  cursor: pointer;
  position: absolute;
  top: 50%;
  right: 20px;
  transform: translateY(-50%);
}

.line {
  background-color: #fff;
  height: 4px;
  width: 100%;
  position: absolute;
  border-radius: 2px;
}

.line:nth-of-type(1) { top: 0; }
.line:nth-of-type(2) { top: 50%; transform: translateY(-50%); }
.line:nth-of-type(3) { bottom: 0; }

@media (max-width: 800px) {
  .pc-menu     { display: none; }
  .mobile-menu { display: block; }
}
@media (max-width: 800px)

メディアクエリを使うと、画面幅に応じてスタイルを切り替えられます。PC では横並びのナビメニューをそのまま表示し、モバイルではハンバーガーアイコンに切り替えるのが一般的なパターンです。ハンバーガーアイコンのクリックでメニューを展開する動作は JavaScript で実装します。


当サイトで公開しているWebデザインやUIの実装例は、一覧として以下記事に纏めています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次