2018.07.02
コーディング
bttom固定のfixedなメニューをページ途中で止める方法
スマートフォンサイトのメニュー表示方法としてすっかりポピュラーになったposition:fixed
によるメニュー固定。簡単で便利なのですがスクロールに合わせて固定範囲を制御しようとするとjsによる制御が必要になります。
今回はそんな固定メニューの、bottomで固定しfotter上で止まる固定メニュー、の実現方法を紹介します。
各部の高さを取得する
サンプルのhtmlは以下です。
<div class="body"> <div class="fixnav"> navigation </div> <div class="footer"> footer </div> </div> <Style> .body{ padding-top:2000px; background-image: linear-gradient(to bottom, #066, #cff, #066); } .fixnav{ text-align:center; padding:20px 0; background-color: #fff; color:#000; font-weight: bold; font-size: 18px; } .footer{ text-align:center; padding:20px 0; background-color: #066; color:#000; font-weight: bold; font-size: 18px; } </Style>
フッターナビはpositionなしの状態では止めたい箇所にあるようにコーディングします。
メニューをページのどこで止めるのかを記述するために、ページ内の高さを取得する必要があります。止めるためには、
ページの最下部の高さ - ページのスクロール量 <= ナビを止めたい高さ
の3つの要素が必要なのでそれぞれを取得します。
jquery
での取得方法は以下になります。
scrollHeight = $(document).height(); scrollPosition = $(window).height() + $(window).scrollTop(); footHeight = $(".footer").innerHeight();
各状態をif文で分ける
ナビがページのbottomに固定されている状態と、先程設定した高さで動きを止めている状態をif文で分けます。
サンプルコードは以下です。
$(window).scroll(function() { scrollHeight = $(document).height(); scrollPosition = $(window).height() + $(window).scrollTop(); footHeight = $(".footer").innerHeight(); if ( scrollHeight - scrollPosition <= footHeight ) { $(".fixnav").css({ "position":"static", "bottom": auto }); } else { $(".fixnav").css({ "position":"fixed", "bottom": "0px" }); } } );
ページ下部に固定しているので、bottom基準で記述しているのがポイントです。
まとめ
調べながら初めて実装したときは、どこの高さをどう取ったら実現できるのか、計算で混乱したりしましたがわかってしまえば理屈は簡単です。お役にたてばと思います。