CSSでヘッダーを一番上に固定したままスクロールできるようにする3つの方法
ヘッダーを一番上に固定しよう
ホームページのヘッダーを一番上に固定したいことってよくありますよね?
今回は3つほどやり方を紹介します。
-
position: fixed
を使う方法 -
display: flex
を使う方法 -
position: sticky
を使う方法
サンプルコードのbase
,.header
,.contents
部分は同じものを使っています。
おすすめは3つ目のposition: sticky
を使う方法です。
position:fixed
を使う方法
1. 古き良き、ヘッダーの高さと同じ長さのマージンを中身の要素に入れる方法です。
この後紹介する書き方と違って昔からあるスタイルを使うのでIEなど古いブラウザでも動く可能性が高いです。
ただ、ヘッダーの高さが決まっていないとマージンの調整ができません。マジックナンバーになるのがよくないですね。最近はCSSで変数も使えるのでそちらを使ってもいいですが、それを使えるブラウザならこれ以外の書き方でやったほうがいいと思います。
display: flex
を使う方法
2. CSSでレイアウトと言ったらflexですよね。もちろん、ヘッダーにも使えます。
flexにしたもの(サンプルコードではbaseクラスがついたdiv要素)を画面いっぱいに伸ばし、ヘッダーの高さを確保する方法です。
こちらはcontents部分にoverflow: auto
をつけることによってスクロールを可能にしています。
今回は画面いっぱいにするためにtop
、bottom
、left
、right
を使っています。
top
とleft
だけ指定してwidth
とheight
を設定する方法もありますが、iOS系でうまく動かなかったような気がします。(手元に端末がないため、確かめることができません。すみません。)キーボードが出ているときの動きがよくなかった記憶があります。
それ以外は安定した動きをすると思うので比較的おすすめできます。スクロールバーをヘッダーにかぶせたくない場合はこの方法をとることになると思います。
position: sticky
を使う方法
3. 主要ブラウザに実装されて、2年半以上経った[1]ので、そろそろ使ってもいいかなといった印象です。
これの使い方は簡単。ヘッダーにposition: sticky
を指定して、top: 0px
と書けば一番上に固定されます。
position: sticky
をつけるとその要素は指定された場所にとどまるようになりますが、position: fixed
と違い祖先要素の指定された場所にとどまります。
最近のブラウザではこれを使っておくと間違いないでしょう。
まとめ
どのブラウザを対象にするかで多少変わるかもしれませんが、個人的にはposition: sticky
がおすすめです。
ちなみに、Zennさんもposition: sticky
を使っていますね。
CSSもどんどん便利になっていい時代になりましたね。
蛇足
誤字脱字のチェックにChatGPTを使ってみました。stickyのスペルミスが見つかりました。危なかった。
いい時代になりましたね。
参考
-
Widely available になるのが主要ブラウザでサポートされてから2.5年経過のようです。 https://developer.mozilla.org/ja/docs/Glossary/Baseline/Compatibility ↩︎
Discussion
flex を挙げるなら grid でもできますね。感あります。(こっちであれば grid-areaで名前をつけてもいいかもしれません
確かにそうですね。gridは頭から抜けていました。
grid-template-rowsで名前を付けれるのも初めて知ったので勉強になりました。
ありがとうございます。