flex
アイテムの伸縮
フレックスアイテムが、空いたスペースに合わせてどれだけ伸び縮みするかをまとめて指定します。
サンプルコード
実行結果
解説
flex は、フレックスアイテム(display: flex の親の直下の子要素)に指定し、伸び縮みの仕方を決めます。
flex: 1 を指定すると、空いているスペースを埋めるように伸びます。複数のアイテムに flex: 1 と flex: 2 を指定すると、余ったスペースを 1:2 の割合で分け合います。
flex は flex-grow(伸びる比率)・flex-shrink(縮む比率)・flex-basis(基本の大きさ)の3つをまとめて書く一括指定です。
flex-grow の grow は「成長」という意味です。親要素の余白を成長の余地と考え、その余地を子要素がどういう割合で使うかを指定します。3つ並んだうち2番目だけに flex-grow: 1 を指定すると、余白をすべて2番目がもらって伸びます。
迷ったら「flex: 1 を指定した要素は、余った幅を割り当てる」と覚えておけば十分です。
応用例・注意点
よく使う値
| 値 | 説明 |
|---|---|
flex: 1 | 残りのスペースを埋める(1 1 0% と同じ) |
flex: auto | 内容の大きさを基準に伸び縮み |
flex: none | 伸びも縮みもしない |
flex: 0 0 200px | 200px に固定 |
flex-grow / flex-shrink / flex-basis | 個別に指定するプロパティ |
検索欄を伸ばし、ボタンは固定にする
入力欄に flex: 1 を指定すると、ボタン以外の幅をすべて使います。
2番目の子要素だけ、余白を埋めるように伸ばす(flex-grow)
1と3は中身の幅のまま、2が「成長の余地」をすべて使って広がります。
画像は固定幅、テキストは残りの幅をすべて使う
画像を150pxにしたとき、テキストの幅を「親の幅 − 150px − 間隔」と計算するのは面倒です。テキストに flex: 1 を書けば、残りの幅が自動で割り当てられます。
注意点
- 01flex は子要素(フレックスアイテム)に書くプロパティです。
- 02flex: 1 の要素に長い単語があると縮まないことがあります。その場合は min-width: 0 を指定します。
flex-basis と flex-shrink
flex-basis:flex 専用の幅
flex-basis は、flex 専用の width 設定プロパティです。伸び縮みする前の、基本の大きさを決めます。
| width | flex-basis | |
|---|---|---|
| 使える要素 | どの要素にも使える | flex の子要素(フレックスアイテム)にのみ使える |
| 両方書いたとき | — | flex-basis の値が優先される |
| 向き | 常に横幅 | flex アイテムが並ぶ方向(flex-direction)によって横幅か高さの値になる |
例1:width と flex-basis を両方書く
width: 100px と flex-basis: 200px を両方書くと、flex-basis の 200px になります。
コードと表示の対応
flex-basis: 200px;左の箱はwidth: 100pxも書いてありますが、flex-basis が優先されて 200px の幅になります。width: 100px;右の箱は width だけなので、そのまま 100px です。
flex-shrink:縮む割合
shrink は「縮む」という意味で、flex-shrink は 圧縮率 を指定します。子要素の幅の合計が親要素からはみ出す場合に使います。
1、2、3 などの単位なしの数値で指定し、数値が大きいほどよく縮みます。初期値は 1 なので、何も書かなければ子要素は親に収まるように縮みます。flex-shrink: 0 と書くと圧縮率が 0 になり、flex-basis や width で設定した子要素の幅がそのまま確保されます。そのぶん、親要素からはみ出します。
例2:flex-shrink: 0 で縮まないようにする
幅 300px の親に、width: 150px の子を3つ並べます。上は初期値(1)で縮んで収まり、下は flex-shrink: 0 で縮まずはみ出します。
コードと表示の対応
.item { width: 150px; }3つで 450px あり、親の 300px からはみ出す幅です。(上の段)flex-shrink: 1(初期値)3つとも同じ割合で縮み、親の点線の中に収まります。.no-shrink { flex-shrink: 0; }下の段は縮まないので、150px ずつのまま親からはみ出します。
まとめて書くなら flex
flex: 0 0 200px;は「伸びない・縮まない・基本の幅 200px」という意味です。- 順番は
flex-grow→flex-shrink→flex-basisです。