【CSS】Flexboxで横幅指定が効かない原因と解決方法

【CSS】Flexboxで横幅指定が効かない原因と解決方法 HTML/CSS

Flexbox を使ってレイアウトを組んでいると、「横幅を指定したのに反映されない」「子要素のサイズが意図通りにならない」といった問題に遭遇することがあります。これは Flexbox の特性やデフォルトの挙動に起因することが多いです。本記事では横幅指定が効かない原因と、その解決方法を解説します。

原因1:flexプロパティの初期値

Flexbox の子要素にはデフォルトで flex: 0 1 auto; が適用されています。この flex-shrink: 1 が効いているため、横幅を指定していても親要素の幅に合わせて縮小されることがあります。

.item {
  width: 200px; /* 指定しても縮む可能性がある */
}

解決方法

幅を固定したい場合は flex-shrink: 0; を指定します。

.item {
  width: 200px;
  flex-shrink: 0; /* 幅が縮まない */
}

原因2:flex-basisの優先

Flexbox では flex-basiswidth より優先されます。
flex-basis の初期値は auto で、この場合は width が参照されますが、flex に数値を指定すると flex-basis が上書きされ、意図通りにならないことがあります。

.item {
  flex: 1; /* この場合 flex-basis は 0 になる */
  width: 200px; /* 無視される */
}

解決方法

横幅を優先したい場合は flex-basis を指定します。

.item {
  flex: 0 0 200px; /* 幅200pxに固定 */
}

原因3:親要素の制約

親コンテナに display: flex; を指定していても、親の幅が制約されていると子の横幅指定が反映されません。例えば、親に overflow: hidden がある場合や、親の幅自体が小さい場合です。

解決方法

親要素の幅やレイアウトを見直し、子要素が正しく配置できるよう調整します。必要であれば min-width を設定し、縮みすぎを防ぎます。

.item {
  min-width: 200px;
}

原因4:box-sizingの影響

box-sizingborder-box でない場合、padding や border が width に含まれず、結果的に意図通りのサイズにならないことがあります。

解決方法

.item {
  box-sizing: border-box;
}

まとめ

Flexbox で横幅指定が効かない場合は、次の観点をチェックすると解決しやすいです。

  • flex-shrink の値を確認し、固定したい場合は 0 にする
  • flex-basiswidth より優先される点を理解する
  • 親要素のサイズや制約を確認する
  • box-sizing の設定を見直す

Flexbox は柔軟性が高い分、デフォルト挙動を理解しないと意図通りになりません。今回紹介した原因を押さえておけば、横幅指定のトラブルをスムーズに解決できるでしょう。