scroll-margin
ページ内リンクなどで移動したときに、移動先の要素の手前に空ける余白を指定するプロパティ。 固定ヘッダーの下に見出しが隠れないよう、空のアンカー要素をずらしていたハックを置き換えられます。
今の書き方
移動先の要素に、手前に空けたい分を指定します。 idは移動先の要素にそのまま付けられ、空の要素もラッパーも要りません。
h2 {
scroll-margin-top: 80px;
}
<h2 id="contact">お問い合わせ</h2>以前の書き方
見出しをラッパーで囲み、空のアンカー要素を絶対配置で、ヘッダーの高さ分だけ上にずらしていました。 idはアンカーに付けるため、見出しのレイアウトは変わりませんが、idのためだけの要素とラッパーが要ります。
.section {
position: relative;
}
.anchor {
position: absolute;
top: -80px;
}
<section class="section">
<a id="contact" class="anchor"></a>
<h2>お問い合わせ</h2>
</section>置き換えるときの注意点
- 効くのは、ページ内リンクや
#付きのURLで開いたとき、scrollIntoView()のように、要素を目がけて移動したときです。 スクロールスナップを使っている場合は、止まる位置にも効きます。 それ以外の、座標を渡すscrollTo()などには効きません。 - 移動先の要素ごとに指定します。
ヘッダーの高さを1か所で決めたい場合は、
htmlにscroll-padding-topを指定する方法もあります。scroll-padding-topも、2021年4月から全ブラウザで使えます。 - ヘッダーの高さが画面幅で変わる場合は、高さをカスタムプロパティにして、ヘッダーと
scroll-margin-topの両方で使います。
Browser Support
Chrome
v69+2018-09-04Edge
v79+2020-01-15Safari
v14.1+2021-04-26フォールバック
v11からscroll-snap-marginSafari (iOS)
v14.5+2021-04-26フォールバック
v11からscroll-snap-marginFirefox
v90+2021-07-13