【jQuery】ヘッダーメニューが下スクロールで消え、上スクロールで現れるアニメーション【iOSにも対応可】

【jQuery】ヘッダーメニューが下スクロールで消え、上スクロールで現れるアニメーション【短いコード版】
SIM

こんにちは、SIMです。
今日は良く見かけるヘッダーメニューのアニメーションを紹介します。

紹介するのは、ヘッダーメニューを下にスクロールするとスライドアップして見えなくなり、上にスクロールするとスライドダウンで現れるアニメーションです。

このアニメーションを実装するためのjQueryやJavaScriptのコードには何種類かありますが、今回ご紹介するのは一番簡単で短いタイプですので、コピペで直ぐに真似できますよ。

目次

アニメーション動作を確認

SIM

まずは、CodePenでアニメーションの動きを見てみましょう。

(スマホなどの小さい画面の場合はResultボタンをタップすると実際の表示が見れますよ)

See the Pen ヘッダーメニューバー:下スクロールで消え、上スクロールで現れる by s sim (@s-sim) on CodePen.

SIM

このアニメーションの実装には数種類ありますが、Google検索でヒットするコードの動きはほぼ同じです。

HTML|ヘッダーアニメーション

SIM

ではHTMLの構造から見ていきましょう。

見本のHTMLは実際に使うシーンに近い「ヘッダーグローバルナビゲーション」で書いてみました。

この中で、アニメーションの動きに直接関係しているのは「ヘッダーのメニューバー(出たり消えたりする)」の「header-bar」のクラスが付いているタグのみです。

以下、関係箇所の抜粋です(全文はCodePenを参照して下さい)。

  <header class="l-header">

    <!-- ヘッダーのメニューバー(出たり消えたりする) -->
    <div class="header-bar">
      <!-- 以下はヘッダーの中身:自由に書いて下さい -->
      <h1 class="c-h1">SIMS-CODE</h1>
      <nav class="p-nav">
        <ul class="p-nav_ul">
          <li class="p-nav_li"><a href="#" class="p-nav_li-a">Menu 1</a></li>
          <li class="p-nav_li"><a href="#" class="p-nav_li-a">Menu 2</a></li>
        </ul>
      </nav>
    </div>

  </header>

CSS|ヘッダーアニメーション

SIM

続いてCSSを見ていきましょう。
CSSもアニメーションに関係する箇所はたったの2箇所と少ないです。

以下、関係箇所の抜粋です(全文はCodePenを参照して下さい)。

/* スクロールが末端に達したときのバウンスを禁止するCSS(PC専用:無くても良い) */
body {
  overscroll-behavior-y: none;
}

/* ヘッダーのメニューバー(出たり消えたりする) */
.header-bar{
  width: 100%;
  height:80px;
  position: fixed;
  transition: .5s;
  /* 以下、体裁を整えるCSSなので直接関係ない */
  display: flex;
  justify-content: space-between;
  align-items: center;
  background-color: #5C6F96;
  padding: 0 20px;
  color: #fff;
}
/* ヘッダーのメニューバーが消えるときのCSS */
.header-bar.hide {
  transform:translateY(-100px);
}
SIM

ヘッダーのアニメーションに関係する箇所を箇条書きでまとめると下のようになります。

ヘッダーアニメーションの説明(CSS)

ヘッダーが見えている時のCSS

  • 「.header-bar」の「position: fixed;」と「transition: .5s;」
  • これはヘッダーメニューを固定表示し、アニメーションが加わるときは0.5秒間かけて変化するという意味

ヘッダーが消えている時のCSS

  • .header-bar.hideのtransform:translateY(-100px);
  • これは「.header-bar」に「.hide」クラスが付与されると上に100px移動して見えなくなるという意味

jQuery|ヘッダーアニメーション

SIM

最後にjQueryを紹介します。
このコードはすごく短いです。

アニメーションの原理を簡単に説明すると、下に200pxスクロールしたときにヘッダーメニュー(「header-bar」)に「hide」クラスを付与して見えなくし、上にスクロールしたときには「hide」クラスを剥奪してヘッダーメニューを見えるようにしています。

$(function(){
  //変数を定義
  var pos = 0, winScrollTop = 0;
  // PC用ヘッダー
  var header = $('.header-bar');
  
  $(window).on('scroll', function () {
    winScrollTop = $(this).scrollTop();

    //下に200pxスクロールした時
    if (winScrollTop >= pos) {
      if (winScrollTop >= 200) {
        header.addClass('hide');
      }
    //上にスクロールした時
    } else {
      header.removeClass('hide');
    }
    pos = winScrollTop;

  });
});
SIM

各コードの意味するところはコメントアウトで説明を入れてあるので省略します。

コピペで使う場合には「class名の「header-bar」「hide」をHTML・CSSと整合性が取れるように書く」ということだけ注意すれば、大丈夫だと思います。

iOS上の注意点

上の例では下に200pxスクロールしたときにヘッダーメニューが消える設定にしていますが、これを0px下スクロールに変更すると、iOS端末では表示がバグって、ヘッダーメニューが表示されなくなるので注意して下さい。その原因はどうやらバウンススクロールにあるようで、上スクロールが画面末端に到達した時にバウンスしたのを下スクロールと誤認して上記JSが動作してしまいます。そのため、バウンスで誤動作しないように下スクロールを少し多めに設定しています。

まとめ

このヘッダーアニメーションには今回紹介した他に、動きが違うバリエーションがいくつか存在します。それらのコードは一工夫必要ですので、別の機会に紹介したいと思います。

以上、今回は簡単な方のヘッダーアニメーションを紹介しました。

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

この記事を書いた人

■清水WEB制作代表
■コーディング:WordPress(オリジナルテーマ制作等)・HTML・Sass・FLOCSS・JavaScript(jQuery)等
■集客力:YouTube/Instagram/ブログでそれぞれ登録者数16000人/フォロワー13000人/月間最大アクセス50000PVの集客実績があります
■文章作成:博士号所有、会社員時代は科学雑誌に寄稿していたので文章作成も得意です
■写真技術:Amazon Kindle出版で、写真集・撮影編集解説書を5冊好評発売中です

目次