🚧
【CSS】`display: flex` × `overflow: scroll` が効かない問題
display: flex
× overflow: scroll
が効かない問題の正体と解決法
【CSS】はじめに
Flexbox を使ってレイアウトを組むとき、overflow: scroll
を指定してもなぜかスクロールされない……という現象に遭遇したことはありませんか?
.container {
display: flex;
flex-direction: column;
}
.child {
flex: 1;
overflow-y: scroll;
}
↑このように書いてもスクロールできないケースが多く、初心者にとってはとても分かりづらい落とし穴です。
本記事ではこの問題の原因と、min-height: 0
を使った明確な解決方法を具体例付きで解説します。
結論
状態 | スクロール動作 | 説明 |
---|---|---|
min-height: 0 なし
|
❌ 動かない |
flex 子要素が親の高さ制限を無視してしまう |
min-height: 0 あり
|
✅ スクロールできる | 高さ制限が有効になることで overflow が効く |
min-height: 0
が必要なのか?
なぜ Flexbox の仕様では、flex
子要素は初期状態で min-height: auto
(つまり内容に応じて縮まない)になっています。
このため、overflow
を効かせたい子要素が親の高さを無視して スクロールが発生しない のです。
つまり「親要素より小さくなっていいよ」という許可を出すのが
min-height: 0
。
具体例で見る解決方法
✅ 正しいパターン
<div class="container">
<header>ヘッダー</header>
<div class="content">長い長いコンテンツ...</div>
</div>
.container {
display: flex;
flex-direction: column;
height: 100vh;
}
.content {
flex: 1;
min-height: 0; /* ←これがないとダメ */
overflow-y: auto;
}
このように書くと、.content
に縦スクロールが発生するようになります。
❌ よくある間違い
.content {
flex: 1;
overflow-y: auto;
}
min-height: 0
を省略すると、flex
の子要素は縮まらず、結果としてスクロールすべき領域が親要素のサイズを突き抜けてしまいます。
つまり、スクロールバーは表示されないまま。
まとめ
ポイント | 内容 |
---|---|
問題 | Flexbox の子要素が overflow を無視する |
原因 |
min-height: auto が効いて縮まない |
解決法 |
min-height: 0 を明示的に指定する |
おわりに
Flexbox は便利ですが、細かい仕様の罠にハマりがちです。
特にレイアウトの中でスクロールを使いたいときは、min-height: 0
を忘れずに指定しましょう。
Discussion
親が flex: 1 なら min-height: 0 が無くても 利きそうな気がする
参考 playground