jQueryで作る、下にスクロールで消えて、上にスクロールで現れる固定メニュー
最近、下にスクロールすれば消えて、上にスクロールすれば現れる固定メニューを設置しているサイトを2つくらい(サイト名は忘れてしまいました。。)見かけて、これは流行っているのではないかということで作ってみました。
実際の動きは下のサンプルでご確認ください。
メニュー自体はいたって普通のものですが、一応ソースを載せておきます。まずはHTMLです。
<nav id="menu-wrap"> <ul id="menu"> <li><a href="#">menu1</a></li> <li><a href="#">menu2</a></li> <li><a href="#">menu3</a></li> <li><a href="#">menu4</a></li> <li><a href="#">menu5</a></li> </ul> </nav>
続いてCSSです。
#menu-wrap { position: fixed; z-index: 9999; top: 0; left: 0; width: 100%; background: rgba(0,0,0,.5); transition: .3s; } #menu { list-style-type: none; width: 960px; margin: 0px auto; padding: 0; } #menu li { width: 20%; float: left; margin: 0; padding: 0; text-align: center; } #menu li a { display: block; width : 100%; padding: 20px 0; color: #fff; font-size: 14px; line-height: 1; text-decoration: none; transition: .3s; } #menu li a:hover { background: rgba(0,0,0,.3) }
こちらも普通です。メニューは固定していますので、position: fixed;を指定しています。で、topの値をスクロールの方向によって変えることで、「下にスクロールで消えて、上にスクロールで現れる」を作ります。
で、その仕組みはjQueryを作ります。
var menuHeight = $("#menu-wrap").height(); var startPos = 0; $(window).scroll(function(){ var currentPos = $(this).scrollTop(); if (currentPos > startPos) { if($(window).scrollTop() >= 200) { $("#menu-wrap").css("top", "-" + menuHeight + "px"); } } else { $("#menu-wrap").css("top", 0 + "px"); } startPos = currentPos; });
では、ここからは1行ずつ解説していきます。
メニュー全体の高さをmenuHeightとします。下にスクロールしたときにメニューを隠すためにこの値が必要となります。
スクロールの基準を、startPosとします。最初はスクロールしていませんので値は0です。それ以降、この値はスクロールし始めた位置となります。
3行目以下はスクロールするたびに呼び出されます。
スクロールしたときの位置をcurrentPosとします。
スクロールしたときの位置currentPosの値が、スクロールの基準となる位置startPosの値より大きいか小さいかで、上にスクロールしたか、下にスクロールしたかを判別します。
currentPos>startPosとなる場合は、下にスクロールしていることになります。反対の場合は上へのスクロールとなります。
下にスクロールのときに、さらに「200px以上スクロールしているか」という条件をつけています。
なくてもいいのですが、ちょっと下にスクロールしただけでメニューが消えてしまうのも不便なので、200px以上スクロールしてから消えるようにしています。
下にスクロールしたときに、メニューの高さ分だけ画面の上に持ってきます。メニューの高さが40pxでしたらtop: -40px;となります。
メニューの高さをheightなどできっちり指定している場合は、変数ではなく、その高さを指定してあげれば大丈夫です。
currentPos>startPosとならない場合、すなわち上にスクロールした場合に呼び出される内容です。
上にスクロールしたときはメニューを表示するため、top: 0px;となります。
最後に、基準となるstartPosの値を、スクロールしたと後のcurrentPosと同じにします。
これは、次にスクロールしたときの基準を決めておく必要があるためです。次にスクロールしたときはこの値を基準として、上にスクロールしたか、下にスクロールしたのかを判定します。
さいごに
ということで、下にスクロールで消えて、上にスクロールで現れる固定メニューを紹介しました。
上に固定されているメニューはよく見かけますが、常に表示されているため大きすぎたりすると、煩わしいと感じる人もいるかもしれません。
そんな場合に使えるかもしれないですね。お役に立てばうれしいです。
※コメントはご意見ご感想や間違いのご指摘等にしていただけますようお願いいたします。ブログに費やせる時間が限られており、技術的なご質問をいただいても答えできません。申し訳ございませんがご理解いただければ幸いです。