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基準で記述しているのがポイントです。

まとめ

調べながら初めて実装したときは、どこの高さをどう取ったら実現できるのか、計算で混乱したりしましたがわかってしまえば理屈は簡単です。お役にたてばと思います。

SHARE

この記事の筆者

Web&Soundクリエイター 田村 培修

Web&Soundクリエイター 田村 培修

楽器とパソコンのキーボードを使い分ける当社のマルチクリエイター。e-sportsに興味津々であれこれ情報を収集中。

WEBSITE DESIGN REQUEST

ホームページ制作・リニューアルの
ご相談はお気軽に

TEL 06-6537-9941 平日 9:00〜19:00

〒550-0012 大阪府大阪市西区立売堀2-5−41

ホームページ制作を相談する