お品書き
書き直し中…
とりあえず、中へどうぞ
↓↓↓
スポンサーリンク

Flexboxに挑戦 3 (grow/shrink/basisとは)

WEBデザイン
フレックスボックスの、子アイテムのスタイルでは、ショートハンドとして、このような書き方が推奨されているとか。
flex:<因数1> <因数2> <因数3>;
これは何を意味しているかというと

因数1 ⇒ flex-grow:<数値>;
因数2 ⇒ flex-shrink:<数値>;
因数3 ⇒ flex-basis:<数値>;

の指定と同じ意味だそうです。

そして、この3つは常に同時に指定してやるべきなので、ショートハンドで一緒に記述しろということのようですね。

で、この三種類のスタイルは何を指定しているかと言うと

flex-grow ⇒ 子アイテムと親アイテムの間に余白がある場合に子アイテムの余白が広がる割合※

flex-shrink ⇒ 子アイテムが親要素より大きい時に、子アイテムの幅から減らされる「マイナスの余白分」の配分比率

flex-basis ⇒ 子アイテムの基本的な幅を設定する

※ポイントは、あくまで「余白」の分配比率であって、アイテムの幅の分配比率ではないということ。

growとshrinkの値は、例えば子アイテムにすべて同じ数値が(通常は1ですが)設定されていれば、余白をアイテムの数で割った数値が均等に各アイテムから減らされていくというわけですね。(0を指定すると拡大縮小されない)

では basis はなんだ???と思ったら、「width」のflex版、という感じみたいですね。

widthだと絶対値(固定値)になってしまいますが、flex-basisだと、インテリジェントに幅を調整してくれる、ということのようです。

実験1(grow)

まず、幅400pxの領域を作ってみる。(赤色)

400
次に、それをflexにして、中に 20px, 40px, 60px, 80px の子アイテムを作る。
(flex-grow:0;)
20
40
60
80
子アイテムの合計幅は200px、残った領域も200pxとなる。

次に、この子アイテムの、flex-grow をすべて「1」にしてみる。
20+50
40+50
60+50
80+50
すべてのflex-growが1なので、余白の200pxを均等に分け合うように配分される。

今度は、flex-grow をアイテム別に上から 1, 2, 3, 4 にする。
20+20
40+40
60+60
80+80
余白の200pxを「1:2:3:4」の比率で分配するように拡張される。
まとめて並べてみると・・・
400
20
40
60
80
20+50
40+50
60+50
80+50
20+20
40+40
60+60
80+80

実験2(shrink)

今度は、親領域を子領域の合計より狭くなるように設定してみます

440
その中に「flex-shrink:0;」で 50px, 100px, 150px, 200px の子アイテムを作る。
50
100
150
200
flex-shrinkが0なので子アイテムは縮小されず、親要素の幅を無視して子アイテムが指定幅で配置される。

今度はすべての子要素を「flex-shrink:1;」にすると
50-15
100-15
150-15
200-15
親要素と子要素の幅の差(マイナスの余白)60pxが均等に引かれる。

次に、子要素の shrink を「1:2:3:4」にすると
50-6
100-12
150-18
200-24
子要素の shrink を「4:3:2:1」にすると
50-24
100-18
150-12
200-6
まとめて並べてみる
440
50
100
150
200
50-15
100-15
150-15
200-15
50-6
100-12
150-18
200-24
50-24
100-18
150-12
200-6

以下は、幅を「width」で「10%:20%:30%:40%」の比率に指定して作った事例ですが
11
222
33333
44444444444444444444444444444444444444444444444
じつはこれ、margin がゼロでないため、幅を単純に「10%:20%:30%:40%」で指定すると子要素が親要素の幅を超えてはみ出してしまうため、margin の分を計算して差し引いて「9.2%, 18.4%, 27.6%, 36.8%」に指定してあります。

これを、widthではなくflex-basisで指定してやると、マージンの分を計算しなくてもはみ出さないように自動で調整してくれるというわけですね。
11
222
333333333333333333333333333333
444444444444444444444444444444444444

※これは、アイテムのスタイルを下記のように設定しています

.item1{flex:0 0 10%;} .item2{flex:0 0 20%;} .item3{flex:0 0 30%;} .item4{flex:1 1 40%;}
ポイントは、子アイテムの4番め以外はgrow・shrinkが「0」になっていること。

grow・shrinkが「0」になっていれば、そこはwidthで指定(固定値)したのと同じ意味になりますので、最終的に4番目の幅だけが調整されることになります。

複数のアイテムのgrow・shrinkをゼロ以外にした場合、どのように拡大縮小されるのかは、よく分かりませんが、子アイテム内の大きさ(量)によって比率が決めらるという感じですかね?
11
222
333333333333333333333333333333
444444444444444
.item1{flex:1 1 auto;} .item2{flex:1 1 auto;} .item3{flex:1 1 auto;} .item4{flex:1 1 auto;}

コメント