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-04
  • Edge

    v79+
    2020-01-15
  • Safari

    v14.1+
    2021-04-26
    フォールバック
    v11から
    scroll-snap-margin
  • Safari (iOS)

    v14.5+
    2021-04-26
    フォールバック
    v11から
    scroll-snap-margin
  • Firefox

    v90+
    2021-07-13

機能名やコードで検索できます

例:aspect-ratio、:has()、padding-top

別の言葉や、プロパティ名で試してください

検索を読み込めませんでした