「Flexboxって言葉は聞いたことあるけど、どう使い分ければいいのかよくわからない」という方も多いと思います。
この記事では、実際のWeb制作でよく使うFlexboxのパターンをプレビュー+コード付きでまとめました。HTMLタブとCSSタブで切り替えながら確認でき、copyボタンでそのままコピーして使えます。
この記事でわかること
- Flexboxの基本パターン(横並び・中央揃え・両端揃えなど)
- 折り返し・カードグリッドの作り方
- サイドバー付きレイアウトの組み方
- レスポンシブ対応(PC→スマホ切り替え)の方法
Flexboxとは?
Flexbox(フレックスボックス)とは、CSSで要素を横・縦に並べるためのレイアウト手法です。親要素に display: flex を指定するだけで、子要素を自由に並べることができます。
Flexboxには「親要素(コンテナ)」と「子要素(アイテム)」という概念があり、親に指定したプロパティが子の並び方を決めます。
| 用語 | 説明 |
|---|---|
| Flexコンテナ | display: flex を指定した親要素 |
| Flexアイテム | Flexコンテナの直接の子要素 |
| 主軸(main axis) | アイテムが並ぶ方向。デフォルトは横方向(左→右) |
| 交差軸(cross axis) | 主軸と垂直な方向。デフォルトは縦方向(上→下) |
基本パターン編
横並び(基本)
子要素を横一列に並べる最もシンプルなパターン。display: flex を指定するだけで子要素が横に並ぶ。デフォルトは左揃え・上揃え。
<div class="container"> <div>アイテム 1</div> <div>アイテム 2</div> <div>アイテム 3</div> </div>
.container { display: flex; /* 子要素を横並びにする(Flexboxを有効化) */ gap: 8px; /* 子要素どうしの隙間を8pxに設定 */ }
均等横並び
子要素を親要素の幅に合わせて均等に広げるパターン。子要素に flex: 1 を指定する。
<div class="container"> <div class="item">アイテム 1</div> <div class="item">アイテム 2</div> </div>
.container { display: flex; gap: 8px; } .item { flex: 1; /* アイテム数に関わらず均等な幅にする */ }
完全中央揃え
水平・垂直ともに中央に配置するパターン。モーダルやバナーのコンテンツ配置に使う。height の指定が必須。
<div class="container"> <div>中央に配置</div> </div>
.container { display: flex; justify-content: center; /* 主軸(横方向)の中央に揃える */ align-items: center; /* 交差軸(縦方向)の中央に揃える */ height: 100vh; /* ※縦中央には高さが必要 */ }
両端揃え(ヘッダーに使える)
ヘッダーのロゴとナビを両端に配置するパターン。最初と最後の要素が端に配置され、間が均等に空く。
<header class="header"> <a class="logo">ロゴ</a> <nav class="nav"> <a>メニュー</a> <a>ヘルプ</a> <a>ログイン</a> </nav> </header>
.header { display: flex; justify-content: space-between; /* 最初と最後を両端に配置 */ align-items: center; /* 縦方向を中央に揃える */ } .nav { display: flex; /* nav内のリンクも横並びにする */ gap: 8px; }
残りスペースを埋める(検索バー)
検索バーのアイコンとボタンは固定サイズに、入力欄だけ親いっぱいに伸ばすパターン。flex: 1 は flex-grow: 1 の短縮形。
<div class="search-bar"> <span class="icon">🔍</span> <input class="input" type="text" placeholder="検索..." /> <button class="btn">検索</button> </div>
.search-bar { display: flex; gap: 8px; align-items: center; } .icon, .btn { flex-shrink: 0; /* 縮まないよう固定 */ } .input { flex: 1; /* 残りのスペースをすべて占有する */ }
折り返し・グリッド編
折り返し(flex-wrap)
親の幅に収まらないアイテムを自動で次の行に折り返す。タグ一覧・ボタングループ・カード一覧に最適。折り返しても幅は固定のまま。
<div class="cards"> <div class="card">カード A</div> <div class="card">カード B</div> <!-- ...続く --> </div>
.cards { display: flex; flex-wrap: wrap; /* 収まらない場合に次の行へ折り返す */ gap: 10px; } .card { width: 120px; /* 幅を固定(折り返しても変わらない) */ }
calc() で列数を固定する折り返し
親幅が変わっても常に3列を維持するパターン。calc((100% - gap × 2) / 3) で隙間分を引いてから3等分する。
<ul class="flex-grid"> <li>カード A</li> <li>カード B</li> <!-- ...続く --> </ul>
.flex-grid { display: flex; flex-wrap: wrap; gap: 12px; width: 100%; list-style: none; padding: 0; } .flex-grid li { /* 計算式: (親幅100% - gap 12px × 2) ÷ 3 */ width: calc((100% - 24px) / 3); box-sizing: border-box; /* paddingを幅の内側に含める */ }
均等折り返し(flex: 1 1 基準幅)
親幅が変わっても各行のアイテムが均等に広がるパターン。flex: 1 1 120px は「最小幅120pxで伸縮OK」の意味。カードグリッドに最適。
<div class="grid"> <div class="card">カード A</div> <!-- ...続く --> </div>
.grid { display: flex; flex-wrap: wrap; gap: 10px; } .card { flex: 1 1 120px; /* flex-grow: 1 → 余ったスペースを均等に広がる */ /* flex-shrink: 1 → スペース不足なら均等に縮む */ /* flex-basis: 120px → 基準幅。これ以下になると折り返す */ }
縦並び・揃え編
縦並び(flex-direction: column)
主軸を縦方向に変えるパターン。フォームのラベル+入力欄やサイドバーのナビゲーションに使う。
<nav class="sidebar"> <a class="nav-item active">ダッシュボード</a> <a class="nav-item">プロジェクト</a> <a class="nav-item">チーム</a> <a class="nav-item">設定</a> </nav>
.sidebar { display: flex; flex-direction: column; /* 並ぶ方向を縦(上から下)に変更 */ gap: 4px; }
同じ高さに揃える
テキスト量が異なるカードを自動で同じ高さに揃える。align-items: stretch はデフォルト値なので省略可能。
長いカード
長め
<div class="cards"> <div class="card">短い</div> <div class="card">テキストが長いカード</div> <div class="card">短い</div> </div>
.cards { display: flex; gap: 10px; /* align-items のデフォルト値は stretch */ /* stretch = 子要素を親の高さいっぱいに引き伸ばす */ } .card { flex: 1; /* 残りスペースを均等に分け合う */ }
margin: auto で端に押し出す
特定の要素を右端に寄せたいとき、margin-left: auto が余白を吸収して右端に押し出す。縦方向(margin-top: auto)にも応用可能。
<div class="toolbar"> <a>ホーム</a> <a>ドキュメント</a> <a>ブログ</a> <button class="push-right"> + 新規作成 </button> </div>
.toolbar { display: flex; align-items: center; gap: 8px; } .push-right { margin-left: auto; /* 左の余白を最大化して右端へ押し出す */ }
サイトレイアウト編
ヘッダー+サイドバー+フッター(全体構成)
Webサイトの基本的な全体構成。body を縦方向のFlexコンテナにして、内部を入れ子にしてサイドバーとメインを横並びにする。
<body> <header>ヘッダー</header> <div class="body-wrap"> <nav class="sidebar">ナビ</nav> <main>メインコンテンツ</main> </div> <footer>フッター</footer> </body>
body { display: flex; flex-direction: column; /* ヘッダー・本体・フッターを縦に並べる */ min-height: 100vh; /* 最低でも画面全体の高さを確保 */ } .body-wrap { display: flex; /* サイドバーとメインを横並びにする */ flex: 1; /* 縦の残りスペースをすべて占有する */ } .sidebar { width: 200px; flex-shrink: 0; /* 縮まないよう固定 */ } main { flex: 1; /* 残りスペースをすべて占有 */ }
メインコンテンツ+右サイドバー(ブログ向け)
ブログやニュースサイトでよく見るレイアウト。メインを HTML の先頭に書くことで SEO・アクセシビリティ上も有利。右サイドバーは幅を固定する。
<div class="body-wrap"> <main> <article>記事本文</article> </main> <!-- aside は HTML 上は後ろに書く --> <aside class="sidebar"> サイドウィジェット </aside> </div>
.body-wrap { display: flex; gap: 24px; align-items: flex-start; /* 上揃え(stretchだとサイドバーも伸びる) */ } main { flex: 1; min-width: 0; /* 長いURLなどのはみ出し防止 */ } .sidebar { flex: 0 0 220px; /* grow: 0 → 広がらない */ /* shrink: 0 → 縮まない */ /* basis: 220px → 幅を220pxに固定 */ }
三カラム(Holy Grailレイアウト)
左ナビ・中央コンテンツ・右ウィジェットの三列構成。両サイドバーを固定幅にして中央だけ伸縮させる古典的なレイアウト。
<div class="body-wrap"> <nav class="nav-left">ナビ</nav> <main>メインコンテンツ</main> <aside class="aside-right">ウィジェット</aside> </div>
.body-wrap { display: flex; gap: 16px; } .nav-left { flex: 0 0 160px; /* 幅を160pxに固定 */ } main { flex: 1; /* 残りスペースをすべて占有して伸縮 */ min-width: 0; } .aside-right { flex: 0 0 180px; /* 幅を180pxに固定 */ }
レスポンシブ:横→縦への切り替え(2パターン)
PCでは横並び、スマートフォンでは縦積みに切り替えるモバイル対応の基本パターン。方法は2つあり、用途で使い分けられる。
<div class="sections"> <section>セクション A</section> <section>セクション B</section> <section>セクション C</section> </div>
/* PC:横並び */ .sections { display: flex; gap: 24px; } section { flex: 1; } /* スマホ:縦積み(flex のまま方向だけ変える) */ @media (max-width: 768px) { .sections { flex-direction: column; /* 縦方向に変えるだけで縦積みになる */ /* gap はそのまま縦の隙間として使える ✓ */ } }
/* PC:横並び(方法Aと同じ) */ .sections { display: flex; gap: 24px; } /* スマホ:縦積み(block に戻してシンプルに) */ @media (max-width: 768px) { .sections { display: block; /* Flexboxをやめて縦積みに */ } section { margin-bottom: 24px; /* gap の代わりに margin で隙間を作る */ } section:last-child { margin-bottom: 0; } }
まとめ
- 基本は
display: flex+gapの組み合わせ - 揃え方は
justify-content(横)とalign-items(縦)で制御する - 折り返しは
flex-wrap: wrap、縦並びはflex-direction: column - サイドバーは
flex: 0 0 固定幅px、メインはflex: 1で組む - レスポンシブは
@mediaでflex-directionかdisplayを切り替える
Flexboxをマスターすると、CSSのレイアウト作業が格段にスムーズになります。まずはよく使うパターンを1つずつ試してみてください。