Flexboxを使ったレイアウトでは、「width を指定しているのに思った通りの幅にならない」「flex-basis を指定すると挙動が変わる」といった疑問を持つことがよくあります。flex-basis は一見すると width と似た役割に見えますが、Flexboxのレイアウト計算においては明確に異なる意味を持っています。本記事では、flex-basis の基本的な役割を整理し、width との違いを仕組みから理解できるように解説します。
flex-basisとは何か
flex-basis は、フレックスアイテムの「初期サイズ」を指定するためのプロパティです。ここでいう初期サイズとは、Flexboxの伸縮計算(flex-grow や flex-shrink)が行われる前の基準となる大きさを指します。Flexboxはまず flex-basis を基準にアイテムのサイズを決定し、その後に余白や不足分を分配します。
.item {
flex-basis: 200px;
}
この指定により、アイテムは「まず200pxとして扱われる」という前提でレイアウト計算が行われます。
widthとの根本的な違い
width はボックスモデルにおける要素の幅を直接指定するプロパティです。一方、flex-basis は「Flexboxレイアウト計算の入力値」であり、レイアウトアルゴリズムの一部として扱われます。Flexコンテナ内では、width があっても flex-basis が優先されるケースが存在します。
flex-basisが優先される条件
flex-basis が auto 以外の値で指定されている場合、Flexboxでは width よりも flex-basis が優先されます。これは仕様上の挙動であり、バグではありません。
.item {
width: 300px;
flex-basis: 150px;
}
この場合、Flexboxの計算上は 150px が基準サイズとして使われ、width の 300px は無視されます。その結果、「widthを指定したのに効かない」と感じることになります。
flex-basis:auto のときの挙動
flex-basis を auto にすると、Flexboxは要素の width(または height)を参照して初期サイズを決定します。つまり、flex-basis:auto の状態では width が間接的に効いている形になります。
.item {
flex-basis: auto;
width: 250px;
}
この場合、250px が初期サイズとして扱われ、その後に flex-grow や flex-shrink の計算が行われます。
flex shorthandとの関係
flex プロパティは、flex-grow、flex-shrink、flex-basis をまとめて指定するショートハンドです。実務ではこの shorthand の影響で flex-basis を意識せずに使ってしまうことが多く、挙動を誤解する原因になります。
.item {
flex: 1;
}
この指定は flex: 1 1 0% と解釈され、flex-basis が 0% に設定されます。その結果、width が指定されていても初期サイズとしては使われず、すべてのアイテムが均等に伸びる挙動になります。
flex-basis:0 が意味するもの
flex-basis: 0 は、「すべてのアイテムを同じスタートラインに立たせる」という意味を持ちます。内容量や width を無視し、余白の分配だけでサイズを決めたい場合に使われます。カードレイアウトや均等カラムではよく使われる指定です。
widthだけでFlexboxを制御しない理由
Flexboxでは、単純に width を並べるのではなく、「全体の余白をどう分配するか」が重要になります。そのため、width による固定指定よりも、flex-basis を基準にした設計のほうが柔軟で破綻しにくくなります。
実務での使い分け指針
Flexboxを使う場合は、「初期サイズは flex-basis で決める」「最小・最大制約は min-width や max-width で補う」「flex の shorthand を使う場合は flex-basis の値を必ず意識する」という考え方が安定します。width はFlexbox外のレイアウトや、非フレックス要素で使うと役割が明確になります。
よくある誤解とトラブル
flex-basis と width を同時に指定してしまい、どちらが効いているのか分からなくなるケースは非常に多く見られます。この場合は、まず flex-basis を確認し、auto なのか明示指定なのかを切り分けることがトラブル解決の近道になります。
まとめ
flex-basis は width の代替ではなく、Flexboxのレイアウト計算における基準値です。flex-basis が指定されている場合は width より優先され、auto の場合にのみ width が参照されます。この違いを理解して設計すれば、「widthが効かない」「Flexboxが思い通りにならない」といった混乱を避けることができます。Flexboxでは、サイズ指定ではなく「分配設計」を意識することが重要です。
