ページ内リンクでスムーススクロールを実装する際、たいていはJavaScriptやjQueryを用いる方法を検討するでしょう。
しかしCSSの新機能scroll-behavior
プロパティを使えば、簡単にスムーススクロールを実現できます。
「scroll-behavior」とは?
「scroll-behavior」は、ページ内リンクをクリックときに、該当箇所へ時間をかけてスクロールするイベント(スムース・スクロール)を実行させるプロパティです。
CSSわずか1行で設定が可能で、JavaScriptなしで手軽に導入できます。
CSS:
html { scroll-behavior: smooth; }
HTMLサンプル
<a href="#example">ここをクリックすると</a> . . . <div id="example">ここまでスクロールするよ</div>
実際にこのサイトでも導入しています。
下のボタンをクリックしてみてください。
「scroll-behavior:smooth;」が効かないときは?
スムーススクロールが動作しない場合、以下のような理由が考えられます。
- 対象の親要素に
overflow:hidden;
が設定されている - 対象の要素に
height:100vh;
が設定されている - 他のJavaScriptとコンフリクト(干渉・競合)している
scroll-behaviorプロパティの構文
「scroll-behavior」プロパティの初期値はautoで、スクロールスピードを変えるためにはsmoothを指定します。
/* 初期値 */ html { scroll-behavior: auto; } /* スムーススクロール */ html { scroll-behavior: smooth; }
「scroll-behavior」のブラウザ対応状況
Safariではバージョン15.4からscroll-behaviorプロパティに対応し、モダンブラウザ全てで使えるようになりました。
注意点
便利な「scroll-behavior」ですが注意点もあります。
- すべてのページ内リンクがスムーススクロールになる
- 移動速度の設定ができない
- 遷移先の位置を細かく指定できない
- URLにアンカーリンクがつく
スクロール位置を調整する「scroll-padding-top」を利用する
遷移先の位置を指定したい場合、「scroll-padding-top」を使います。
例:
html { scroll-padding-top: 100px; }
この例では画面の最上部から100px下に移動します。
リンクした際のハッシュ(#)をURLから取り除く
リンクした際にURLの末尾につく『#』を取り除くjavascriptを紹介します。
(function() { window.addEventListener("hashchange", function() { const sp = location.href.split("#"); history.replaceState(null, null, sp[0]); }); })();
まとめ
scroll-behavior:smooth;
はいくつかの注意が必要なものの、JavaScriptやjQueryライブラリで実装する場合と比べて格段に、CSSだけで手軽にスムーススクロールのアニメーションを加えることのできる便利なプロパティです。
ぜひお試しください。