ページの途中から追従するボタンを作るならposition: stickyが便利で簡単
ページをスクロールしていき途中からボタンを追従させる場合は、jsで高さを取得して任意の高さを過ぎたらボタンを表示&追従させる処理をしていた(ような気がする)が、ページ途中からの追従について、気になっていたposition: stickyを使用したらとても便利でした。
スポンサーリンク
position: stickyの使い方
position: stickyで追従させるには、親要素の中の子要素に使用することになります。
サンプルページを表示
htmlは以下のようにしました。
親要素の中の子要素(ボタン部分)にposition: stickyを付けて追従させるイメージです。
<div class="stickybox">
<div class="stickybox_header">スクロールさせるための余白</div>
<nav class="stickybox_nav">
<ul>
<li><a href="#area1">ボタン1</a></li>
<li><a href="#area2">ボタン2</a></li>
<li><a href="#area3">ボタン3</a></li>
<li><a href="#area4">ボタン4</a></li>
</ul>
</nav>
<div id="area1" class="stickybox_area areacolor">エリア1</div>
<div id="area2" class="stickybox_area">エリア2</div>
<div id="area3" class="stickybox_area areacolor">エリア3</div>
<div id="area4" class="stickybox_area">エリア4</div>
</div>
親要素(stickybox)の中の子要素(stickybox_nav)にposition: stickyを付けて、ボタン(子要素)を追従させます。
cssは以下のようにしました。
ボタン全体を梱包している部分にposition: stickyを付けています。
.stickybox_nav {
position: sticky;
top: 10px;
}
.stickybox_nav ul {
display: flex;
justify-content: center;
flex-wrap: wrap;
margin: 20px 0 0;
}
※position: stickyに関係する親要素・子要素のcssのみ記載。ここではボタンの形状に関する部分は省略しています。
見てもらえばわかるように、ボタン全体を梱包している部分(stickybox_nav)にposition: stickyを付けただけです。
スクロールするとピタッと止まってくれるの気持ちいいですね。
jsを使用せずに実装できるなんて便利です。
position: stickyが効かないときに確認すること
とても便利なposition: stickyですが、ひとつ注意点があります。
親要素の中の子要素にposition: stickyを付けているのにも関わらず、動作しない場合は親要素にoverflow: hiddenがついているかもしれません。 position: stickyを適用した要素の親要素に、overflow: hiddenが適用されていると動作しません。
もし、親要素の中の子要素にposition: stickyを追加して、topなどの位置も指定して、それでも追従してくれない場合は、overflow: hiddenが隠れていないか調べてみることをお勧めします。
position: sticky;の仕組みや実際の使い方をやさしく解説
https://coliss.com/articles/build-websites/operation/css/css-position-sticky-how-it-really-works.html
【jQuery】スクロールすると出てきてフッター直前で止まるフローティングボタンの実装
https://www.asobou.co.jp/blog/web/jquery-floating
