フレックスボックス

子要素が縦に並ぶところを、横に並べたり、並べる順番を変えたりすることができます。

本ページでは、フレックスボックスについて説明しています。

フレックスボックスとは?

フレックスボックスを使うと、簡単に子要素を横に並べて表示したり、表示する順番を変えたりできます。

フレックスボックス利用例

以前は、floatプロパティでサイドバーなどを回り込ませていましたが、フレックスボックスの方が簡単で表示方法も多様です。他にも、リスト項目を横に並べて表示するなど、使い方もさまざまです。

フレックスボックスの基本的な利用例

フレックスボックスの基本的な利用例です。以下のHTMLがあったとします。

【div(クラスbox)の子要素としてdivを配置】
<div class="box">

<div>アイテム1</div>
<div>アイテム2</div>
<div>アイテム3</div>

</div>

フレックスボックスを使うためには、CSSで親要素を対象にdisplay:flex;の宣言をします。

【クラスboxをフレックスコンテナに定義】
.box {
  display: flex;
}

これで、子要素は横に並んで表示されるようになります。この時、親要素をフレックスコンテナ、子要素をフレックスアイテムと呼びます。

フレックスコンテナとフレックスアイテム

つまり、フレックスコンテナになるとフレックスアイテムの配置(内側の表示方法)を制御することになります。デフォルトでは、フレックスアイテムは左から右に表示されます。

なお、以降の説明でも上で示したHTMLとCSSを基本とします(アイテムが1〜3ではなく増えることもあります)。

フレックスボックス関連のプロパティ

フレックスボックスは、プロパティを使って並び方や大きさを変えることができます。以下は、プロパティの例です。リンクをクリックすると、それぞれの説明にジャンプできます。

【フレックスボックス関連のプロパティ】
プロパティ 説明 区分
flex-direction 横並び、縦並び、右から表示など
flex-wrap 幅一杯になった時に縮めるか折り返すか
flex-flow flex-directionとflex-wrapを同時に指定
order 表示する順番を指定
flex-grow フレックスアイテムの横幅が大きくなる(伸びる)割合
flex-shrink フレックスアイテムの横幅が小さくなる(縮む)割合
flex-basis フレックスアイテムの横幅を指定
flex flex-growとflex-shrinkとflex-basisを同時に指定
justify-content 横幅に余りがある時の扱い(中央寄せなど)
align-items フレックスアイテムの高さが異なる時の扱い

区分の●はフレックスコンテナで使い、○はフレックスアイテムで使います。

flex-direction

flex-directionは、横並び、縦並び、右から表示などの指定ができます。フレックスコンテナで使います。

以下は、flex-directionで使える値と表示例です。

flex-direction: row;
左から右に表示します。これがデフォルトです。flex-direction:row;は左から右に表示する
flex-direction: row-reverse;
右から左に表示します。flex-direction:row-reverse;は右から左に表示する
flex-direction: column;
上から下に表示します。flex-direction:column;は上から下に表示する
flex-direction: column-reverse;
下から上に表示します。flex-direction:column;は下から上に表示する

なお、以降の説明ではflex-direction: row;の時とします。row-reverseの時は、左右が逆になります。例えば、右寄せが左寄せに変わります。

columnやcolumn-reverseでは、横幅の調整が高さの調整になります。つまり、縦横の考えが入れ替わります。

flex-wrap

flex-wrapは、フレックスコンテナの横幅一杯になった時、縮めて表示するか、折り返して表示するかの指定ができます。フレックスコンテナで使います。

以下は、flex-wrapで使える値と表示例です。

flex-wrap: nowrap;
縮めて表示します。これがデフォルトです。flex-wrap:nowrap;は縮めて表示する
flex-wrap: wrap;
折り返して表示します。flex-wrap:wrap;は折り返して表示する
flex-wrap: wrap-reverse;
下から折り返して表示します。flex-wrap:wrap-reverse;は、下から折り返して表示する

flex-flow

flex-flowは、flex-directionとflex-wrapを同時に指定できます。フレックスコンテナで使います。

以下は、利用例です。

【flex-flowの利用例】
flex-flow: row-reverse wrap;

上記により、右から表示されて、幅一杯になると折り返して表示されます。

order

orderは、フレックスアイテムを表示する順番の指定ができます。フレックスアイテムで使います。

以下は、利用例です。

【orderの利用例】
.box > div:nth-child(1) {
  order: 3;
}

.box > div:nth-child(2) {
  order: 1;
}

.box > div:nth-child(3) {
  order: 2;
}

これは、以下のように表示されます。

orderは、番号が小さい順に表示される

番号が小さい順に表示されているのがわかると思います。

flex-grow

flex-growは、フレックスアイテムを伸ばす(長くする)ことができます。フレックスアイテムで使います。

以下は、利用例です。

【flex-growの利用例】
.box > div:nth-child(1) {
  flex-grow: 1;
}

.box > div:nth-child(2) {
  flex-grow: 5;
}

.box > div:nth-child(3) {
  flex-grow: 10;
}

これは、以下のように表示されます。

flex-growは、数字が大きい程割り当てられる幅が大きい

flex-growの数字が大きい方が、横幅が広く表示されています。この数字は、フレックスアイテムを伸ばさない時の余白を1:5:10の割合で分配します。このため、フレックスアイテムの横幅自体が1:5:10の割合になっている訳ではありません。

flex-growは余白を割り当てる

全てのフレックスアイテムをflex-grow:1;にすると、余白を均等に割り当ててフレックスコンテナを埋め尽くします。また、合計値が1未満の場合はフレックスコンテナ一杯まで広がりません。

flex-growのデフォルトは0で、フレックスアイテムの横幅は伸びません。

flex-shrink

flex-shrinkは、フレックスアイテムを縮める(短くする)ことができます。フレックスアイテムで使います。

以下は、利用例です。

【flex-shrinkの利用例】
.box {
  display: flex;
  width: 200px;
}

.box > div:nth-child(1) {
  flex-shrink: 1;
}

.box > div:nth-child(2) {
  flex-shrink: 2;
}

.box > div:nth-child(3) {
  flex-shrink: 3;
}

これは、以下のように表示されます。

flex-shrinkは、数字が大きい程幅が小さい

flex-shrinkの数字が大きい方が、横幅が狭く表示されています。この数字は、フレックスアイテムを縮めない時のはみ出した幅から計算されています。

flex-shrinkは、はみ出す幅を割合に応じて縮める

flex-shrinkの値と元々の幅の掛け算で縮める横幅が決まります。このため、flex-shrinkの値が同じであれば、横幅が広い方が大きく縮みます。

flex-shrinkを0にすると、縮みません。デフォルトは1です。

flex-basis

flex-basisは、フレックスアイテムの横幅を指定することができます。フレックスアイテムで使います。

以下は、利用例です。

【flex-basisの利用例】
.box > div:nth-child(1) {
  flex-basis: 50px;
}

.box > div:nth-child(2) {
  flex-basis: 100px;
}

.box > div:nth-child(3) {
  flex-basis: 200px;
}

これは、以下のように表示されます。

flex-basisは、指定した幅で表示される

指定した横幅のとおりに表示されますが、flex-growやflex-shrinkの値によって伸縮します。

flex-basisは、パーセントでも指定できます。例えば、flex-basis:10%;と宣言すると、フレックスコンテナの10%の幅で表示されます。

flex-basisのデフォルトはautoで、widthが設定されていればその値、設定されていなければ表示するための最低限の幅(値はcontent)となります。

flex

flexは、flex-grow、flex-shrink、flex-basisを同時に指定できます。flex-growとflex-shrinkについては、flex-grow→flex-shrinkの順に指定が必要です。また、フレックスアイテムで使います。

以下は、利用例です。

【flexの利用例】
flex: 0 1 200px;

上記は、基本の横幅は200pxで、幅は伸びないけどフレックスコンテナに収まらない時は縮むことができます。

以下の指定もできます。

【flexで使える値】
宣言 説明
flex:initial; 0 1 autoを指定したのと同じです。これがデフォルトです。伸びませんが、縮みます。
flex:auto; 1 1 autoを指定したのと同じです。フレックスコンテナに合わせて伸び縮みします。
flex:none; 0 0 autoを指定したのと同じです。伸び縮みしません。
flex:1; 1 1 0を指定したのと同じです。幅が0を基準として伸び縮みします。

flex:1;は幅が0を基準とするため、元々の幅は考慮されません。したがって、すべてのフレックスアイテムでflex:1;を指定すると、widthなどで異なる幅を指定していても同じ幅になります。

justify-content

justify-contentは、フレックスアイテムの横の配置場所を決めます。フレックスコンテナで使います。

以下は、justify-contentで使える値と表示例です。

justify-content: flex-start;
左に寄せて表示します。これがデフォルトです。justify-content: flex-start;は左寄せで表示する
justify-content: flex-end;
右に寄せて表示します。flex-direction: row-reverse;と違って、フレックスアイテムの並び順は変わりません。justify-content: flex-end;は右寄せで表示する
justify-content: center;
中央に寄せて表示します。justify-content: center;は中央寄せで表示する
justify-content: space-between;
フレックスアイテム間をスペースにします。justify-content: space-between;はフレックスアイテム間を空ける
justify-content: space-around;
space-betweenに加えて、フレックスコンテナとの間もフレックスアイテム間の半分の幅でスペースにします。justify-content: space-around;はspace-betweenに加えてフレックスコンテナとの間も半分の幅で空ける
justify-content: space-evenly;
余白を均等に割り振ります。Internet Explorerではサポートされていません。justify-content: space-evenly;はspace-betweenに加えてフレックスコンテナとの間も同じ幅で空ける

align-items

align-itemsは、フレックスアイテムの縦の配置場所を決めます。フレックスコンテナで使います。

以下は、align-itemsで使える値と表示例です。表示例では、アイテム1の幅を30px、アイテム2の幅を50px、アイテム3の幅を100pxにしています。

align-items: stretch;
最も高さのあるフレックスアイテムに高さを揃えます。これがデフォルトです。align-items: stretch;は高さを揃えて表示する
align-items: flex-start;
上に揃えます。align-items: flex-start;は上に揃えて表示する
align-items: flex-end;
下に揃えます。align-items: flex-end;は下に揃えて表示する
align-items: center;
真ん中に揃えます。align-items: center;は中央に揃えて表示する
align-items: baseline;
文字の開始位置を揃えます。align-items: baseline;は、文字の開始位置を揃えて表示する

最後のbaselineでは、padding-topをそれぞれ10px、20px、30px設定しています。テキストの垂直方向の開始位置がそろっているのがわかると思います。