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

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

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

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

自分の学習・メモ用がメインですが、プログラミング学習初心者の参考になればとも思います!

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

ブラウザはGoogle Chromeを使い、Wordpress上で実装しています。

目次

実装例とコード

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

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

  • 画面サイズが800px以下(スマホやタッチパネルなど) → メニューが1つ
  • 画面サイズが800px超(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>
  <!-- モバイル用表示 -->
  <nav class="mobile-menu">
    <div>Menu</div>
  </nav>
</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;
  font-size: 28px;
  font-weight: 600;
  line-height: 80px;
  text-align: center;
}

/* モバイル用表示切り替え */
@media (max-width: 800px) {
  .mobile-menu {
    display: block;
  }

  .pc-menu {
    display: none;
  }
}

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

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

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

本実装例では、ロゴとメニューのレイアウトにフレックスボックス(display: flex;)を採用し、画面サイズに応じた表示変更にはメディアクエリ(@media)を採用しています。

こちらについては以下記事で紹介していますので、合わせてご覧ください。

まとめ

以上、ヘッダーを画面上部に固定し、スクロールしてもついてくる実装について紹介しました。

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

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

この記事を書いた人

ノベルティグッズのECサイトを運営する中小企業役員。
本ブログを通じ、販促向けの最新/ロングセラー商品紹介やWebサイト制作に役立つ技術情報を発信しています。

目次