ウェブページのレイアウト(layout)はCSSの重要な応用の一つです。

レイアウトの伝統的な解決策は、基づいていますボックスモデルに依存しdisplayプロパティ +positionプロパティ +floatプロパティ。これは特殊なレイアウトには非常に不便です。例えば、垂直中央揃えは実装が容易ではありません。

2009年、W3Cは新しい方案—-Flexレイアウトを提案しました。これは簡便で、完全で、レスポンシブにさまざまなページレイアウトを実現できます。現在、すべてのブラウザでサポートされており、これは今すぐ安全にこの機能を使用できることを意味します。

Flexレイアウトは将来のレイアウトの最有力候補となるでしょう。本記事ではFlexレイアウトの構文を紹介します。
以下の内容は主に次の2つの記事を参考にしています:A Complete Guide to FlexboxとA Visual Guide to CSS3 Flexbox Properties。
一、Flexレイアウトとは?
FlexはFlexible Boxの略で、「弾性レイアウト」を意味し、ボックスモデルに最大の柔軟性を提供します。
どのコンテナでもFlexレイアウトに指定できます。
.box{
display: flex;
}
インライン要素でもFlexレイアウトを使用できます。
.box{
display: inline-flex;
}
Webkitカーネルのブラウザでは、-webkitプレフィックスを付ける必要があります。
.box{
display: -webkit-flex; /* Safari */
display: flex;
}
注意:Flexレイアウトに設定すると、子要素のfloat、clear、vertical-alignプロパティは無効になります。
二、基本概念
Flexレイアウトを採用した要素はFlexコンテナ(flex container)と呼ばれ、略して「コンテナ」といいます。そのすべての子要素は自動的にコンテナのメンバーとなり、Flex項目(flex item)と呼ばれ、略して「項目」といいます。

コンテナにはデフォルトで2つの軸があります:水平の主軸(main axis)と垂直の交差軸(cross axis)です。主軸の開始位置(フレームとの交差点)はmain startと呼ばれ、終了位置はmain endと呼ばれます。交差軸の開始位置はcross startと呼ばれ、終了位置はcross endと呼ばれます。
項目はデフォルトで主軸に沿って配置されます。単一の項目が占める主軸のスペースはmain sizeと呼ばれ、占める交差軸のスペースはcross sizeと呼ばれます。
三、コンテナのプロパティ
以下の6つのプロパティはコンテナに設定します。
- flex-direction
- flex-wrap
- flex-flow
- justify-content
- align-items
- align-content
3.1 flex-directionプロパティ
flex-directionプロパティは主軸の方向(つまり項目の配置方向)を決定します。
.box {
flex-direction: row | row-reverse | column | column-reverse;
}

このプロパティには4つの値があります。
- row(デフォルト値):主軸は水平方向で、起点は左端です。
- row-reverse:主軸は水平方向で、起点は右端です。
- column:主軸は垂直方向で、起点は上端です。
- column-reverse:主軸は垂直方向で、起点は下端です。
3.2 flex-wrapプロパティ
デフォルトでは、項目は1本の線(「軸線」とも呼ばれます)上に配置されます。flex-wrapプロパティは、1つの軸線に収まらない場合の折り返し方法を定義します。

.box{
flex-wrap: nowrap | wrap | wrap-reverse;
}
このプロパティには3つの値を指定できます。
(1)nowrap(デフォルト):折り返しません。

(2)wrap:折り返し、最初の行は上にあります。

(3)wrap-reverse:折り返し、最初の行は下にあります。

3.3 flex-flow
flex-flowプロパティはflex-directionプロパティとflex-wrapプロパティの省略形で、デフォルト値はrow nowrapです。
.box {
flex-flow: <flex-direction> <flex-wrap>;
}
3.4 justify-contentプロパティ
justify-contentプロパティは、主軸上での項目の配置方法を定義します。
.box {
justify-content: flex-start | flex-end | center | space-between | space-around;
}

このプロパティには5つの値を指定できます。具体的な配置方法は軸の方向に関係します。以下では主軸が左から右であると仮定します。
- flex-start(デフォルト値):左揃え
- flex-end:右揃え
- center:中央揃え
- space-between:両端揃え、項目間の間隔はすべて等しくなります。
- space-around:各項目の両側の間隔が等しくなります。そのため、項目間の間隔は項目とフレームの間隔の2倍になります。
3.5 align-itemsプロパティ
align-itemsプロパティは、交差軸上で項目がどのように配置されるかを定義します。
.box {
align-items: flex-start | flex-end | center | baseline | stretch;
}

このプロパティには5つの値を指定できます。具体的な配置方法は交差軸の方向に関係します。以下では交差軸が上から下であると仮定します。
- flex-start:交差軸の起点に揃えます。
- flex-end:交差軸の終点に揃えます。
- center:交差軸の中点に揃えます。
- baseline:項目の最初の行の文字のベースラインに揃えます。
- stretch(デフォルト値):項目の高さが設定されていない場合やautoに設定されている場合、コンテナ全体の高さを占めます。
3.6 align-contentプロパティ
align-contentプロパティは、複数の軸線の配置方法を定義します。項目に軸線が1本しかない場合、このプロパティは機能しません。
.box {
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}

このプロパティには6つの値を指定できます。
- flex-start:交差軸の起点に揃えます。
- flex-end:交差軸の終点に揃えます。
- center:交差軸の中点に揃えます。
- space-between:交差軸の両端に揃え、軸線間の間隔は均等に分布します。
- space-around:各軸線の両側の間隔が等しくなります。そのため、軸線間の間隔は軸線とフレームの間隔の2倍になります。
- stretch(デフォルト値):軸線が交差軸全体を占めます。
四、アイテムのプロパティ
以下の6つのプロパティは項目に設定します。
- order
- flex-grow
- flex-shrink
- flex-basis
- flex
- align-self
4.1 orderプロパティ
orderプロパティは項目の並び順を定義します。数値が小さいほど前に配置され、デフォルトは0です。
.item {
order: <integer>;
}

4.2 flex-growプロパティ
flex-growプロパティは項目の拡大比率を定義します。デフォルトは0で、つまり余白が存在しても拡大されません。
.item {
flex-grow: <number>; /* default 0 */
}

すべての項目のflex-growプロパティが1の場合、それらは余白(もしあれば)を均等に分割します。ある項目のflex-growプロパティが2で、他の項目がすべて1の場合、前者が占める余白は他の項目の2倍になります。
4.3 flex-shrinkプロパティ
flex-shrinkプロパティは項目の縮小比率を定義します。デフォルトは1で、つまりスペースが不足すると、その項目は縮小されます。
.item {
flex-shrink: <number>; /* default 1 */
}

すべての項目のflex-shrinkプロパティが1の場合、スペースが不足すると、すべて等しい比率で縮小します。ある項目のflex-shrinkプロパティが0で、他の項目がすべて1の場合、スペースが不足しても前者は縮小しません。
負の値はこのプロパティには無効です。
4.4 flex-basisプロパティ
flex-basisプロパティは、余分なスペースを分配する前に項目が占める主軸スペース(main size)を定義します。ブラウザはこのプロパティに基づいて、主軸に余分なスペースがあるかどうかを計算します。デフォルト値はautoで、つまり項目の本来のサイズです。
.item {
flex-basis: <length> | auto; /* default auto */
}
これはwidthプロパティやheightプロパティと同じ値(例:350px)に設定でき、その場合項目は固定スペースを占めます。
4.5 flexプロパティ
flexプロパティはflex-grow、flex-shrink、flex-basisの省略形で、デフォルト値は0 1 autoです。後の2つのプロパティは省略可能です。
.item {
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
このプロパティには2つのショートカット値があります:auto (1 1 auto) と none (0 0 auto) です。
3つの分離したプロパティを個別に書くのではなく、このプロパティを優先して使用することをお勧めします。ブラウザが関連する値を推定するためです。
4.6 align-selfプロパティ
align-selfプロパティは、単一の項目が他の項目とは異なる配置方法を持つことを許可し、align-itemsプロパティを上書きできます。デフォルト値はautoで、親要素のalign-itemsプロパティを継承することを意味し、親要素がない場合はstretchと同じになります。
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}

このプロパティには6つの値を指定できます。auto以外はすべてalign-itemsプロパティと完全に一致します。
出典:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html