横スクロールバーの発生源を素早く特定する方法と最新の防止策

広告
横スクロールバーの発生源はデベロッパーツールのConsoleですぐに特定できる
横スクロールバーの発生源の特定方法として有名なのは全称セレクタですべての要素にoutline
を付与して確認する方法だと思われますが、次のスクリプトをデベロッパーツールのConsoleに貼り付けて確認したほうが手っ取り早いです。
const windowWidth = document.documentElement.clientWidth$$('*').forEach((el) => { el.style.outline = '1px solid tomato' if (windowWidth < el.getBoundingClientRect().width) console.log(el)})
この方法であればすべての要素のoutline
を可視化しつつ、Consoleに発生源となる要素を出力することができます。

要素の幅の取得は範囲を広げるためにel.getBoundingClientRect().width
としていますが、margin
が原因ではみ出しているものは取得できないのでそこは自力で解決してください。
こちらのサンプルで確認できます。
横スクロールバーの防止には overflow-x:clip を使うのが良い
横スクロールバーの防止策として今まで用いられてきた防止策はbody
要素などにoverflow-x:hidden
を指定するやり方でしょう。
この方法では横スクロールの発生を抑制することができますが、内包しているposition:sticky
が動作しなくなるというデメリットを抱えていました。 overflow-x:hidden
を指定した際にy軸のoverflow
がvisible
でなくなってしまうのが原因です。
一方、新しく登場したclip
は指定した軸のスクロールを禁止しつつ片方の軸には干渉しないためposition:sticky
が動作します。
同じくposition:sticky
を動作させつつはみ出しを防止する方法にcontain:paint
がありますが、こちらは内包しているposition:fixed
が動作しなくなってしまいます。
結果として汎用性を求めるなら横スクロールバーの防止にはoverflow-x:clip
を指定しておくと良さそうです。当ブログでもbody
にoverflow-x:clip
を指定しておりますが、position:sticky
の動作に支障は出ておりません。
/* Recommended */body { overflow-x: clip;}
clip
は現在全てのモダンブラウザでサポートされていますが、iOS Safariはバージョン16からのサポートとなります。