スムーススクロールが有効にならずにハマった話と解決策
Web制作やフロントエンド開発をしていると、「アンカーリンクをクリックしたときに、ページ内をなめらかにスクロールさせたい」という要望はよくあります。最近ではCSSの scroll-behavior: smooth;
を使えば、たった1行で実現できるため、私も当たり前のように導入していました。
しかし、ある日「なぜか自分のWindows環境だけ、どのブラウザでもスムーススクロールが効かない」という現象に直面。iPhoneやMacでは問題なく動作するのに、WindowsのChrome・Edge・Firefoxでは、アンカーリンクをクリックすると一瞬でジャンプしてしまい、まったくスムースになりません。
1. コードもCSSも間違っていないのに…
まず疑ったのは自分の実装ミス。
- CSSの
html, body { scroll-behavior: smooth; }
は正しく書いてある - 余計なJavaScriptでスクロールを上書きしていない
- アンカーリンクやIDの指定も正しい
- ブラウザのバージョンも十分新しい(Chrome 61以上、Edge 79以上、Firefox 36以上)
念のため、bodyやsectionなどに overflow: hidden;
がかかっていないかも確認。
一時的にJSで強制的に scrollIntoView({behavior: 'smooth'})
を書いてみても、やはり一瞬でジャンプするだけ。
「なぜだ……?」
2. ブラウザの設定や拡張機能を疑う
次に疑ったのはブラウザの設定や拡張機能。
- 拡張機能をすべて無効化
- シークレットウィンドウで検証
- ChromeのflagsやEdgeの実験的機能もリセット
それでも変化なし。
「もしかしてWindowsのOS自体の設定が関係しているのでは?」と、ふと頭をよぎりました。
3. まさかの設定
調べてみると、Windows 10/11 には「設定 → 簡単操作 → ディスプレイ → Windowsでアニメーションを表示する」という項目があり、これをオフにしていると、
- CSSの
scroll-behavior: smooth;
- JavaScriptの
scrollIntoView({behavior: 'smooth'})
- そのほか多くのアニメーション
が一切効かなくなる、という仕様だったのです。
実際にこの設定をオンに戻してみたところ、今まで何をやっても効かなかったスムーススクロールが、どのブラウザでも一発で有効になりました。
4. なぜこの仕様なのか
これは「ユーザーが視覚的な動きを減らしたい(=酔いやすい、集中しづらい等)」というアクセシビリティ配慮のため、
OS側の「アニメーションを減らす」設定(prefers-reduced-motion: reduce
)が有効だと、
ブラウザも自動的にアニメーションを抑制する、という流れです。
つまり、ユーザーの意図を尊重しているという点では正しい挙動なのですが、
開発者視点では「なぜ自分の環境だけ動かないのか?」とハマりやすい落とし穴でもあります。
5. 解決策と今後の注意点
- Windowsでスムーススクロールが効かない場合は、まず「アニメーションを表示する」設定を確認
- サイトのユーザーにも「OSの設定によってはアニメーションが無効化される」ことを想定しておく
- どうしても全員にアニメーションを強制したい場合は、JSのポリフィル(smoothscroll-polyfill等)を使う手もあるが、アクセシビリティの観点からは推奨されない
まとめ
「コードもCSSも合っているのに、なぜか自分のWindowsだけスムーススクロールが効かない」
そんなときは、OSのアクセシビリティ設定を疑ってみてください。
自分の環境だけで再現しないバグは、意外とこうした“外部要因”が原因のことも多いです。
同じようにハマった方の参考になれば幸いです!