こんにちは、SIMです。
今日は良く見かけるヘッダーメニューのアニメーションを紹介します。
紹介するのは、ヘッダーメニューを下にスクロールするとスライドアップして見えなくなり、上にスクロールするとスライドダウンで現れるアニメーションです。
このアニメーションを実装するためのjQueryやJavaScriptのコードには何種類かありますが、今回ご紹介するのは一番簡単で短いタイプですので、コピペで直ぐに真似できますよ。
アニメーション動作を確認
まずは、CodePenでアニメーションの動きを見てみましょう。
(スマホなどの小さい画面の場合はResultボタンをタップすると実際の表示が見れますよ)
See the Pen ヘッダーメニューバー:下スクロールで消え、上スクロールで現れる by s sim (@s-sim) on CodePen.
このアニメーションの実装には数種類ありますが、Google検索でヒットするコードの動きはほぼ同じです。
HTML|ヘッダーアニメーション
では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|ヘッダーアニメーション
続いて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);
}
ヘッダーのアニメーションに関係する箇所を箇条書きでまとめると下のようになります。
ヘッダーが見えている時のCSS
- 「.header-bar」の「position: fixed;」と「transition: .5s;」
- これはヘッダーメニューを固定表示し、アニメーションが加わるときは0.5秒間かけて変化するという意味
ヘッダーが消えている時のCSS
- .header-bar.hideのtransform:translateY(-100px);
- これは「.header-bar」に「.hide」クラスが付与されると上に100px移動して見えなくなるという意味
jQuery|ヘッダーアニメーション
最後に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;
});
});
各コードの意味するところはコメントアウトで説明を入れてあるので省略します。
コピペで使う場合には「class名の「header-bar」「hide」をHTML・CSSと整合性が取れるように書く」ということだけ注意すれば、大丈夫だと思います。
上の例では下に200pxスクロールしたときにヘッダーメニューが消える設定にしていますが、これを0px下スクロールに変更すると、iOS端末では表示がバグって、ヘッダーメニューが表示されなくなるので注意して下さい。その原因はどうやらバウンススクロールにあるようで、上スクロールが画面末端に到達した時にバウンスしたのを下スクロールと誤認して上記JSが動作してしまいます。そのため、バウンスで誤動作しないように下スクロールを少し多めに設定しています。
まとめ
このヘッダーアニメーションには今回紹介した他に、動きが違うバリエーションがいくつか存在します。それらのコードは一工夫必要ですので、別の機会に紹介したいと思います。
以上、今回は簡単な方のヘッダーアニメーションを紹介しました。