上にスクロールすると出てきて下にスクロールすると非表示になるメニュー

上や下にメニューを固定するとユーザに効果的にメニューを見せることができるが、ずっと上や下に固定でメニューにあると表示エリアが少なくなるため、上にスクロールするとメニューが表示され、下にスクロールすると非表示になるメニューを実装するには以下の通り。

実装するにはJqueryを使用するため、先にJqueryを読み込んでおく

<script
 src="https://code.jquery.com/jquery-3.6.0.min.js"
 integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
 crossorigin="anonymous">
</script>

メニューの部分のCSSは以下の通り。最初は非表示にするためtop:-100pxで表示エリア外においておく。transitionは1sに設定して1秒でアニメーションするようにしている。あとはJqueryで「ds_nav」の要素に「isActive」を付加してtop:0pxでエリア内に表示するようにしている

#ds_nav {
 width: 100%;
 text-align: center;
 background-color: #000;
 font-size: 0;
 margin: 0px auto 0px auto;
 z-index: 200;
 opacity:0.85;
 color:#fff;
 left: 0;
 right: 0;
 top:-100px;
 position: fixed;
 transition: 1s;
}
#ds_nav.isActive {
 top:0px;
}

メニュー部分のHTMLは以下の通り。とりあえず外側だけ

<nav id="ds_nav">
・・・メニューの中身を書く
</nav>

スクロールして表示・非表示させるJqueryコードは以下の通り。下のコードはTOPから300px離れている状態で、上にスクロールするとメニューが上から出てくる(classのisActiveを付与する)。下にスクロールすると、メニューが上に引っ込む(classのisActiveを削除する)

常にスクロールのPositionをposという変数に入れ込んでいる

<script>
 $(function(){
  var pos = 0;
  var header = $('#ds_nav');

  $(window).on('scroll', function(){
   if($(this).scrollTop() > 300){
    if($(this).scrollTop() < pos ){
     //上にスクロールしたとき
     header.addClass('isActive');
    }else{
    //下にスクロールしたとき
     header.removeClass('isActive');
    }
   }else{
    header.removeClass('isActive');
   }
   pos = $(this).scrollTop();
  });
 });
</script>

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です