【CSS】ヘッダーを上部に固定し、スクロールに合わせて追従させる

【メイン画像】CSSを使って固定表示されるヘッダーの作り方

positionプロパティを使って、Webページの上部にヘッダーを固定し、画面をスクロールさせるとヘッダーがついてくる(ヘッダーが常時表示される)方法を紹介します。

本ページの上部に表示されている領域が実装例です。コードも公開しています。
当サイトのヘッダーと競合しているため、見栄えはよくないですが。

なお、同じようにサイドバーやフッターを固定(追従)させる方法については以下記事で紹介しています。

目次

固定表示ヘッダーの実装例とコード

本ページの上部に表示されているエリアが実装例です。

左側にロゴ(サイト名、他)を、右側にナビメニューを表示する領域を作りました。
また、ブラウザウィンドウのサイズに応じて、メニューの表示方法も変えてみました。

ウィンドウ幅デバイス表示内容
〜800pxスマホ、タッチパネルロゴ + ハンバーガーメニューを表示
801px〜PCロゴ + メニュー3つを横並び表示
ウィンドウサイズを変えて、確認してみてください。

ハンバーガーメニューついては以下記事にて詳しく紹介しています。


HTML / CSS コード

<!-- ヘッダー高さ分の余白   -->
<div class="header-box"></div>
<header>
  <div class="logo">仮ロゴ</div>
  <!-- PC用表示 -->
  <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>
.header-box {
  height: 80px;
}

header {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  background: rgba(0, 0, 0, .1);
  z-index: 100;
  display: flex;
  justify-content: space-between;
}

.logo {
  width: 20%;
  height: 80px;
  text-align: center;
  line-height: 80px;
  font-size: 20px;
  font-weight: 600;
  background: skyblue;
}

nav {
  width: 30%;
}

ul {
  width: 100%;
  display: flex;
  list-style: none;
  padding: 0;
  margin: 0;
}

li {
  width: 33%;
}

a {
  display: block;
  width: 100%;
  line-height: 80px;
  text-align: center;
}

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

.line {
  background-color: black;
  height: 4px;
  width: 100%;
  position: absolute;
  transition: all 0.3s;
}

.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) {
  .mobile-menu {
    display: block;
  }

  .pc-menu {
    display: none;
  }
}

固定表示にはposition: fixed;を使う

特定の要素を、画面上の特定の位置に固定するには、CSSのposition: fixed;を使います!
これに加えて、画面上のどの位置に固定するかを「top」「left」「bottom」「right」を使って示します。

本実装例では、top: 0; left: 0;と指定しており、これは画面上端かつ左端に配置という意味になります。
width: 100%;を合わせて指定しているので、画面上端の左端から右端までheader要素が広がった状態で表示されています。

position: fixed;を使うと、他の要素が詰められて配置されて(ヘッダー要素の背面または正面に、他の要素が入り込んで)しまいます。画面をスクロールしていないときはヘッダー要素の領域はそのまま残しておきたいので、本例ではheader-boxクラスを付けた空のdiv要素を配置しておき、高さをヘッダー要素と同じにすることで対処しています。

ロゴとメニューを横並びレイアウトにするにはdisplay: flex;を使う

ロゴとメニューのレイアウトにはフレックスボックスを採用しています。
親要素にdisplay: flex;を適用することで、その子要素を横並びで表示したり、サイズや間隔を調整したりできるようになります。

詳しくは以下記事をご覧ください。

ウィンドウ幅に応じて表示を変えるにはメディアクエリを使う

ウィンドウ幅(画面サイズ)に応じた表示変更はメディアクエリ(@media)で対応します。
メディアクエリを使うと、特定のウィンドウ幅になったときにレイアウトや表示を自動的に切り替えることができるようになります。

詳しくは以下記事をご覧ください。

まとめと応用例

以上、ヘッダーを画面上部に固定し、スクロールしてもついてくる実装について紹介しました。
今回はヘッダーでしたが、「top」「left」「bottom」「right」の指定を変えることで、画面の好きな位置に要素を配置できます。いろいろな値を入れてみて、表示がどのように変わるかぜひ試してみてください。

なお、本記事ではハンバーガーメニュー(モバイル表示時)はアイコンのみで、クリックしても何も表示されません。
メニューも表示する方法は以下記事にて紹介していますので、ぜひ合わせてご覧ください。


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

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