目次
はじめに|「なぜか横スクロールが消えない…」それ、ほぼ原因は決まっています
CSSでレイアウトを組んでいると、
- 子要素が親要素からはみ出す
- なぜか横スクロールが消えない
- スマホだけレイアウトが崩れる
こういった問題に一度は遭遇するはずです。
実は私も、初めてflexを使ったときに「どうしても横スクロールが消えない」状態にハマりました。
原因はとても単純でしたが、当時は仕組みを理解していなかったんです。
結論から言うと、
CSSで子要素がはみ出る原因は、ほぼ「サイズ計算」か「レイアウトの仕様」です。
この記事では、初心者の方でも迷わないように、
- 子要素がはみ出る本当の仕組み
- 横スクロールが発生する理由
- スマホで崩れる原因
- DevToolsで一発特定する方法
まで、実務レベルで解説します。
まず知っておくべき大前提|はみ出すのは仕様です
CSSでは、子要素が親要素を超えて表示されること自体は異常ではありません。
.parent {
width: 300px;
}
.child {
width: 400px;
}
この場合、子要素の方が大きいので右側にはみ出します。
つまり、
親より大きく指定すれば、はみ出すのは自然な挙動
です。
問題は「意図せずはみ出している」ケースです。
CSSで子要素がはみ出る主な原因7つ
原因①:width + padding のサイズ計算
これは最も多い原因です。
.child {
width: 100%;
padding: 20px;
}
初期状態では、
実際の横幅 = width + padding + border
になります。
そのため、width:100% に padding が加算され、親幅を超えます。
解決策
* {
box-sizing: border-box;
}
実務ではこれを最初に入れておくのが基本です。
これだけで横スクロール問題の多くは解決します。
原因②:min-widthがスマホで悪さをしている
横スクロールが消えない原因として非常に多いのが min-width です。
.child {
min-width: 500px;
}
画面幅が375pxでも500px未満にならないため、はみ出します。
スマホでレイアウトが崩れる典型例です。
原因③:position:absoluteでフローから外れている
.child {
position: absolute;
right: -50px;
}
absoluteは通常のレイアウト計算から外れます。
親に position: relative; を付けていない場合、想定外の位置に配置されることがあります。
原因④:flexで折り返していない
.container {
display: flex;
}
.item {
width: 300px;
}
横幅が足りないと、そのまま横にはみ出します。
.container {
flex-wrap: wrap;
}
これを忘れているケースは本当に多いです。
原因⑤:gridのgapやpaddingの合計幅
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 40px;
}
gapやpaddingの合計が親幅を超えると、横スクロールが発生します。
gridは「1frだから安全」と思いがちですが、gap計算を忘れると崩れます。
原因⑥:画像の固定幅指定
img {
width: 800px;
}
これはスマホ崩れの代表例です。
img {
max-width: 100%;
height: auto;
}
必ず入れておきましょう。
原因⑦:長い英数字・URLが改行されない
<p>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</p>
これも横スクロールの原因になります。
p {
overflow-wrap: anywhere;
}
【最速解決】DevToolsで原因を特定する方法
感覚で探すより、DevToolsを使う方が早いです。
手順
- F12で開く
- Elementsタブで
bodyを選択 - 横に異常に広がっている要素を探す
- Computedタブで width を確認
どの要素がはみ出しているか特定できれば、修正は数分です。
overflowは最後の手段
.parent {
overflow-x: hidden;
}
これは「隠しているだけ」です。
根本原因を直さない限り、将来また崩れます。
スマホでレイアウトが崩れる本当の理由
スマホ崩れの原因はほぼこの4つです。
- 固定px指定
- min-width
- flex-wrapなし
- 画像の固定サイズ
レスポンシブ設計を前提にしていれば、ほとんど防げます。
横スクロールが消えないときのチェックリスト
- box-sizingはborder-boxか
- min-widthを使っていないか
- flex-wrapは有効か
- 画像にmax-width:100%があるか
- position:absoluteを使っていないか
- gapやpaddingの合計幅は適切か
よくある誤解
× overflow:hiddenを入れればOK
× 親にheightを指定すれば直る
× 子要素が悪い
原因は「CSSの計算と仕様」です。
まとめ|はみ出しは必ず論理的に解決できる
CSSで子要素がはみ出る問題は、感覚ではなく計算の問題です。
- width
- padding
- box-sizing
- min-width
- flexやgrid
- 画像サイズ
これらを一つずつ確認すれば、必ず原因は特定できます。
まずは
* {
box-sizing: border-box;
}
を基本設定にしてください。
横スクロールが消えない悩みは、必ず解決できます。