7.

CSS Flexbox 横並び完全ガイド — display: flex の使い方と Grid との違い

編集
この記事の要点
  • 親要素に display: flex を指定すると、子要素が横並びになる(デフォルト flex-direction: row
  • 主軸方向の整列は justify-content、交差軸方向は align-items
  • 折り返しは flex-wrap: wrap、間隔は gap: 1em で簡単指定
  • 子要素の伸縮は flex: 1 1 auto(grow / shrink / basis)
  • IE11 は flex の一部仕様が独自 なので注意。現代は Flex (1D) + Grid (2D) を使い分け

display: flex の基本

子要素を横並びにするには、親要素display: flex を指定します。子要素を一切いじらずに親だけで横並びにできるのが Flexbox の強みです。

A
B
C
.container {
  display: flex;          /* これだけで A B C が横並びに */
}

.item {
  padding: 1em;
  background: #e0e7ff;
  border: 1px solid #6366f1;
}

従来の float / display: inline-block での横並びは、クリアフィックスや空白文字対応など面倒でしたが、Flexbox はそれらを全て解決します。

flex-direction(並び方向)

挙動
row(デフォルト)左から右へ横並び
row-reverse右から左へ横並び
column上から下へ縦並び
column-reverse下から上へ縦並び
.container {
  display: flex;
  flex-direction: row;          /* 横並び */
  /* flex-direction: column; */ /* 縦並びにしたい時 */
}

justify-content(主軸方向の整列)

横並び(row)の場合、主軸は水平方向。子要素の余白の分配を制御します:

挙動
flex-start(デフォルト)左寄せ
flex-end右寄せ
center中央揃え
space-between両端寄せ、間に等間隔
space-around各要素の左右に等しい余白
space-evenlyすべての余白が等しい
/* ナビゲーション右端寄せ */
.nav {
  display: flex;
  justify-content: flex-end;
}

/* ロゴ + メニューで両端 */
.header {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

/* 完全中央 */
.modal {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
}

align-items(交差軸方向の整列)

横並びの場合、交差軸は垂直方向。子要素の縦位置を制御します:

挙動
stretch(デフォルト)親の高さに合わせて引き伸ばす
flex-start上揃え
flex-end下揃え
center垂直中央
baseline文字のベースラインで揃える

flex-wrap(折り返し)

子要素が親の幅を超えるとき、デフォルトでは縮みます。折り返したい場合は:

.gallery {
  display: flex;
  flex-wrap: wrap;          /* 幅を超えたら下に折り返す */
  gap: 1em;                 /* 子要素の間隔 */
}

.gallery .item {
  flex: 0 0 calc(33.333% - 1em);  /* 3 列 */
}

/* ショートハンド */
.shorthand {
  flex-flow: row wrap;      /* flex-direction + flex-wrap */
}

gap(モダンな間隔指定)

Flexbox の gap は CSS Grid と同様、子要素間の余白を一括指定します。margin ハックが要らなくなります(Safari 14.1+ / Chrome 84+ / Firefox 63+):

.list {
  display: flex;
  gap: 1em;                 /* 縦横とも 1em */
  /* gap: 1em 2em; */       /* 縦 1em / 横 2em */
  /* row-gap: 1em; column-gap: 2em; */
}

子要素側のプロパティ

プロパティ役割
flex-grow余った空間を吸う比率(デフォルト 0)
flex-shrink足りない時の縮む比率(デフォルト 1)
flex-basis基本サイズ(デフォルト auto)
flex: 1 1 auto上 3 つのショートハンド
order並び順(数値が小さいほど先頭)
align-self個別の交差軸整列
.sidebar {
  flex: 0 0 240px;          /* 固定 240px */
}

.main {
  flex: 1 1 auto;           /* 残り全部を吸う */
}

/* 上揃えだけ自分は中央 */
.special {
  align-self: center;
}

典型レイアウト例

ヘッダー(ロゴ + ナビ)

.header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 1em 2em;
}
.header nav ul {
  display: flex;
  gap: 1.5em;
  list-style: none;
}

カードのグリッド(3 列レスポンシブ)

.cards {
  display: flex;
  flex-wrap: wrap;
  gap: 1em;
}
.cards .card {
  flex: 1 1 calc(33.333% - 1em);
  min-width: 240px;       /* 画面が狭くなったら 2 列 / 1 列に */
  padding: 1em;
  background: #f9fafb;
  border-radius: 8px;
}

中央寄せモーダル

.overlay {
  position: fixed; inset: 0;
  background: rgba(0,0,0,0.5);
  display: flex;
  justify-content: center;
  align-items: center;
}
.modal {
  background: #fff;
  padding: 2em;
  border-radius: 8px;
  max-width: 480px;
}

Flexbox と Grid の使い分け

項目FlexboxGrid
次元1 次元(横 or 縦)2 次元(行 + 列)
得意ナビ / カード列 / フォーム行ページレイアウト / カード壁面 / マガジンレイアウト
子のサイズ指定子側で flex: 1親側で grid-template-columns
折り返しflex-wrap標準で 2D 配置

IE11 の注意点

IE11 では Flexbox が動きますが、独自のバグが多い:

  • min-height 内の Flexbox で高さ計算が狂う
  • flex: 1 ショートハンドが正しく解釈されないことがある(flex: 1 1 0% と書く)
  • gap 非対応 → margin で代替
  • align-items: stretch + 子の height: auto でバグる

2024 年現在、IE サポートは MS 自身が終了しています。Edge / Chrome / Firefox / Safari のみ対応なら気にする必要はありません。

FAQ

Q: 子要素が縮まずに親をはみ出す
A: 子に min-width: 0 を指定。Flex アイテムは内容に基づく最小幅を持つため、長い文字列等で縮まないことがあります。

Q: 横並びの幅を均等にしたい
A: 子全部に flex: 1(= flex: 1 1 0)を指定。これで余白を均等分配します。

Q: display: flexdisplay: inline-flex の違い
A: 前者は親自体が block(幅 100%)、後者は inline(内容分の幅)。ボタンの中身を flex で並べたいときは inline-flex

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 文法、規則
  2. セレクタ
  3. プロパティ
  4. 色の指定方法
  5. アニメーション
  6. ライブラリ
  7. 「display: flex」を用いて要素を横並びにする方法
  8. スクロールの際のサイドバー固定方法「position: sticky」
  9. 縦の中央寄せ
  10. CSSの変更が反映されない
  11. 画面サイズもしくはスマホの場合のCSS切り替え方法
  12. 一行で左、真ん中、右にそれぞれ要素を寄せる方法
  13. 左右の端にそれぞれ要素を寄せる方法
  14. Bootstrapで両サイドを固定して広告を表示させる方法