Flexible boxes または flexbox は、CSS3 における新しいレイアウトモードです。
ページ・レイアウトを異なる画面サイズと異なる表示デバイスに適応しなければならないときに、 フレックスボックスを使用すると、要素が予想どおりに動作することが保証されます。
多くのアプリケーションに対し、フレキシブル・ボックス・モデルは、フロートを使わず、またコンテンツのマージンとフレックス・コンテナのマージンを 折畳まないことで、ブロックモデルを超える改善を提供します。
表中の数字は、完全に機能をサポートした最初のブラウザのバージョンです。
数字の後に続く -webkit- または -moz- は、接頭辞付きで動作した最初のバージョンです。
| プロパティ | |||||
|---|---|---|---|---|---|
| Basic support (single-line flexbox) |
29.0 21.0 -webkit- |
11.0 | 22.0 18.0 -moz- |
6.1 -webkit- | 12.1 -webkit- |
| Multi-line flexbox | 29.0 21.0 -webkit- |
11.0 | 28.0 | 6.1 -webkit- | 17.0 15.0 -webkit- 12.1 |
フレキシブルボックスは、フレックス・コンテナとフレックス項目から構成されます。
フレックス・コンテナは、display プロパティに flex(ブロックとして表示)または inline-flex
(インラインとして表示)を設定することで宣言されます。
フレックス・コンテナの内部には、一つ以上のフレックスの項目があります。
注: フレックス・コンテナの外側と、フレックス項目の内部のすべては、いつもの通りにレンダリングされます。 フレキシボックスは、フレックス項目をフレックス・コンテナ内にどのように配置するかを定義します。
フレックス項目は、フレックスラインに沿ってフレックスコンテナの内側に配置されます。 デフォルトでは、フレックスコンテナごとに 1 つだけのフレックスラインがあります。
次の例は、3 つのフレックス項目を表示します。これらはデフォルトで、横のフレックスラインに沿って、左から右へ配置されています:
<!DOCTYPE html>
<html>
<head>
<style>
.flex-container {
display: -webkit-flex;
display: flex;
width: 400px;
height: 250px;
background-color: lightgrey;
}
.flex-item {
background-color: cornflowerblue;
width: 100px;
height: 100px;
margin: 10px;
}
</style>
</head>
<body>
<div class="flex-container">
<div class="flex-item">flex item 1</div>
<div
class="flex-item">flex item 2</div>
<div class="flex-item">flex
item 3</div>
</div>
</body>
</html>
フレックスラインの方向を変更することも可能です。
direction プロパティに rtl(右から左)を設定した場合、テキストは右から左に表示され、
また、フレックスラインもページレイアウトを変更する方向に変更されます:
body {
direction: rtl;
}
.flex-container {
display: -webkit-flex;
display: flex;
width:
400px;
height: 250px;
background-color:
lightgrey;
}
.flex-item
{
background-color: cornflowerblue;
width: 100px;
height: 100px;
margin: 10px;
}
flex-direction プロパティは、フレックス・コンテナ内のフレキシブル項目の方向を指定します。
flex-direction のデフォルト値は、row (左から右、上から下) です。
その他の値は次の通りです:
row-reverse - 書き込みモード(direction)が左から右の場合は、フレックス項目は右から左に配置されますcolumn - writing システムが horizontal の場合、フレックス項目は vertically に配置されますcolumn-reverse - column と同じだが、その逆に配置されます次の例は、row-reverse 値を使用した結果を示しています:
.flex-container {
display: -webkit-flex;
display: flex;
-webkit-flex-direction: row-reverse;
flex-direction:
row-reverse;
width:
400px;
height: 250px;
background-color:
lightgrey;
}
次の例は、column 値を使用した結果を示しています:
.flex-container {
display: -webkit-flex;
display: flex;
-webkit-flex-direction: column;
flex-direction:
column;
width:
400px;
height: 250px;
background-color:
lightgrey;
}
次の例は、column-reverse 値を使用した結果を示しています:
.flex-container {
display: -webkit-flex;
display: flex;
-webkit-flex-direction: column-reverse;
flex-direction:
column-reverse;
width:
400px;
height: 250px;
background-color:
lightgrey;
}
justify-content プロパティは、フレックスコンテナ内の主軸の方向に余白が生じる場合に、フレックス項目と余白を
どのように配置するかを指定します。
指定可能な値は次の通りです:
flex-start - デフォルト値。項目は、コンテナの始端側に配置されるflex-end - 項目は、コンテナの終端側に配置されるcenter - 項目は、コンテナの中央に配置されるspace-between - 項目は、行の余白を均等配分して配置されるspace-around - 項目は、余白を行の前後と中間に配分して配置される次の例は、値 flex-end を使用した結果を示しています:
.flex-container {
display: -webkit-flex;
display: flex;
-webkit-justify-content: flex-end;
justify-content:
flex-end;
width:
400px;
height: 250px;
background-color:
lightgrey;
}
次の例は、値 center を使用した結果を示しています:
.flex-container {
display: -webkit-flex;
display: flex;
-webkit-justify-content: center;
justify-content:
center;
width:
400px;
height: 250px;
background-color:
lightgrey;
}
次の例は、値 space-between を使用した結果を示しています:
.flex-container {
display: -webkit-flex;
display: flex;
-webkit-justify-content: space-between;
justify-content:
space-between;
width:
400px;
height: 250px;
background-color:
lightgrey;
}
次の例は、値 space-around を使用した結果を示しています:
.flex-container {
display: -webkit-flex;
display: flex;
-webkit-justify-content: space-around;
justify-content:
space-around;
width:
400px;
height: 250px;
background-color:
lightgrey;
}
align-items プロパティは、フレックスコンテナ内の交差軸の方向に余白が生じる場合に、フレックス項目と余白を
どのように配置するかを指定します。
指定可能な値は次の通りです:
stretch - デフォルト値。項目は、コンテナに収まるように拡張されるflex-start - 項目は、コンテナの上端側に配置されるflex-end - 項目は、コンテナの下端側に配置されるcenter - 項目は、コンテナの中央 (縦) に配置されるbaseline - 項目は、コンテナのベースラインに配置される次の例は、値 stretch を使用した結果を示しています (これがデフォルト値です):
.flex-container {
display: -webkit-flex;
display: flex;
-webkit-align-items: stretch;
align-items:
stretch;
width:
400px;
height: 250px;
background-color:
lightgrey;
}
次の例は、値 flex-start を使用した結果を示しています:
.flex-container {
display: -webkit-flex;
display: flex;
-webkit-align-items: flex-start;
align-items:
flex-start;
width:
400px;
height: 250px;
background-color:
lightgrey;
}
次の例は、値 flex-end を使用した結果を示しています:
.flex-container {
display: -webkit-flex;
display: flex;
-webkit-align-items: flex-end;
align-items:
flex-end;
width:
400px;
height: 250px;
background-color:
lightgrey;
}
次の例は、値 center を使用した結果を示しています:
.flex-container {
display: -webkit-flex;
display: flex;
-webkit-align-items: center;
align-items:
center;
width:
400px;
height: 250px;
background-color:
lightgrey;
}
次の例は、値 baseline を使用した結果を示しています:
.flex-container {
display: -webkit-flex;
display: flex;
-webkit-align-items: baseline;
align-items:
baseline;
width:
400px;
height: 250px;
background-color:
lightgrey;
}
flex-wrap プロパティは、フレックス項目がフレックスライン 1 行に収まらない場合、ラップすべきかどうかを指定します。
指定可能な値は次の通りです:
nowrap - デフォルト値。フレックス項目はラップしないwrap - 必要な場合、フレックス項目はラップするwrap-reverse - 必要な場合、フレックス項目はラップするが、逆向きになる次の例は、値 nowrap を使用した結果を示しています
(this is the default value):
.flex-container {
display: -webkit-flex;
display: flex;
-webkit-flex-wrap: nowrap;
flex-wrap: nowrap;
width:
300px;
height: 250px;
background-color:
lightgrey;
}
次の例は、値 wrap を使用した結果を示しています:
.flex-container {
display: -webkit-flex;
display: flex;
-webkit-flex-wrap: wrap;
flex-wrap: wrap;
width:
300px;
height: 250px;
background-color:
lightgrey;
}
次の例は、値 wrap-reverse を使用した結果を示しています:
.flex-container {
display: -webkit-flex;
display: flex;
-webkit-flex-wrap: wrap-reverse;
flex-wrap:
wrap-reverse;
width:
300px;
height: 250px;
background-color:
lightgrey;
}
align-content プロパティは、flex-wrap プロパティの動作を変更します。
align-items に似ていますが、フレックス項目を揃えるのではなく、フレックスラインを揃えます。
指定可能な値は次の通りです:
stretch - デフォルト値。行は、残りの余白が配分され、拡張されるflex-start - 行は、フレックスコンテナの始端側に寄せられるflex-end - 行は、フレックスコンテナの終端側に寄せられるcenter - 行は、フレックスコンテナの中央に寄せられるspace-between - 行は、フレックスコンテナに均等配分されるspace-around - 行は、フレックスコンテナに均等配分されるが、先頭と末尾は他の半分になる次の例は、値 center を使用した結果を示しています:
.flex-container {
display: -webkit-flex;
display: flex;
-webkit-flex-wrap: wrap;
flex-wrap:
wrap;
-webkit-align-content: center;
align-content:
center;
width:
300px;
height: 300px;
background-color:
lightgrey;
}
order プロパティは、同じコンテナ内の他のフレックス項目と比較した、フレックス項目の順序を指定します:
.flex-item {
background-color: cornflowerblue;
width: 100px;
height: 100px;
margin: 10px;
}
.first {
-webkit-order: -1;
order: -1;
}
margin: auto; を設定すると、余分なスペースを吸収します。
これは、異なる位置にフレックス項目をプッシュするために使用することができます。.
次の例では、最初のフレックスアイテムに margin-right: auto; を設定します。
これは、すべての余分なスペースは、その要素の右に吸収されるようになります:
.flex-item {
background-color: cornflowerblue;
width: 75px;
height: 75px;
margin: 10px;
}
.flex-item:first-child {
margin-right: auto;
}
次の例は、殆ど日常的な問題である:完璧なセンタリングを解決します。
フレキシボックスを使うと非常に簡単です。margin: auto; を設定すれば、完全に両軸の中央に項目が配置されるようになります:
.flex-item {
background-color: cornflowerblue;
width: 75px;
height: 75px;
margin: auto;
}
フレックス項目の align-self プロパティは、項目に対するフレックスコンテナの align-items プロパティをオーバーライドします。
これは、align-items プロパティと同じ値を指定することます。
次の例は、各フレックス項目にいろいろな align-self の値を設定しています:
.flex-item {
background-color: cornflowerblue;
width: 60px;
min-height: 100px;
margin: 10px;
}
.item1 {
-webkit-align-self: flex-start;
align-self:
flex-start;
}
.item2 {
-webkit-align-self: flex-end;
align-self: flex-end;
}
.item3 {
-webkit-align-self: center;
align-self: center;
}
.item4 {
-webkit-align-self:
baseline;
align-self: baseline;
}
.item5 {
-webkit-align-self: stretch;
align-self: stretch;
}
flex プロパティは、同じコンテナ内の他のフレックス項目に相対的な、フレックス項目の長さを指定します。
次の例では、最初のフレックス項目は空き領域の 2/4 を消費し、他の2つのフレックスの項目は、空き領域それぞれの 2/4 を消費します:
.flex-item {
background-color: cornflowerblue;
margin: 10px;
}
.item1 {
-webkit-flex: 2;
flex: 2;
}
.item2 {
-webkit-flex: 1;
flex: 1;
}
.item3 {
-webkit-flex: 1;
flex: 1;
}
フレックスボックスでレスポンシブな web サイトを作成する
この例は、フレックスボックスによりレスポンシブな web サイトのレイアウトを作成する方法のデモです。
次の表は、フレックスボックスで使われる CSS プロパティの一覧です:
| プロパティ | 説明 |
|---|---|
| display | HTML 要素に使用するボックスのタイプを指定する |
| flex-direction | フレックスコンテナ内のフレックス項目の方向を指定する |
| justify-content | 主軸の方向に余白が生じる場合、フレックス項目の横方向への配置方法を指定する |
| align-items | 交差軸の方向に余白が生じる場合、フレックス項目の縦方向への配置方法を指定する |
| flex-wrap | フレックス項目がフレックスライン 1 行に収まらない場合、ラップすべきかどうかを指定する |
| align-content | flex-wrap プロパティの動作を変更する。align-items に似ていますが、フレックス項目の代わりにフレックスラインを揃える |
| flex-flow | flex-direction と flex-wrap のショートハンド・プロパティ |
| order | 同じコンテナ内の他のフレックス項目と比較してフレックス項目の順序を指定する |
| align-self | フレックス項目に使用する。コンテナの align-items プロパティをオーバーライドする Used on flex items. Overrides the container's align-items property |
| flex | 同じコンテナ内の他のフレックス項目に関連してフレックス項目の長さを指定する |