本文へスキップ
メニュー
テーマ

CSSだけでスムーススクロールを実装し、ヘッダーの高さ分だけ余白を確保する

目次

ページ内リンクのスムーススクロールは、以前はJavaScriptで実装していましたが、今はCSSだけで実装できます。scroll-behaviorとscroll-margin-topを使います。

実装方法

ページ全体のスクロールを滑らかにするために、htmlにscroll-behavior: smooth;を指定します。

アンカーリンクをクリックすると、href属性に対応するIDを持つ要素が:targetで選択されます。その要素にscroll-margin-topを指定して、ヘッダーの高さ分の余白を確保します。値には、ヘッダーの高さを入れたカスタムプロパティ--headerHeightを使っています(カスタムプロパティを使わずに固定値でも良く、カスタムプロパティの名前も任意です)。

CSSCSS · 6行
html {  scroll-behavior: smooth;}:target {  scroll-margin-top: var(--headerHeight, 0px); /* ヘッダーの高さ分の余白を確保 */}

ヘッダーの高さを常に更新する方法は、以下の記事で解説しています。

JavaScriptでCSSのカスタムプロパティを設定・取得する

動きを減らす設定に配慮する

OSで「視差効果を減らす」などの、動きを減らす設定をしている人には、スムーススクロールを止めておくと親切です。prefers-reduced-motionのメディアクエリを使って、動きを減らす設定をしていない場合だけ、スムーススクロールを有効にします。

CSSCSS · 5行
@media (prefers-reduced-motion: no-preference) {  html {    scroll-behavior: smooth;  }}

ブラウザの対応状況

scroll-behaviorはSafari 15.4から、scroll-margin-topはSafari 14.1から対応しています。ChromeとFirefoxは、どちらもそれより前から対応しています。

参考・引用

この記事は役に立ちましたか?