CSSを使って、ナビゲーションをページ上部に固定する方法を紹介します。この指定をすることでスクロールをするのはコンテンツ部分だけで、ナビゲーションを含むヘッダー部分はページ上部に固定されて常に見えている状態となります。

常にページ上部に固定させる場合

ナビゲーション部分を常にページ上部に固定させる場合は、CSSだけで実装することができます。

//HTML
<header>
  <nav id="global-nav">
    <ul>
      <li><a href="#">メニュー1</a></li>
      <li><a href="#">メニュー2</a></li>
      <li><a href="#">メニュー3</a></li>
      <li><a href="#">メニュー4</a></li>
      <li><a href="#">メニュー5</a></li>
    </ul>
  </nav>
</header>

//CSS
header {
  position: fixed;
  width: 100%;
  top: 0;
  z-index: 10000;
}

これで、ヘッダーをページ上部に固定して表示することができます。しかし、このままでは下に続くコンテンツの一部と重なってしまうので、少し手を加える必要があります。

#container {
  padding-top: 150px;
}

このように、ヘッダー部分の高さ分だけ、コンテンツにpadding-topを加えることで重なりを防ぐことができます。

途中から固定する場合

スクロールの途中からナビゲーションを固定することもできます。その場合はCSSとjQueryを用いて実装していきます。

$(function() {
  var menu = $('#global-nav'),
  offset = menu.offset();
  $(window).scroll(function () {
    if($(window).scrollTop() > offset.top) {
      menu.addClass('fixed');
    } else {
      menu.removeClass('fixed');
    }
  });
});

まずは、「menu」という変数を作り、そこに「#global-nav」を代入するようにします。これで毎回ID名を記述する面倒はなく、変数を呼び出すだけで済みます。
次に変数「offset」でナビゲーション(#global-nav)の位置情報を代入します。そして、scrollイベントを使って、スクロールした際の処理を指定していきます。
簡潔に言うと、スクロールした距離がページトップとナビゲーション(#global-nav)の距離より大きかったら「fixed」というクラスを付与してナビゲーションを固定し、そうでなければクラスを外すという処理をしています。
addClass()を使って指定した要素にクラスを付与することができます。removeClass()を使って指定した要素からクラスを外すことができます。

CSSに関しては、最初に指定したheaderの部分を削除して、代わりに以下を追加します。

.fixed {
  position: fixed;
  width: 100%;
  top: 0;
  z-index: 1000;
}

以上が、CSSを使ってナビゲーションを固定する方法となります。これ以外にも左側にナビゲーションを固定して右側にコンテンツを作る2カラムのレイアウトなどデザインパターンはいろいろあります。

おすすめの記事