フレックス・ボックス(display: flex
)を使うと、詳細な配置を設定をできます。
display: flex
は、下表のCSSプロパティと共に使います。
CSSプロパティ | 設定内容 | デフォルト値 | よく使う設定値 | 設定する対象 |
---|---|---|---|---|
flex-wrap | 改行を指定する | nowrap | wrap | 親要素 |
flex-direction | 向きを指定する | row | 親要素 | |
flex-flow | 改行と向き を一括で指定する | nowrap row | wrap | 親要素 |
justify-content | 左右整列 | flex-start | 親要素 | |
align-items | 上下整列(親要素) | stretch | 親要素 | |
align-content | 改行時の上下整列 | stretch | 親要素 | |
align-self | 上下整列(子要素) | stretch | 子要素 | |
flex-grow | 幅の広がりを指定する | 0 | 1 | 子要素 |
flex-shrink | 幅の縮みを指定する | 1 | 子要素 | |
flex-basis | 幅の大きさを指定する | auto | 子要素 | |
flex | flex-grow 、flex-shrink 、flex-basis の一括指定 | 0 1 auto | 子要素 | |
order | 順番を指定する | 0 | 子要素 |
これらのCSSプロパティは親要素に対して設定するプロパティと、子要素に対して設定するプロパティがあるので注意しましょう。
display: flex
親子関係のある要素を準備します。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
display: flex
は親要素(.parent
)に対して設定します。 子要素は横並びになります。 (理由: 後述するflex-direction
のデフォルト値がrow
だからです)
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; }
display: flex
デフォルト値
display: flex
は他のCSSプロパティと共に設定します。 以下にそれらのデフォルト値が設定してみました。 全てがデフォルト値なので表示結果は無指定の場合と同じになります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; flex-wrap: nowrap; /* 改行 */ flex-direction: row; /* 向き */ justify-content: flex-start; /* 左右整列 */ align-items: stretch; /* 上下整列(親要素) */ align-content: stretch; /* 改行時の上下整列 */ } .children { align-self: stretch; /* 上下整列(子要素) */ flex-grow: 0; /* 幅の広がり */ flex-shrink: 1; /* 幅の縮み */ flex-basis: auto; /* 幅の大きさ */ order: 0; /* 順番 */ }
いくつかのCSSプロパティは まとめることができます。 まとめた例を以下に示します。align-items
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; flex-flow: nowrap row; /* 改行 + 向き */ justify-content: flex-start; /* 左右整列 */ align-items: stretch; /* 上下整列(親要素) */ align-content: stretch; /* 改行時の上下整列*/ } .children { align-self: stretch; /* 上下整列(子要素) */ flex: 0 1 auto; /* 幅の広がり+縮み+大きさ */ order: 0; /* 順番 */ }
flex-wrap
| 改行
flex-wrap
で改行を指定します。
設定値 | 機能 | デフォルト | メモ |
---|---|---|---|
wrap | 下に改行する。 | よく使う | |
wrap-reverse | 上に改行する。 | ||
nowrap | 改行しない。 |
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; }
親要素の幅(width
)を狭く(10rem
)します。デフォルトでは子要素は親要素をはみ出します。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 10rem; }
親要素のflex-wrap
をwrap
に設定すると子要素は下に改行します。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 10rem; flex-wrap: wrap; }
wrap
wrap-reverse
にすると上に改行します。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 10rem; flex-wrap: wrap-reverse; }
wrap-reverse
nowrap
にすると改行しません。(デフォルト値)
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 10rem; flex-wrap: nowrap; }
nowrap
改行しない場合は はみ出すことがあります。 はみ出した部分の表示についてはoverflow
プロパティを使います。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 10rem; overflow: auto; }
overflow: auto
flex-direction
| 向き
flex-direction
で並びの向きを指定します。
設定値 | 並び | デフォルト | メモ |
---|---|---|---|
row | 左→右 | ||
row-reverse | 右→左 | ||
column | 上→下 | ||
column-reverse | 下→上 |
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; }
親要素のflex-direction
をrow-reverse
に設定すると右→左になります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; flex-direction: row-reverse; }
row-reverse
column
に変更すると上→下になります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; flex-direction: column; }
column
column-reverse
に変更すると下→上になります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; flex-direction: column-reverse; }
column-reverse
row
に変更すると左→右になります。(デフォルト値)
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; flex-direction: row; }
個々の子要素の並び順を細かく指定するにはorder
プロパティを使います。
flex-flow
| 改行+向き
flex-flow
はflex-wrap
(改行)とflex-direction
(向き)をまとめて指定するプロパティです。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 10rem; }
flex-wrap
とflex-direction
を個別に指定した場合と、flex-flow
でまとめて指定した場合の結果を示します。 表示結果は同じです。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 10rem; flex-wrap: wrap; flex-direction: row-reverse; }
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 10rem; flex-flow: wrap row-reverse; }
flex-flow
の設定値を一つだけにすることもできます。 flex-wrap: wrap
とflex-flow: wrap
は同じ結果になります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 10rem; flex-wrap: wrap; }
flex-wrap
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 10rem; flex-flow: wrap; }
flex-flow
justify-content
| 左右整列
justify-content
は左右をそろえる設定です。
設定値 | 機能 | デフォルト | メモ |
---|---|---|---|
flex-start | 左に整列 | ||
center | 中央に整列 | ||
flex-end | 右に整列 | ||
space-between | 均等配置(端は詰める) | ||
space-around | 均等配置(端は開ける) |
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; }
親要素の幅(width
)を広げます。左に整列されます。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; }
親要素のjustify-content
をcenter
を指定します。中央に整列されます。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; justify-content: center; }
center
flex-end
を指定します。右に整列されます。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; justify-content: flex-end; }
flex-end
space-between
を指定します。均等に配置されます。 端は詰めて表示されます。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; justify-content: space-between; }
space-around
を指定します。均等に配置されます。(space-between
とは異なり)端を空けて表示されます。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; justify-content: space-around; }
flex-start
を指定します。左に整列されます。(デフォルト値)
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; justify-content: flex-start; }
align-items
| 上下整列(親要素)
align-items
は上下をそろえる設定です。
設定値 | 機能 | デフォルト |
---|---|---|
stretch | 上下に延ばす | |
flex-start | 上そろえ | |
center | 中央そろえ | |
flex-end | 下そろえ |
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; }
親要素の高さ(height
)を広げます。上下に延ばされます。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; height: 12rem; }
align-items
にflex-start
を指定すると上そろえになります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; height: 12rem; align-items: flex-start; }
flex-start
align-items
にcenter
を指定すると中央そろえになります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; height: 12rem; align-items: center; }
center
align-items
にflex-end
を指定すると下そろえになります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; height: 12rem; align-items: flex-end; }
flex-end
align-items
にstretch
を指定すると上下に延ばします。(デフォルト値)
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; height: 12rem; align-items: stretch; }
stretch
align-content
| 改行時の上下整列
align-content
は改行時の上下をそろえる設定です。 改行時に対する設定なのでflex-wrap
(改行)がnowrap
(改行しない)の場合は無効です。
設定値 | 機能 | デフォルト |
---|---|---|
stretch | 上下に引き延ばす | |
flex-start | 上に整列 | |
center | 中央に整列 | |
flex-end | 下に整列 | |
space-between | 均等配置(上下の端は詰める) | |
space-around | 均等配置(上下の端は開ける) |
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 10rem; flex-wrap: wrap; }
親要素の高さ(height
)を高くします。子要素が上下に引き伸ばされます。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 10rem; flex-wrap: wrap; height: 18rem; }
align-content
にflex-start
を指定すると上に整列になります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 10rem; flex-wrap: wrap; height: 18rem; align-content: flex-start; }
flex-start
center
を指定すると中央に整列になります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 10rem; flex-wrap: wrap; height: 18rem; align-content: center; }
center
flex-end
を指定すると下に整列になります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 10rem; flex-wrap: wrap; height: 18rem; align-content: flex-end; }
flex-end
space-between
を指定すると均等配置(上下の端は詰める)になります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 10rem; flex-wrap: wrap; height: 18rem; align-content: space-between; }
space-between
space-around
を指定すると均等配置(上下の端は開ける)になります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 10rem; flex-wrap: wrap; height: 18rem; align-content: space-around; }
space-around
stretch
を指定すると上下に引き延ばします。(デフォルト値)
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 10rem; flex-wrap: wrap; height: 18rem; align-content: stretch; }
stretch
align-self
| 上下整列(子要素)
align-items
プロパティは親要素に対して設定し、全ての子要素に同じ設定が適用されます。しかし、個々の子要素で別の設定をしたい場合もあります。 その場合、対象の子要素にalign-self
プロパティを設定します。
align-self
が設定可能な値はalign-items
と同じです。
設定値 | 機能 | デフォルト |
---|---|---|
stretch | 上下に延ばす | |
flex-start | 上そろえ | |
center | 中央そろえ | |
flex-end | 下そろえ |
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; }
親要素の高さ(height
)を広げます。上下に延ばされます。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; height: 12rem; }
.child-2だけは上そろえにしたい場合、.child-2
クラスのalign-self
をflex-start
に設定します。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; height: 12rem; } .child-2 { align-self: flex-start; }
flex-start
.child-3
クラスのalign-self
をcenter
に設定すると、中央そろえになります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; height: 12rem; } .child-2 { align-self: flex-start; } .child-3 { align-self: center; }
center
.child-4
クラスのalign-self
をflex-end
に設定すると、下そろえになります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; height: 12rem; } .child-2 { align-self: flex-start; } .child-3 { align-self: center; } .child-4 { align-self: flex-end; }
flex-end
.child-4
クラスのalign-self
をstretch
に変更すると、上下に伸びます。(デフォルト値)
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; height: 12rem; } .child-2 { align-self: flex-start; } .child-3 { align-self: center; } .child-4 { align-self: stretch; }
stretch
(デフォルト値)flex-grow
| 幅の広がり
幅の広がりを指定します。flex-grow
は子要素に対して指定することに注意してください。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; }
親要素の幅(width
)を広くしてみます。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; }
子要素のflex-grow
を0
と指定します。0
がデフォルト値なので変化しません。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; } .children { flex-grow: 0; }
0
flex-grow
を1
を指定すると子要素が広がります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; } .children { flex-grow: 1; }
.child-3
のflex-grow
を2
にすると、他の子要素よりも幅が広くなります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; } .children { flex-grow: 1; } .child-3 { flex-grow: 2; }
2
.child-3
のflex-grow
を3
にしてみます。幅はさらに広くなります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; } .children { flex-grow: 1; } .child-3 { flex-grow: 3; }
3
.children
のflex-grow
を0
にしてみます。.child-3
以外の幅はデフォルトに戻るので、開いた全てのスペースを.child-3
が占めることになります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; } .children { flex-grow: 0; } .child-3 { flex-grow: 3; }
.children
を0
にflex-shrink
| 幅の縮み
幅の縮みを指定します。flex-shrink
は子要素に対して指定することに注意してください。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; }
親要素の幅(width
)を広くしてみます。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; }
子要素の幅も広くしてみます。 子要素の幅を10rem
にしているので、全体では10rem × 4 = 40rem
必要にですが、親要素の幅が30rem
しかないのでハミ出しそうです。 しかし、子要素が均等に縮むことで上手く収まっています。 これは子要素のflex-shrink
のデフォルト値が1
であるからです。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; } .children { width: 10rem; }
実際に、子要素のflex-shrink
を1
に指定しても結果は同じです。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; } .children { width: 10rem; flex-shrink: 1; }
1
flex-shrink
を0
に変更するとはみ出します。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; } .children { width: 10rem; flex-shrink: 0; }
0
.children
を1
に戻して、.child-3
のflex-shrink
を2
にすると、他の子要素よりも狭くなります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; } .children { width: 10rem; flex-shrink: 1; } .child-3 { flex-shrink: 2 }
2
.child-3
のflex-shrink
を3
にすると、さらに狭くなります。 このように値が大きいほど狭くなることに注意してください。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; } .children { width: 10rem; flex-shrink: 1; } .child-3 { flex-shrink: 3 }
2
.child-3
のflex-shrink
を0
にすると縮まなくなる(=width: 10rem
)ので、他の子要素が縮んで調整します。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; } .children { width: 10rem; flex-shrink: 1; } .child-3 { flex-shrink: 0 }
0
flex-basis
| 幅の大きさ
幅の大きさを指定します。flex-basis
は子要素に対して指定することに注意してください。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; }
親要素の幅(width
)を広くしてみます。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; }
子要素のflex-basis
を5rem
にします。 flex-basis
は実質的にwidth
と同じです。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; } .children { flex-basis: 5rem; }
5rem
.child-3
のflex-basis
を8rem
にしてみます。子3のみ、幅は広くなります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; } .children { flex-basis: 5rem; } .child-3 { flex-basis: 8rem; }
8rem
flex-basis
をwidth
と書き換えても同じ結果になります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; } .children { width: 5rem; }
width
でも同じflex-basis
とwidth
の両方を指定した場合、flex-basis
が優先されます。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; } .children { width: 5rem; flex-basis: 3rem; }
flex-basis
が優先flex
| 幅の広がり+縮み+大きさ
flex-grow
/flex-shrink
/flex-basis
を一括で指定します。
設定値の順番はflex( flex-grow, flex-shrink, flex-basis )
またはflex( flex-basis, flex-grow, flex-shrink )
にします。(つまりflex-shrink
は常にflex-grow
の後ろ)
設定値 | 機能 | デフォルト |
---|---|---|
flex-grow | 幅の広がり | 0 |
flex-shrink | 幅の縮み | 1 |
flex-basis | 幅の大きさ | auto |
個別に設定した場合。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; } .children { flex-grow: 1; flex-shrink: 0; flex-basis: 5rem; }
flex-grow
、flex-shrink
、flex-basis
flex
でまとめて設定した場合。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; width: 30rem; } .children { flex: 1 0 5rem; }
flex
order
| 順番
子要素の順番を指定します。order
は子要素に対して指定することに注意してください。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; }
デフォルト値は0
であり、プラスの値を設定すると右に移動します。マイナスの値を設定すると左に移動します。
.child-3
のorder
を1
にすると、子3が一番右に来ます
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; } .child-3 { order: 1; }
1
.child-3
のorder
を-1
にすると、子3が一番左に来ます。他の子要素のorder
が0
なので、一番小さい-1
である.child-3
が一番左になります。
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; } .child-3 { order: -1; }
-1
全ての子要素にorder
を設定すると小さい順に並びます。(デフォルトが0
であることに注意してください)
parent<br> <div class="parent"> <div class="children child-1">子1</div> <div class="children child-2">子2</div> <div class="children child-3">子3</div> <div class="children child-4">子4</div> </div>
/* ----- 親要素 ----- */ .parent { border: 5px dotted green; padding: 5px; display: inline-block; } /* ----- 子要素 ----- */ .children { border: 5px solid purple; margin: 5px; padding: 5px; }
.parent { display: flex; } .child-1 { order: 4 } .child-2 { order: 1 } .child-3 { order: 3 } .child-4 { order: 2 }
order