flex-grow
- 子要素全ての幅を足しても親要素の幅100%にならない時、その余白を各子要素間でどの程度負担するかを表す。
- デフォルト0。余白があってもほったらかし。負担しない = 伸びない
前提
- 子1にwidth 30%
- 子2にwidth 30%
- => 余白は40%。
子要素間の合計が1以上のケース
- 子1にflexGrow1, 子2にflexGrow3を設定すると、余白を1:3 で負担することになるので子1が10%, 子2が30%広がる
- 他の全ての子が0(デフォルト)で、子2だけに1以上が設定された時、余白の全てを子2が負担する事になるので、子2が40%広がり合計70%を占める。
子要素間の合計が1未満のケース
- 余白は40%なので、flexGrow0.5を設定すると、余白を1とした割合である20%伸びる。
- 子1がflexGrow0.1, 子2がflexGrow0.1だと、それぞれ4%増える。合計それぞれ34%になり余白はまだある状態。
- もし、子1と子2にflexGrow0.8設定し合計が1を超える場合、子要素間の合計が1以上の時と同じ挙動になる
flex-shrink
- 子要素全ての幅を足すと親要素を越える時、その越えた分を各子要素間でどの程度負担する = 縮む かを表す
- デフォルト1。子要素全てが1なので、超えた分を子要素間で均等に負担する。
- 例えば子1はwidth 80%,子2はwidth80%の時、Flex無しだと合計160%になり60%はみ出してしまうが、親要素にFlexを適用した途端、はみ出した60%を子要素がそれぞれ30%負担し、widthは80%-30%で50%になる
- 固定widthが設定されていない要素を含む親要素に対してFlexを設定すると想定外に縮むことがありハマることがある。Flexの子要素全てのwidthは固定されていることを確認するべき!!!
-
<div>{ comment }</div>
みたいな子要素があると、子要素が伸びて親要素を超えた分を子要素間で均等に負担し縮んでしまう。縮んでほしくないときも縮んでしまうことがある。 -
flex-shrink: 0
は超えても負担しない = 「縮まない」ということ。他の縮むことができる子要素間で超えた分を負担して縮む。もし全部の子要素がflex-shrink0だとどれも縮まず超えた分は超えたままになる。 - 子要素間のflex-shrinkの合計が1以上の場合は、それらの比率によって負担割合が決まる。
- 子要素間のflex-shrinkの合計が1以下の場合は、超えた分を1とした時の割合分縮む。
flex-basis
- これまで、「本来の子要素の幅」を基準に考えてきたが、それをflexのプロパティとして設定できこれを基準にflexの計算がされる。本来のwidthを上書くイメージ。ただflexのdirectionが縦になるとwidthではなくなることがwidthとは違う。
- デフォルトはauto。本来の子要素の幅がそのままflexの計算をする基準値になる
- 子1と2にflex-basis: 40%を設定すると、合わせて80%のため残り20%は余白になる
- 子1にwidthを80%, 子2にwidth 200%と設定後、それぞれflex-basis: 50%とすると結果のwidthは50%になり上書きされるイメージ
- pxの絶対値でも設定可能。
flex
- grow, shrink, basisを一度に設定できるプロパティ。
flex: <grow> <shrink> <basis>
-
flex: 0 1 20%
と書く
参考
https://fuuno.net/web02/flex/flex.html
https://fuuno.net/web02/flex02/flex02.html
https://developer.mozilla.org/ja/docs/Web/CSS/flex