4
1

[CSS] flexbox 内の要素でスクロールが発生するケースでハマった

Last updated at Posted at 2024-07-24

久しぶりに CSS でハマったのでメモしておく。

ハマった点

See the Pen Untitled by hoto (@hoto17296) on CodePen.

サイドバーは固定幅・メインコンテンツはブラウザ幅に合わせて可変というよくあるレイアウトを flexbox で組んで、メインコンテンツ内に Carousel のような横に長い要素を含むコンポーネントを配置した。

.outerwidth: 100%; overflow: scroll; が指定してあるので、これによりブラウザ幅に合うように要素幅が調整され、横に長い .inner (黄色い領域) のみがスクロール可能になることを期待していた。

しかし実際にはメインコンテンツ自体が横に伸びてしまい、ページ全体で横スクロールが発生してしまった。

※ 今回は横方向の話をしているが、縦方向でも同じ問題が起きる

対処

メインコンテンツに overflow: auto; を指定したところ、意図した通りの挙動になった。

(追記) min-width: 0; でも同じ動きになる (理由は後述)

See the Pen Untitled by hoto (@hoto17296) on CodePen.

原因 (推測)

おそらく flexbox の flex アイテムは overflow プロパティの値によって下記のように振る舞うのだと思う。(詳細不明)

flex アイテムの overflowvisible (または指定なし) のとき

子要素が大きい場合、flex アイテムは flex コンテナのサイズに縛られず伸びる

flex アイテムの overflowauto (または hidden) のとき

子要素が大きい場合、flex アイテムは flex コンテナのサイズを超えないように調整され、要素内でスクロール可能になる (auto の場合)

(追記)

flex コンテナに合わせて縮めてくれない理由は「デフォルトで min-width: auto になっていて、コンテンツ幅を自動計算してそれを min-width として扱うから」っぽい。そのため上記の overflow: auto; ではなく min-width: 0; を指定しても動く。

overflow: auto; を指定すると何故うまくいくのかは引き続き不明だが、min-width: 0; を指定する方法のほうが適切なのかもしれない。

4
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1