css.svg

【CSS】Flexboxによるレイアウト配置

CSS

Flexbox とは

Flexbox は、子要素をどのようにレイアウトするかを決めるための仕組みです。

Flexbox を使用するには、親要素にdisplay: flexを追加します。 デフォルトでは、子要素が左から横並びになります。

HTML
<div class="parent">
  <div class="child">1</div>
  <div class="child">2</div>
  <div class="child">3</div>
</div>
CSS
.parent {
  display: flex;
}

通常

1
2
3

Flexbox

1
2
3

ここから Flexbox の各プロパティによって、レイアウトの変更を行っていきます。

親要素に対するプロパティ

flex-direction

要素の配置について、どの向きに要素を配置するかを指定します。 デフォルトはrowです。

以降の説明はrowを基準に説明していきます。 この値によって挙動が異なるプロパティがいくつかあります。

CSS
.parent {
  display: flex;
  flex-direction: row;
}
プロパティ値方向開始位置
row水平方向
row-reverse水平方向
column垂直方向
column-reverse垂直方向

row(デフォルト)

1
2
3

row-reverse

1
2
3

column

1
2
3

column-reverse

1
2
3

justify-content

水平方向の配置位置を指定します。デフォルトは、flex-startです。

CSS
.parent {
  display: flex;
  justify-content: flex-start;
}
プロパティ値説明
flex-start左寄せ
center中央寄せ
flex-end右寄せ
space-between等間隔配置 先頭と末尾は端に配置
space-around等間隔配置 両端の余白の幅は要素間の余白の幅の半分
space-evenly等間隔配置 すべての余白の幅が同じ

flex-start(デフォルト)

1
2
3

center

1
2
3

flex-end

1
2
3

space-between

1
2
3

space-around

1
2
3

space-evenly

1
2
3

実際はflex-directionによって配置方向が異なります。

flex-end (row-reverse)

1
2
3

flex-end (column)

1
2
3

flex-end (column-reverse)

1
2
3

align-items

垂直方向の配置位置を指定します。デフォルトは、stretchです。

CSS
.parent {
  display: flex;
  align-content: stretch;
}
プロパティ値子要素の高さ説明
stretch親要素の高さ上揃え
flex-start自身の高さ上揃え
center自身の高さ中央揃え
flex-end自身の高さ下揃え
baseline自身の高さベースラインに揃える(文字が水平に並ぶ)

stretch(デフォルト)

1
2
3

flex-start

1
2
3

center

1
2
3

flex-end

1
2
3

baseline

1
2
3

align-itemsflex-directionによって配置方向が異なります。

stretch (column)

1
2
3

flex-end (column)

1
2
3

flex-wrap

子要素が親要素の大きさを超えた場合に、折り返すかどうかを指定します。 デフォルトはnowrapです。

flex-directionによって折り返す向きが異なります。

CSS
.parent {
  display: flex;
  flex-wrap: nowrap;
}
プロパティ値row, row-reversecolumn, column-reverse
nowrap折り返さない折り返さない
wrap下に折り返す右に折り返す
wrap-reverse上に折り返す左に折り返す

nowrap(デフォルト)

1
2
3
4
5
6
7
8
9

wrap

1
2
3
4
5
6
7
8
9

wrap-reverse

1
2
3
4
5
6
7
8
9

align-content

要素の折り返し(flex-wrap)が設定されている場合に、行の配置方法を指定します。 デフォルトはstretchです。

align-itemsは行毎に適用されます。

CSS
.parent {
  display: flex;
  flex-wrap: wrap;
  align-content: stretch;
}
プロパティ値行の高さ    説明
stretch親要素の高さの等分行の高さを均等にする
flex-startコンテンツの高さ上揃え
centerコンテンツの高さ中央揃え
flex-endコンテンツの高さ下揃え
space-betweenコンテンツの高さ等間隔配置 行頭と行末は端に配置
space-aroundコンテンツの高さ等間隔配置 両端の余白の幅は要素間の余白の幅の半分
space-evenlyコンテンツの高さ等間隔配置 すべての余白の幅が同じ

stretch(デフォルト)

1
2
3
4
5
6
7
8
9

flex-start

1
2
3
4
5
6
7
8
9

center

1
2
3
4
5
6
7
8
9

flex-end

1
2
3
4
5
6
7
8
9

space-bwtween

1
2
3
4
5
6
7
8
9

space-around

1
2
3
4
5
6
7
8
9

space-evenly

1
2
3
4
5
6
7
8
9

flex-directioncolumnまたはcolumn-reverseの場合は、行ではなく列になります。

space-bwtween (column)

1
2
3
4
5
6
7
8
9

place-content

place-contentは、align-contentjustify-contentを同時に設定します。

CSS
.parent {
  display: flex;
  flex-wrap: wrap;
  place-content: space-between center;
}

/* 以下と同義 */
.parent {
  display: flex;
  flex-wrap: wrap;
  align-content: space-between;
  justify-content: center;
}
1
2
3
4
5
6
7
8
9

gap

子要素の間隔を指定します。

gapは、row-gapcolumn-gapをまとめた指定方法です。

CSS
.parent {
  display: flex;
  flex-wrap: wrap;
  gap: 10px 20px;
}

/* 以下と同義 */
.parent {
  display: flex;
  flex-wrap: wrap;
  row-gap: 10px;
  column-gap: 20px;
}
1
2
3
4
5
6
7
8
9

子要素に対するプロパティ

order

子要素の並び順を整数で指定します。値の小さいな要素から順に並びます。

HTML
<div class="parent">
  <div class="child" style="order: 3">1</div>
  <div class="child" style="order: 10">2</div>
  <div class="child" style="order: -1">3</div>
  <div class="child" style="order: 5">4</div>
  <div class="child" style="order: 0">5</div>
  <div class="child" style="order: 7">6</div>
</div>
1
2
3
4
5
6

align-self

align-itemsについて、単独で配置方法を指定します。

指定するプロパティ値はalign-itemsと同じです。 デフォルトはautoとなっており、親のalign-itemsの値を引き継ぎます。

HTML
<div class="parent">
  <div class="child">1</div>
  <div class="child" style="align-self: flex-start">2</div>
  <div class="child">3</div>
</div>
CSS
.parent {
  display:flex;
  align-items: flex-end;
}
1
2
3

flex-grow

親要素の幅が余っている時に、子要素の幅がどのくらい拡張するかを指定します。

デフォルトには0が設定されており、子要素の幅そのものになります。

以下の例だと、1:2:4 の幅になります。

HTML
<div class="parent">
 <div class="child" style="flex-grow: 1">1</div>
 <div class="child" style="flex-grow: 2">2</div>
 <div class="child" style="flex-grow: 4">3</div>
</div>
1
2
3

flex-shrink

子要素の幅が親要素の幅を超えた場合に、どのくらい縮小するかを指定します。 子要素の幅をwidth: 100pxのように固定していたとしても縮小するようになります。

デフォルトには1が設定されています。要素を縮小させたくない場合は0を設定します。

HTML
<div class="parent">
  <div class="child" style="flex-shrink: 2">1</div>
  <div class="child" style="flex-shrink: 1">2</div>
  <div class="child" style="flex-shrink: 0">3</div>
  <div class="child" style="width: 100%">4</div>
</div>
1
2
3
4

flex-basis

子要素の基本の幅を指定します。デフォルトはautoとなっており、要素自身の幅(width)が設定されます。

HTML
<div class="parent">
  <div class="child" style="width: 200px">1</div>
  <div class="child" style="width: 200px; flex-basis: 400px">2</div>
</div>
1
2

flex

flexは、flex-growflex-shrinkflex-basisをまとめて指定するのに使用します。 一般的にこれら 3 つのプロパティはflexを使って設定します。

flexは指定するプロパティの数や種類によって設定する内容が異なります。

プロパティが 1 つの場合は、flex-growの値を設定します。flex-shrink1flex-basis0が設定されます。

CSS
.child {
  flex: 1;
}

/* 以下と同義 */
.child {
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: 0;
}

プロパティが 2 つの場合は、2 つめの値の種類によって設定内容が異なります。 数値の場合はflex-shrink、長さの場合はflex-basisが設定されます。

CSS
.child {
  flex: 1 0;
}

/* 以下と同義 */
.child {
  flex-grow: 1;
  flex-shrink: 0;
  flex-basis: 0;
}
CSS
.child {
  flex: 1 200px;
}

/* 以下と同義 */
.child {
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: 200px;
}

プロパティ 3 つの場合は、flex-growflex-shrinkflex-basisの順で指定します。

CSS
.child {
  flex: 1 0 200px;
}

/* 以下と同義 */
.child {
  flex-grow: 1;
  flex-shrink: 0;
  flex-basis: 200px;
}

例えば、可変長+固定長のレイアウトを行う場合は次のようにできます。

HTML
<div class="container">
  <div class="main">
  </div>
  <div class="side">
  </div>
</div>
CSS
.container {
  display: flex;
}
.main {
  flex: 1;
}
.side {
  flex: 0 0 300px
}
main
side