
例えば、以下のような場合。
See the Pen
Untitled by junpei (@junpei-sugiyama)
on CodePen.
ヘッダーのメニューをクリックすると、各コンテンツの上にヘッダーが重なってしまうのが分かります。
今回は、ページ内スクロールしてもコンテンツに重ならない方法を解説します。

(有料になっていたらすいません🙇♂️)
CSSだけで固定ヘッダー時のページ内スクロール位置がズレるのを解決する方法
先ほどのデモはヘッダーをposition: fixed;
で固定していて、これを書くと要素が浮くような感じになるため、その下に要素が潜り込んでしまうのです。
これを解決するには、ヘッダーの高さが50pxなら、以下のコードを書けばOKです。
html {
scroll-padding-top: 50px; /* ヘッダーの高さ */
}
デモはこちらです。
See the Pen
Untitled by junpei (@junpei-sugiyama)
on CodePen.
今度はセクションの真上にピッタリとヘッダーが来ました(ページ内スクロールした後に、少しスクロールすると分かります)
固定ヘッダーの高さが可変の場合
scroll-padding-top
を使う場合は、ヘッダーの高さが決まっている場合ですが、中には画面幅によって可変する場合もあるかも知れません。
その場合は変数を使うなどの方法もあるかも知れませんが、jQueryを使ってヘッダーの高さを取得して、その分をmargin-topでコンテンツを下げるという方法もあります。
その方法については、以下の記事を参照下さい。
-
【jQuery】固定ヘッダーでページ内リンクのジャンプ先の位置を調整する方法
続きを見る
まとめ
今回は、scroll-padding-top
を使って、固定ヘッダー時のページ内スクロール位置がズレるのを解決する方法を解説しました。
この方法は一行だけで済むので簡単ですが、ヘッダーの高さが可変の時は注意しましょう。
以上になります。
