Quantcast
Channel: CSSタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8920

position: sticky;で固定ヘッダをらくらく実装

$
0
0

実装

  1. 固定させたい要素にposition: sticky;を付与する
  2. 固定させる位置top: 0;を指定する

footerの場合はbottom: 0;とすれば下に固定されます。

HTML
<body><headerclass="ly_header">ヘッダ</header><mainclass="ly_main">メインコンテンツ</main><footerclass="ly_footer">フッタ</footer></body>
CSS
.ly_header{position:sticky;position:-webkit-sticky;top:0;}

See the Pen fixed-header by heeroo-ymsw (@heeroo-ymsw) on CodePen.

実装時のポイント

stickyの機能の仕方

stickyを指定した要素は、それを内包するコンテナ内でのみ固定されます。
つまり、前述の例でいえば、body内で固定されていることになります。

以下の例を見れば分かりやすいかと思います。

HTML
<divclass="bl_contents"><divclass="bl_contents_item bl_contents_item__sticky">スティッキーアイテム</div><divclass="bl_contents_item">普通のアイテム</div></div><divclass="bl_contents"><p>hogehoge fugafuga</p></div>
CSS
.bl_contents_item__sticky{position:sticky;top:0;}

See the Pen sticky-sample1 by heeroo-ymsw (@heeroo-ymsw) on CodePen.

bl_contents_item__stickyクラスを指定した要素は、それを内包するbl_contents内でのみスティッキーを発揮することがお分かりいただけたと思います。

要素1つのみを内包する場合はstickyが機能しない

前述の内容を理解すれば当たり前だろと言いたくなるかもしれませんが、以下のような場合はstickyが機能しません。

HTML
<divclass="bl_contents"><divclass="bl_contents_item bl_contents_item__sticky">スティッキーアイテム</div></div>

この場合、stickyアイテムには兄弟要素がないため、stickyしたくてもする場所がありません。
よって、うまく機能しないということになります。

対応ブラウザ

Can I useによると、ほぼ全ての主要ブラウザは対応しています。
Safariではベンダープレフィックスを加える必要がありますので、以下のように記述します。

prefix
.stickyItem{position:sticky;position:-webkit-sticky;}

position: fixed;との違い

position: fixed;でもヘッダ固定はできますが、大きな違いとしては、ページレイアウト内にその要素のための空白を用意してくれないということです。

実際に見れば違いは一目瞭然です。
一番最初の例を用いて、position: fixed;にするとこうなります。

スクリーンショット 2021-01-18 19.40.05.png

fixedを使うと、固定したい要素のwidthを指定したり、メインコンテンツにかぶらないようにmarginとったりなど、いろいろと気をつかわなければいけないことが発生します。
そのような点でstickyは簡素に記述ができ、便利です。

まとめ

stickyの動きをテキストで説明するならば、以下の特徴を持っているといえます。

  • relativestaticのように、ページレイアウト内にその要素のための空間が作られる
  • fixedのようにビューポートの同じ場所にぴたっとくっつく
  • relativeな親要素を持つabsoluteのようにそれを内包する親要素にとどまる

参考文献

CSS Position Sticky - How It Really Works! | by Elad Shechter
position - CSS: カスケーディングスタイルシート | MDN


Viewing all articles
Browse latest Browse all 8920

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>