フレックスアイテムを操る魔法の杖 (CSSプロパティたち)
これらの呪文は、フレックスコンテナの直接の子要素であるフレックスアイテムに指定するんだよ。
1. order
– 整列番号、はいっ!表示順序の魔法
アイテムたちがHTMLに書かれた順番通りに並ぶのが普通だけど、このorder
プロパティを使えば、見た目の表示順序を自由自在に変えることができるんだ!
デフォルト値は0
で、数値が小さいほど前に表示される。マイナスの値も使えるよ。
.item-A { order: 1; }
.item-B { order: 2; }
.item-C { order: -1; } /* item-Cが一番前に表示される! */
デモ:order
で表示順を変えてみよう!
各アイテムのorder
の値を下の入力欄で変えてみてね。DOM(HTML)の順番と見た目の順番が変わるのが分かるかな?
注意点! order
で見た目の順序を変えても、HTMLの構造上の順序(DOMの順序)は変わらないんだ。だから、キーボード操作(Tabキーでの移動など)やスクリーンリーダーの読み上げ順序はHTMLの順序のままになる。視覚的な順序と論理的な順序が大きく異なると、混乱を招くことがあるから、使いどころには注意しようね。
2. flex-grow
– のびのび育て!スペース争奪戦 (アイテムの伸長係数)
フレックスコンテナの中に余白があるとき、アイテムたちがその余白をどれくらいの割合で分け合って伸びるかを決めるのが、このflex-grow
プロパティだよ。
デフォルト値は0
で、これは「伸びない」という意味。1
以上の正の数を指定すると、その数値の比率に応じて余剰スペースを獲得して大きくなるんだ。
.item-1 { flex-grow: 1; } /* 余白の1/3をゲット */
.item-2 { flex-grow: 2; } /* 余白の2/3をゲット */
.item-3 { flex-grow: 0; } /* 伸びない */
デモ:flex-grow
でアイテムを伸ばしてみよう!
コンテナの幅は500px。アイテムの基本幅は各100px。残り200pxの余白をどう分けるかな?
grow:1Item A
grow:1Item B
grow:0Item C
3. flex-shrink
– ぎゅーっと縮んで!スペース譲り合い (アイテムの収縮係数)
今度は逆。アイテムの合計サイズがコンテナのサイズを超えてしまって、スペースが足りないときに、どのアイテムがどれくらいの割合で縮むかを決めるのがflex-shrink
だよ。
デフォルト値は1
で、これは「縮む」という意味。0
を指定すると、そのアイテムは縮まなくなるんだ(はみ出すかもしれないけどね!)。
.item-1 { width: 200px; flex-shrink: 1; } /* 他のアイテムと同じ割合で縮む */
.item-2 { width: 200px; flex-shrink: 0; } /* 縮まない! */
.item-3 { width: 200px; flex-shrink: 2; } /* 他のアイテムより2倍縮みやすい */
デモ:flex-shrink
でアイテムの縮み方をコントロール!
コンテナの幅は300px。アイテムの合計幅は450px。150px分縮まないといけないね!
shrink:1Item A
shrink:1Item B
shrink:0Item C
4. flex-basis
– これが私の基本サイズ! (アイテムの初期サイズ)
flex-basis
は、アイテムがflex-grow
やflex-shrink
によって伸び縮みする「前」の、理想的な「基本の大きさ」を指定するんだ。
主軸方向のサイズ(flex-direction
がrow
なら幅、column
なら高さ)を指定するよ。
auto
(初期値): アイテムのwidth
やheight
プロパティの値、もしくはコンテンツ自身のサイズが使われる。
- 具体的な長さ (例:
100px
, 10em
, 30%
): その長さを基本サイズとする。
content
: (比較的新しいキーワード) アイテムのコンテンツに基づいて自動的にサイズが決まる。
もしwidth
(またはheight
) とflex-basis
の両方が指定されたら、基本的にはflex-basis
の方が優先されることが多いんだ。
デモ:flex-basis
で基本サイズを指定!
flex-grow
とflex-shrink
がどう働くかは、このflex-basis
で決まったサイズが基準になるんだ。
basis:100px, grow:1A
basis:150px, grow:1B
basis:auto, width:80px, grow:0C
5. flex
– 三位一体!究極変身! (flex-grow
, flex-shrink
, flex-basis
の一括指定)
これまで学んだflex-grow
、flex-shrink
、flex-basis
の3つのプロパティを、たった一つでまとめて指定できる超便利なショートハンドが、このflex
プロパティだ!
値の書き方はいろいろあるけど、よく使うのはこんな感じ。
flex: [flex-growの値] [flex-shrinkの値] [flex-basisの値];
(3つの値を指定)
例: flex: 1 1 100px;
flex: [flex-growの値] [flex-shrinkの値];
(2つの値を指定。flex-basis
は0%
になる)
例: flex: 1 1;
(これはflex: 1 1 0%;
と同じ)
flex: [flex-growの値] [flex-basisの値];
(2つの値を指定。flex-shrink
は1
になる)
例: flex: 1 100px;
(これはflex: 1 1 100px;
と同じ)
flex: [flex-growの値];
(1つの値を指定。flex-shrink
は1
、flex-basis
は0%
になる)
例: flex: 1;
(これはflex: 1 1 0%;
と同じ。アイテムが余剰スペースを均等に分け合うのによく使う!)
他にもキーワード値があるよ。
flex: initial;
(0 1 auto
と同じ。アイテムは必要なら縮むけど、伸びない。)
flex: auto;
(1 1 auto
と同じ。アイテムは必要なら伸び縮みする。サイズはコンテンツやwidth/heightに基づく。)
flex: none;
(0 0 auto
と同じ。アイテムは伸び縮みしない。固定サイズにしたいときに便利。)
デモ:flex
ショートハンドの魔法!
flex: 1;
を指定したアイテムは、コンテナの余りスペースを等しく分け合うよ!
flex:1Item A
flex:2Item B
flex:none; width:100pxItem C
6. align-self
– 私だけはこうしたいの! (アイテム個別の交差軸方向の揃え)
親のフレックスコンテナに設定したalign-items
(交差軸の揃え方)の指示を、「私だけは違う揃え方がいいな!」と上書きできるのが、このalign-self
プロパティだ。
指定できる値はalign-items
と同じだよ (auto
, stretch
, flex-start
, flex-end
, center
, baseline
)。
auto
(初期値): 親のalign-items
の値に従う。
.container {
display: flex;
align-items: flex-start; /* 全てのアイテムは基本的に上端揃え */
height: 150px;
}
.special-item {
align-self: center; /* でも、このアイテムだけは中央揃え! */
}
デモ:align-self
で特定のアイテムだけ違う動き!
コンテナはalign-items: flex-start
(上揃え) になっているよ。真ん中のアイテムのalign-self
を変えてみよう!
Item A
Item B (align-self: auto)
Item C