Flexbox

1 次元の柔軟なレイアウトを実現する CSS のレイアウトモデル

CSS

Flexbox とは

Flexbox (Flexible Box Layout) は、コンテナ内の要素を行または列方向に柔軟に配置する CSS のレイアウトモデルである。2012 年に W3C で標準化され、float や inline-block によるハック的なレイアウトを置き換えた。display: flex で有効化する。

基本プロパティ

.container {
  display: flex;
  flex-direction: row;        /* 主軸の方向: row | column */
  justify-content: center;    /* 主軸の配置 */
  align-items: center;        /* 交差軸の配置 */
  gap: 16px;                  /* 要素間の間隔 */
  flex-wrap: wrap;            /* 折り返し */
}

.item {
  flex: 1;                    /* flex-grow: 1, flex-shrink: 1, flex-basis: 0% */
  flex-shrink: 0;             /* 縮小を防止 */
}

よく使うパターン

中央揃え (最も頻出)

.center {
  display: flex;
  justify-content: center;  /* 水平中央 */
  align-items: center;      /* 垂直中央 */
}

ナビゲーションバー

.navbar {
  display: flex;
  justify-content: space-between; /* ロゴを左、メニューを右 */
  align-items: center;
}

カードの横並び (レスポンシブ)

.card-grid {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
}
.card {
  flex: 1 1 300px; /* 最小 300px、余白があれば伸びる */
}

フッターを画面下部に固定

body {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}
main { flex: 1; }  /* main が残りの高さを占める */
footer { /* 自動的に下部に配置 */ }

Flexbox vs CSS Grid

観点 Flexbox CSS Grid
次元 1 次元 (行 or 列) 2 次元 (行 × 列)
適するケース ナビバー、ボタン群、カード横並び ページ全体のレイアウト、ダッシュボード
コンテンツ起点 コンテンツのサイズに応じて配置 グリッド定義に要素を配置
ブラウザ対応 ほぼ全ブラウザ ほぼ全ブラウザ

Flexbox は「要素を 1 列に並べる」、Grid は「2 次元のグリッドに配置する」。両方を組み合わせて使うのが一般的だ。

Tailwind CSS での Flexbox

<!-- Tailwind: ナビゲーションバー -->
<nav class="flex items-center justify-between px-4 py-2">
  <div class="text-xl font-bold">Logo</div>
  <div class="flex gap-4">
    <a href="/">Home</a>
    <a href="/about">About</a>
  </div>
</nav>

よくある落とし穴

flex-shrink のデフォルト

flex-shrink のデフォルト値は 1 で、コンテナが狭いと要素が意図せず縮小される。画像やアイコンなど固定サイズの要素には flex-shrink: 0 を設定する。

min-width: auto

Flex アイテムのデフォルトの min-widthauto で、コンテンツの最小幅より小さくならない。長いテキストがはみ出す場合は min-width: 0 を設定する。

Flexbox の関連書籍も参考になる。

関連用語