Post on:2023年1月16日
sponsorsr
CSS Flexboxとは水平または垂直に要素を配置し、柔軟なレイアウトを実現できるCSSのレイアウトモジュールです。複雑なレイアウトでも今までより少ないコードで、よりシンプルなプロセスで実装することができます。
CSS Flexboxの基礎知識、Flexboxの各プロパティがどのように機能するのか、Flexboxでどのようにレイアウトを実装するかを視覚的に解説します。
Webページやスマホアプリに使用される定番レイアウトをCSS Flexboxで実装したシンプルなコードは、下記をご覧ください。
【アップデート: 2022年6月16日】
IEがサポート終了したことにあわせて、修正しました。
【アップデート: 2021年8月1日】
Flexboxの解説を2021年の現状にあわせて、修正しました。
【アップデート: 2020年8月23日】
Flexboxの解説を2020年の現状にあわせて、修正しました。
【アップデート: 2019年3月27日】
Flexboxの解説を2019年の現状にあわせて、修正しました。
【アップデート: 2018年3月27日】
主要なブラウザすべてにサポートされたため、記述をそれに合わせました。
【アップデート: 2018年7月10日】
4つ前のバージョンまで対応したプレフィックスも記しました。
CSS flexboxの各プロパティを見る前に、flexboxとはどんなものか説明します。flexboxを使ったレイアウトとは、flexアイテムと呼ばれる複数の子要素を内包するflexコンテナの親要素で構成されています。
flexboxを使ったレイアウトの概要図
上の図はflexレイアウトの概要と各プロパティで、さらに多くの情報はW3Cのflexbox modelを参考にしてください。
CSS flexboxは2009年の最初のドラフトから何度も変化しましたが、ここでは機能している最新のドラフト(CSS Flexible Box Layout Module Level 1: 2018年11月)をベースにします。
2022年6月16日にIEのサポートが終了しました。プレフィックスが必要なのはIE10をサポートする場合のみなので、プレフィックスは実質不要です。
詳しいサポート状況は、下記ページをご覧ください。
flex-basis
プロパティはMSFTのドキュメントを参照してください。min-height
を使用する場合、アイテムを垂直方向に正しく配置しません。Microsoft Docsを参照してください。display: flex;
およびflex-direction: column;
を持つコンテナは、コンテナにmin-height
があり、明示的なheight
プロパティがない場合はflexの子のサイズを適切に計算しません。Microsoft Connectを参照してください。flex
のデフォルト値は最新の仕様で定義されている0 0 auto
ではなく、0 1 auto
です。CSS flexboxを使うのは簡単です。
HTMLの親要素にdisplay: flex;
を指定するだけです。
1 2 3 | .flex-container{ display:flex; } |
プレフィックス版も記しておきます。
※IE10(-ms-
)をサポートする時のみ必要です。2023年現在、実質不要なので、これより下記はプレフィックス版は記載しません。
1 2 3 4 5 | .flex-container{ display:-webkit-box; display:-ms-flexbox; display:flex; } |
もしくは、インライン要素に使うのであればinline-flex
を指定します。
1 2 3 | .flex-container{ display:inline-flex; } |
display: flex;
もしくはdisplay: inline-flex;
は親要素に加える必要がある唯一のプロパティです。その子要素は自動的にflexアイテムになります。
CSS flexboxのプロパティを分類する方法はいくつかあります。ここでは最も簡単な方法として、一つはflexコンテナ、一つはflexアイテム、と二つのグループに分けてその使い方を説明します。
flexコンテナとflexアイテム
flexコンテナとは、flexアイテムを含む親要素です。まずは、flexコンテナの使い方から解説します。
flex-direction
プロパティは、flexコンテナの主軸の方向を設定することにより、flexアイテムがflexコンテナでどのように配置されるか明示します。方向は2種類で、横列の水平、縦列の垂直に配置できます。
flex-direction
プロパティで利用できる値flex-direction: row;
(デフォルト値)flex-direction: row-reverse;
flex-direction: column;
flex-direction: column-reverse;
1 2 3 | .flex-container{ flex-direction:row; } |
flexアイテムは左から右へ(ltr)水平方向に配置されます。
flex-direction: row;
を定義した場合
1 2 3 | .flex-container{ flex-direction:row-reverse; } |
flexアイテムは右から左へ(rtl)水平方向に配置されます。
flex-direction: row-reverse;
を定義した場合
1 2 3 | .flex-container{ flex-direction:column; } |
flexアイテムは上から下へ垂直方向に配置されます。
flex-direction: column;
を定義した場合
1 2 3 | .flex-container{ flex-direction:column-reverse; } |
flexアイテムは下から上へ垂直方向に配置されます。
flex-direction: column-reverse;
を定義した場合
flex-direction
のデフォルト値: rowrow
とrow-reverse
はライティングモードに依存するので、rtlの環境だとそれぞれ逆に配置されます。
flexboxの初期のコンセプトは、1行に複数のアイテムをコンテナにセットすることです。そこから進化し、flex-wrap
プロパティは、flexコンテナが複数のアイテムを一行、または複数行に配置することをコントロールします。
flex-wrap
プロパティで利用できる値flex-wrap: nowrap;
(デフォルト値)flex-wrap: wrap;
flex-wrap: wrap-reverse;
1 2 3 | .flex-container{ flex-wrap:nowrap; } |
flexアイテムは横一行に配置されます。各アイテムの幅はflexコンテナの幅に収まるように縮小されます。
flex-wrap: nowrap;
を定義した場合
1 2 3 | .flex-container{ flex-wrap:wrap; } |
flexアイテムは横複数行に配置されます。必要があれば、左から右へ、上から下へ、の順番に配置されます。
flex-wrap: wrap;
を定義した場合
1 2 3 | .flex-container{ flex-wrap:wrap-reverse; } |
flexアイテムは横複数行に配置されます。必要があれば、左から右へ、下から上へ、の順番に配置されます。
flex-wrap: wrap-reverse;
を定義した場合
flex-wrap
のデフォルト値: nowrapこれらのプロパティはライティングモードに依存するので、rtlの環境だとそれぞれ逆に配置されます。
flex-flow
プロパティは、flex-direction
とflex-wrap
を設定するショートハンドです。
flex-flow
プロパティで利用できる値flex-flow: row nowrap;
(デフォルト値)flex-direction
のrow
とflex-wrap
のnowrap
を一緒に定義。1 2 3 | .flex-container{ flex-flow:<flex-direction>||<flex-wrap>; } |
flex-flow
のデフォルト値:row nowrap
justify-content
プロパティは、flexコンテナの主軸に沿ってflexアイテムを一行に配置します。
justify-content
プロパティで利用できる値justify-content: flex-start;
(デフォルト値)justify-content: flex-end;
justify-content: center;
justify-content: space-between;
justify-content: space-around;
justify-content: space-evenly;
justify-content: stretch;
1 2 3 | .flex-container{ justify-content:flex-start; } |
flexアイテムはモードに従い、flexコンテナの左側に配置されます。
justify-content: flex-start;
を定義した場合
1 2 3 | .flex-container{ justify-content:flex-end; } |
flexアイテムはモードに従い、flexコンテナの右側に配置されます。
justify-content: flex-end;
を定義した場合
1 2 3 | .flex-container{ justify-content:center; } |
flexアイテムはflexコンテナの中央に配置されます。
justify-content: center;
を定義した場合
1 2 3 | .flex-container{ justify-content:space-between; } |
flexアイテムは最初と最後のアイテムは端に、残りは等間隔で配置されます。
justify-content: space-between;
を定義した場合
1 2 3 | .flex-container{ justify-content:space-around; } |
flexアイテムは全てのアイテムは等間隔に配置されます。
justify-content: space-around;
を定義した場合
justify-content
のデフォルト値:flex-start
flexアイテムはflexコンテナのクロス軸に垂直方向で配置することができます。align-items
プロパティは、デフォルトで全てのflexアイテムを含めます。
※flexアイテム: align-selfが定義してあれば、align-items
は上書きされます。
align-items
プロパティで利用できる値align-items: stretch;
(デフォルト値)align-items: flex-start;
align-items: flex-end;
align-items: center;
align-items: baseline;
1 2 3 | .flex-container{ align-items:stretch; } |
flexアイテムはflexコンテナの高さ(または幅)いっぱいに配置されます。
align-items: stretch;
を定義した場合
1 2 3 | .flex-container{ align-items:flex-start; } |
flexアイテムはflexコンテナのクロス軸の始点に配置されます。
align-items: flex-start;
を定義した場合
1 2 3 | .flex-container{ align-items:flex-end; } |
flexアイテムはflexコンテナのクロス軸の終点に配置されます。
align-items: flex-end;
を定義した場合
1 2 3 | .flex-container{ align-items:center; } |
flexアイテムはflexコンテナのクロス軸の中央に配置されます。
align-items: center;
を定義した場合
1 2 3 | .flex-container{ align-items:baseline; } |
flexアイテムはベースラインに沿って配置されます。
align-items: beseline;
を定義した場合
align-items
のデフォルト値:stretch
ベースラインがどのように計算されるかは、W3Cのflex-baselinesを参考にしてください。
align-content
プロパティはjustify-content
と似ていますが、align-content
プロパティはクロス軸の垂直方向に揃えて配置します。
align-content
プロパティで利用できる値align-content: stretch;
(デフォルト値)align-content: flex-start;
align-content: flex-end;
align-content: center;
align-content: space-between;
align-content: space-around;
align-content: space-evenly;
1 2 3 | .flex-container{ align-content:stretch; } |
flexアイテムは均等に分配されたスペースが全てのflexアイテムのあとについて配置されます。
align-content: stretch;
を定義した場合
1 2 3 | .flex-container{ align-content:flex-start; } |
flexアイテムはflexコンテナのクロス軸の始点に向かって積み重なります。
align-content: flex-start;
を定義した場合
1 2 3 | .flex-container{ align-content:flex-end; } |
flexアイテムはflexコンテナのクロス軸の終点に向かって積み重なります。
align-content: flex-end;
を定義した場合
1 2 3 | .flex-container{ align-content:center; } |
flexアイテムの行はflexコンテナのクロス軸の中心に積み重なります。
align-content: center;
を定義した場合
1 2 3 | .flex-container{ align-content:space-between; } |
flexアイテムの行はflexコンテナの始点から終点に等間隔で表示されます。
align-content: space-between;
を定義した場合
1 2 3 | .flex-container{ align-content:space-around; } |
flexアイテムはflexアイテムの全ての行の周りに等間隔で表示されます。
align-content: space-around;
を定義した場合
align-content
のデフォルト値:stretch
このプロパティはflexコンテナが複数行のflexアイテムをもっている時だけ効果があります。もしflexアイテムが一行だった場合は、レイアウトに影響を与えません。
column-*
プロパティはflexコンテナに影響を与えません。::first-line
,::first-letter
などの疑似要素はflexコンテナに適用されません。flexコンテナの子要素が、flexアイテムです。
flexコンテナとflexアイテム
flexアイテムの使い方を解説します。
order
プロパティは、flexコンテナ内に配置されるflexコンテナの子の順番をコントロールします。
order
プロパティで利用できる値order: 0;
(デフォルト値)order: <整数値>
1 2 3 | .flex-item{ order:<integer>; } |
flexアイテムはHTMLの並び順を変えずに、このシンプルなプロパティで変更できます。
order
プロパティを定義した場合
order
のデフォルト値:0
flex-grow
プロパティは、フリーのポジティブなスペースがある場合にflexアイテムが他のflexアイテムと比較してどのくらいの大きさになるかを指定します。
flex-grow
プロパティで利用できる値flex-grow: 0;
(デフォルト値)flex-grow: <数値>
1 2 3 | .flex-item{ flex-grow:<number>; } |
flex-grow
の値を同じに指定すると、全てのflexアイテムは同じサイズになります。
flex-grow: 1;
を定義した場合
2番目のflexアイテムだけ値を変えると、他のアイテムに比べて多くのスペースを取ります。
2番目にflex-grow: 3;
を定義した場合
flex-grow
のデフォルト値:0
マイナスの値は無効です。
flex-shrink
プロパティは、フリーのネガティブなスペースにflexコンテナ内のflexアイテムが残りのアイテムと比較してどのくらい縮まるかを指定します。
flex-shrink
プロパティで利用できる値flex-shrink: 1;
(デフォルト値)flex-shrink: <数値>
1 2 3 | .flex-item{ flex-shrink:<number>; } |
デフォルトで全てのflexアイテムは縮小することができます。しかし0
に指定した場合は、オリジナルのサイズを維持します。
2番目にflex-shrink: 0;
を定義した場合
flex-shrink
のデフォルト値:1
マイナスの値は無効です。
flex-basis
プロパティは、flexアイテムの最初のメインとなるサイズを元に、幅と高さのプロパティを同じ値にします。
flex-basis
プロパティで利用できる値flex-basis: auto;
(デフォルト値)flex-basis: <width>
px
,em
など)、キーワード(max-content
,min-content
,fit-content
)を指定。1 2 3 | .flex-item{ flex-basis:auto|<width>; } |
4番目のflexアイテムのflex-basis
を350px
に指定し、残りは最初の大きさに従います。
4番目にflex-basis: 350px;
を定義した場合
flex-basis
のデフォルト値:auto
auto
の値はネーミングの問題がありますが、将来解決される予定です。
flex
プロパティは、flex-grow
,flex-shrink
,flex-basis
のショートハンドです。auto 1 1 auto
,0 0 auto
といった指定ができます。
flex
プロパティで利用できる値flex: 0 1 auto;
(デフォルト値)flex-grow
,flex-shrink
,flex-basis
を一緒に定義。1 2 3 | .flex-item{ flex:none|auto|[<flex-grow><flex-shrink>?||<flex-basis>]; } |
flex
のデフォルト値:0 1 auto
W3Cはこのflex
を使ったショートハンドの記述を別個で使うより奨励しています。参考:flex-common
align-self
プロパティは前述の「align-items」での指定を上書きし、flexアイテムの整列を優先します。
align-self
プロパティで利用できる値align-self: auto;
(デフォルト値)align-self: キーワードを指定;
1 2 3 | .flex-item{ align-self:auto|flex-start|flex-end|center|baseline|stretch; } |
3番目と4番目のflexアイテムはalign-self
プロパティを使い配置しています。
align-self
プロパティを定義した場合
align-self
のデフォルト値:auto
align-self
のauto
の値は、その要素の親のalign-items
の値を元に計算します。
float
やclear
やvertical-align
はflexアイテムに影響を与えません。sponsors