スムーススクロール(CSS のみ)

インタラクション Easy #css #scroll #anchor #minimal

ナビゲーションクリックで該当セクションへ滑らかにスクロール。anchor リンクの代わりに scrollIntoView() を使う、iframe 環境でも安全に動く実装。

▶ プレビュー

解説

ナビのボタンを押すと、対応するセクションへ滑らかにスクロールする実装です。CSS 側で html{scroll-behavior:smooth} を指定しつつ、各ボタンの data-to 属性から移動先を読み取り、JavaScript の scrollIntoView({behavior:'smooth'}) で移動させています。アンカーリンク(#id)ではなくスクリプトで動かすため、URL のハッシュが変わらず、プレビューや埋め込み環境でも安全に動作するのが特徴です。

使う場面

  • 1ページ完結の LP で章へジャンプする目次ナビ
  • サービス紹介の「特徴」「料金」「FAQ」への横移動
  • 長い記事ページの固定ヘッダーからのセクション移動

ナビは position:sticky; top:0 で上部に貼り付くため、スクロール後もすぐ次のセクションへ移れます。移動先は scrollIntoViewblock:'start' で先頭にそろえますが、固定ヘッダーと重なる場合は対象に scroll-margin-top を付けて隠れを防ぎます。スムーズな動きが不要なユーザーには prefers-reduced-motion で瞬時移動に切り替えると、操作の負担を減らせます。

使用例・適したシーン

  • ワンページ LP のセクション移動
  • 目次からのジャンプ

よくある質問

アンカーリンクと何が違いますか?
通常の #id リンクは URL にハッシュが付き、iframe や一部プレビュー環境で意図せず親ページが動くことがあります。このスニペットは scrollIntoView で移動するためハッシュが付かず、埋め込み環境でも安全に動く点が違いです。
固定ヘッダーで移動先が隠れます。どうすれば?
移動先のセクションに scroll-margin-top をヘッダーの高さぶん指定すると、スクロール停止位置がヘッダーのぶん下がり、見出しが隠れなくなります。JS は変更不要です。
追加日:2026-05-11
← すべてのスニペットへ戻る