SOFTELメモ

</> 技術者募集

【JavaScript】上にスクロールするとにゅっと出てくるメニューを作る

問題

長い画面で、メニューや検索フォームなどが、近くにいて欲しいんだけど、いつも見えると邪魔。
下へ下へスクロールしてみているときは隠れていて、
上にスクロールすると出てくるメニューを作りたい。

sticky menu

答え

stickyな動きは、CSSで可能。

普段はスクロールとともに上に隠れて行って欲しいので、必要なだけtopを引いておきたいのだが、
JavaScriptで測って、JavaScriptでtopのマイナスを入れるので、今回は書かなくてOK。

「にゅっ」っとした感じを出したいので、CSSのtransitionを設定しておく。

.sticky-menu {
  position:sticky;
  top:0;
  transition:.5s;
}

上にスクロールしたことを検出して、topを0に戻したり、
下にスクロールしたことを検出して、topを必要なだけ引いたりする処理は、こんな感じ。

$(function(){
  var $sticky = $('.sticky-menu');
  //position:sticky が使えるときだけ使う
  if ($sticky.css('position') == 'sticky') {
    var lp = 0;
    $(window).on('scroll', function(){
      var cp = $(this).scrollTop();
      if (lp < cp) {
        //下へ → 上に引っ込むアニメーション
        $sticky.css('top', height);
      } else if (lp > cp) {
        //上へ → 下に出てくるアニメーション
        $sticky.css('top', 0);
      }
      lp = cp;
    });
  }
});

HTMLはシンプルに、classを付与しておくだけ


<div class="sticky-menu">menu1 | menu2 | menu3 | menu4 | menu5</div>

デモ

以上を組み合わせるとこうなる。

デモはこちら

関連するメモ

コメント