Web開発15分で読める

CSS Flexboxの基本 - レイアウトを自在に操る方法

Flexboxを使ったCSSレイアウトの基本から応用まで、実践的なコード例とともに徹底解説します。

Flexboxとは

Flexbox(Flexible Box Layout)は、CSSでレイアウトを作成するための強力なモジュールです。従来のfloatpositionを使った方法と比べて、要素の配置を直感的に制御できます。

Flexboxが解決する主な問題:

  • 垂直方向の中央揃え - 従来は難しかった縦方向の中央配置が簡単に
  • 要素の均等配置 - スペースを自動で均等に分配
  • 順序の変更 - HTMLを変更せずに表示順を変更
  • 柔軟なサイズ調整 - 利用可能なスペースに応じて自動調整

基本的な使い方

Flexboxを使うには、親要素(コンテナ)にdisplay: flexを指定します。

CSS
.container {
  display: flex;
}

.item {
  /* 子要素は自動的にFlexアイテムになる */
}
HTML
<div class="container">
  <div class="item">アイテム1</div>
  <div class="item">アイテム2</div>
  <div class="item">アイテム3</div>
</div>

コンテナのプロパティ

Flexコンテナには、子要素の配置を制御する様々なプロパティがあります。

flex-direction(並び方向)

子要素の並び方向を指定します。

CSS
.container {
  display: flex;
  flex-direction: row;          /* 横並び(デフォルト) */
  flex-direction: row-reverse;  /* 横並び(逆順) */
  flex-direction: column;       /* 縦並び */
  flex-direction: column-reverse; /* 縦並び(逆順) */
}

row

左から右に横並び

row-reverse

右から左に横並び

column

上から下に縦並び

column-reverse

下から上に縦並び

justify-content(主軸方向の配置)

主軸(flex-directionの方向)に沿った配置を指定します。

CSS
.container {
  display: flex;
  justify-content: flex-start;     /* 先頭揃え(デフォルト) */
  justify-content: flex-end;       /* 末尾揃え */
  justify-content: center;         /* 中央揃え */
  justify-content: space-between;  /* 両端揃え、均等配置 */
  justify-content: space-around;   /* 均等配置(両端に半分の余白) */
  justify-content: space-evenly;   /* 均等配置(すべて同じ余白) */
}

align-items(交差軸方向の配置)

交差軸(主軸と垂直の方向)に沿った配置を指定します。

CSS
.container {
  display: flex;
  height: 200px;
  align-items: stretch;     /* 伸縮して埋める(デフォルト) */
  align-items: flex-start;  /* 先頭揃え */
  align-items: flex-end;    /* 末尾揃え */
  align-items: center;      /* 中央揃え */
  align-items: baseline;    /* テキストのベースライン揃え */
}

完全中央揃えの黄金パターン:

.center-box {
  display: flex;
  justify-content: center;  /* 水平中央 */
  align-items: center;      /* 垂直中央 */
  height: 100vh;            /* 画面全体の高さ */
}

これだけで、どんな要素でも完璧に中央配置できます!

flex-wrap(折り返し)

子要素が収まりきらない場合の折り返しを指定します。

CSS
.container {
  display: flex;
  flex-wrap: nowrap;   /* 折り返さない(デフォルト) */
  flex-wrap: wrap;     /* 折り返す */
  flex-wrap: wrap-reverse; /* 逆方向に折り返す */
}

gap(要素間の余白)

Flexアイテム間の余白を簡単に指定できます。

CSS
.container {
  display: flex;
  gap: 20px;           /* 上下左右に20pxの余白 */
  gap: 10px 20px;      /* 行間10px、列間20px */
  row-gap: 10px;       /* 行間のみ指定 */
  column-gap: 20px;    /* 列間のみ指定 */
}

アイテムのプロパティ

Flexアイテム(子要素)にも、個別に指定できるプロパティがあります。

flex-grow(伸び率)

余白がある場合に、どれだけ伸びるかを指定します。値が大きいほど多くのスペースを占めます。

CSS
.item-1 { flex-grow: 1; }  /* 1の割合で伸びる */
.item-2 { flex-grow: 2; }  /* 2の割合で伸びる(item-1の2倍) */
.item-3 { flex-grow: 1; }  /* 1の割合で伸びる */

flex-shrink(縮み率)

スペースが足りない場合に、どれだけ縮むかを指定します。

CSS
.item {
  flex-shrink: 0;  /* 縮まない(固定サイズを維持) */
  flex-shrink: 1;  /* 縮む(デフォルト) */
}

flex-basis(基本サイズ)

要素の初期サイズを指定します。widthheightの代わりに使用できます。

CSS
.item {
  flex-basis: 200px;   /* 基本サイズを200pxに */
  flex-basis: 25%;     /* 親要素の25% */
  flex-basis: auto;    /* コンテンツに応じた自動サイズ */
}

flexショートハンド

flex-growflex-shrinkflex-basisをまとめて指定できます。

CSS
.item {
  flex: 1;           /* flex: 1 1 0% と同じ */
  flex: 0 0 auto;   /* 伸縮なし、自動サイズ */
  flex: 1 1 200px;  /* 200pxを基本に伸縮 */
}

よくある間違い:flex: 1を指定するとflex-basis0%になります。コンテンツに応じたサイズにしたい場合はflex: 1 1 autoを使いましょう。

align-self(個別の配置)

特定のアイテムだけ、交差軸方向の配置を変更できます。

CSS
.container {
  display: flex;
  align-items: flex-start;  /* 全体は上揃え */
}

.special-item {
  align-self: center;  /* このアイテムだけ中央 */
}

実践的なレイアウトパターン

パターン1: ヘッダーナビゲーション

ロゴを左に、ナビゲーションリンクを右に配置する典型的なパターン。

CSS
.header {
  display: flex;
  justify-content: space-between;  /* 両端に配置 */
  align-items: center;             /* 垂直中央 */
  padding: 1rem 2rem;
}

.nav-links {
  display: flex;
  gap: 2rem;  /* リンク間の余白 */
}

パターン2: カードグリッド

均等に配置されるカードレイアウト。

CSS
.card-container {
  display: flex;
  flex-wrap: wrap;   /* 折り返しを許可 */
  gap: 1.5rem;
}

.card {
  flex: 1 1 300px;   /* 最小300px、伸縮あり */
  max-width: 400px;  /* 最大幅を制限 */
}

パターン3: サイドバーレイアウト

固定幅のサイドバーと可変幅のメインコンテンツ。

CSS
.layout {
  display: flex;
  min-height: 100vh;
}

.sidebar {
  flex: 0 0 250px;  /* 固定幅250px */
}

.main-content {
  flex: 1;           /* 残りのスペースを使う */
}

パターン4: フッターを画面下部に固定

コンテンツが少なくてもフッターを画面下部に表示。

CSS
.page {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}

.main {
  flex: 1;  /* メインコンテンツが残りを埋める */
}

.footer {
  /* 自動的に下部に配置される */
}

レスポンシブ対応

メディアクエリと組み合わせて、画面サイズに応じたレイアウト変更が簡単にできます。

CSS
.container {
  display: flex;
  flex-direction: column;  /* モバイル: 縦並び */
  gap: 1rem;
}

@media (min-width: 768px) {
  .container {
    flex-direction: row;  /* タブレット以上: 横並び */
    flex-wrap: wrap;
  }

  .item {
    flex: 1 1 45%;  /* 2列表示 */
  }
}

@media (min-width: 1024px) {
  .item {
    flex: 1 1 30%;  /* 3列表示 */
  }
}

Flexbox vs CSS Grid

Flexbox が向いているケース

1次元のレイアウト(横一列、縦一列)、ナビゲーション、ボタングループ、カードの横並び

CSS Grid が向いているケース

2次元のレイアウト(行と列の両方)、ページ全体のレイアウト、複雑なグリッドシステム

まとめ

Flexboxをマスターすれば、CSSレイアウトの悩みの多くが解消されます。最初は覚えることが多く感じるかもしれませんが、基本的なプロパティを押さえれば、あとは組み合わせで対応できます。

実践のすすめ:実際にコードを書いて試すのが一番の上達法です。当サイトの「Web Tools」では、CSSの検証に役立つツールを提供しています。

H
honualohak編集部

テクノロジーで人々の日常をより便利に。AI、プログラミング、Web開発に関する情報を発信しています。