web制作のポイント

Flexboxパターン・レイアウト集|よく使う配置からサイト構成まで

更新日:2026-05-15 著者:unigram 読了目安:13分

この記事の要点

Flexboxのよく使うパターンとサイトレイアウトを、プレビュー+HTML/CSSタブ付きコードでまとめたリファレンス記事です。横並び・中央揃え・両端揃え・折り返し・サイドバー・レスポンシブ対応まで網羅しています。

「Flexboxって言葉は聞いたことあるけど、どう使い分ければいいのかよくわからない」という方も多いと思います。

この記事では、実際のWeb制作でよく使うFlexboxのパターンをプレビュー+コード付きでまとめました。HTMLタブとCSSタブで切り替えながら確認でき、copyボタンでそのままコピーして使えます。

この記事でわかること

  • Flexboxの基本パターン(横並び・中央揃え・両端揃えなど)
  • 折り返し・カードグリッドの作り方
  • サイドバー付きレイアウトの組み方
  • レスポンシブ対応(PC→スマホ切り替え)の方法

Flexboxとは?

Flexbox(フレックスボックス)とは、CSSで要素を横・縦に並べるためのレイアウト手法です。親要素に display: flex を指定するだけで、子要素を自由に並べることができます。

Flexboxには「親要素(コンテナ)」と「子要素(アイテム)」という概念があり、親に指定したプロパティが子の並び方を決めます。

用語 説明
Flexコンテナ display: flex を指定した親要素
Flexアイテム Flexコンテナの直接の子要素
主軸(main axis) アイテムが並ぶ方向。デフォルトは横方向(左→右)
交差軸(cross axis) 主軸と垂直な方向。デフォルトは縦方向(上→下)

 


基本パターン編

01

横並び(基本)

子要素を横一列に並べる最もシンプルなパターン。display: flex を指定するだけで子要素が横に並ぶ。デフォルトは左揃え・上揃え。

display: flexgap: 8px
Preview
アイテム 1
アイテム 2
アイテム 3
HTMLCSS
index.htmlcopy
<div class="container">
  <div>アイテム 1</div>
  <div>アイテム 2</div>
  <div>アイテム 3</div>
</div>
style.csscopy
.container {
  display: flex;  /* 子要素を横並びにする(Flexboxを有効化) */
  gap: 8px;    /* 子要素どうしの隙間を8pxに設定 */
}
01+

均等横並び

子要素を親要素の幅に合わせて均等に広げるパターン。子要素に flex: 1 を指定する。

display: flexgap: 8pxflex: 1(子)
Preview
アイテム 1
アイテム 2
HTMLCSS
index.htmlcopy
<div class="container">
  <div class="item">アイテム 1</div>
  <div class="item">アイテム 2</div>
</div>
style.csscopy
.container {
  display: flex;
  gap: 8px;
}
.item {
  flex: 1;  /* アイテム数に関わらず均等な幅にする */
}
02

完全中央揃え

水平・垂直ともに中央に配置するパターン。モーダルやバナーのコンテンツ配置に使う。height の指定が必須。

justify-content: centeralign-items: center
Preview
中央に配置
HTMLCSS
index.htmlcopy
<div class="container">
  <div>中央に配置</div>
</div>
style.csscopy
.container {
  display: flex;
  justify-content: center;  /* 主軸(横方向)の中央に揃える */
  align-items: center;    /* 交差軸(縦方向)の中央に揃える */
  height: 100vh;          /* ※縦中央には高さが必要 */
}
03

両端揃え(ヘッダーに使える)

ヘッダーのロゴとナビを両端に配置するパターン。最初と最後の要素が端に配置され、間が均等に空く。

justify-content: space-betweenalign-items: center
Preview
ロゴ
メニュー
ヘルプ
ログイン
HTMLCSS
index.htmlcopy
<header class="header">
  <a class="logo">ロゴ</a>
  <nav class="nav">
    <a>メニュー</a>
    <a>ヘルプ</a>
    <a>ログイン</a>
  </nav>
</header>
style.csscopy
.header {
  display: flex;
  justify-content: space-between;  /* 最初と最後を両端に配置 */
  align-items: center;           /* 縦方向を中央に揃える */
}
.nav {
  display: flex;  /* nav内のリンクも横並びにする */
  gap: 8px;
}
04

残りスペースを埋める(検索バー)

検索バーのアイコンとボタンは固定サイズに、入力欄だけ親いっぱいに伸ばすパターン。flex: 1flex-grow: 1 の短縮形。

flex: 1(子・中央)flex-shrink: 0(子・両端)
Preview
🔍
↔ flex: 1 で残りを占有
検索
HTMLCSS
index.htmlcopy
<div class="search-bar">
  <span class="icon">🔍</span>
  <input class="input" type="text" placeholder="検索..." />
  <button class="btn">検索</button>
</div>
style.csscopy
.search-bar {
  display: flex;
  gap: 8px;
  align-items: center;
}
.icon, .btn {
  flex-shrink: 0;  /* 縮まないよう固定 */
}
.input {
  flex: 1;  /* 残りのスペースをすべて占有する */
}

折り返し・グリッド編

05

折り返し(flex-wrap)

親の幅に収まらないアイテムを自動で次の行に折り返す。タグ一覧・ボタングループ・カード一覧に最適。折り返しても幅は固定のまま。

flex-wrap: wrapgap: 10px
Preview
カード A
カード B
カード C
カード D
カード E
カード F
HTMLCSS
index.htmlcopy
<div class="cards">
  <div class="card">カード A</div>
  <div class="card">カード B</div>
  <!-- ...続く -->
</div>
style.csscopy
.cards {
  display: flex;
  flex-wrap: wrap;  /* 収まらない場合に次の行へ折り返す */
  gap: 10px;
}
.card {
  width: 120px;  /* 幅を固定(折り返しても変わらない) */
}
05+

calc() で列数を固定する折り返し

親幅が変わっても常に3列を維持するパターン。calc((100% - gap × 2) / 3) で隙間分を引いてから3等分する。

flex-wrap: wrapwidth: calc((100% – gap×2) / 3)(子)box-sizing: border-box
Preview
カード A
カード B
カード C
カード D
カード E
カード F
HTMLCSS
index.htmlcopy
<ul class="flex-grid">
  <li>カード A</li>
  <li>カード B</li>
  <!-- ...続く -->
</ul>
style.csscopy
.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を幅の内側に含める */
}
06

均等折り返し(flex: 1 1 基準幅)

親幅が変わっても各行のアイテムが均等に広がるパターン。flex: 1 1 120px は「最小幅120pxで伸縮OK」の意味。カードグリッドに最適。

flex-wrap: wrapflex: 1 1 120px(子)
Preview
カード A
カード B
カード C
カード D
カード E
HTMLCSS
index.htmlcopy
<div class="grid">
  <div class="card">カード A</div>
  <!-- ...続く -->
</div>
style.csscopy
.grid {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
}
.card {
  flex: 1 1 120px;
  /* flex-grow: 1   → 余ったスペースを均等に広がる */
  /* flex-shrink: 1 → スペース不足なら均等に縮む */
  /* flex-basis: 120px → 基準幅。これ以下になると折り返す */
}

縦並び・揃え編

07

縦並び(flex-direction: column)

主軸を縦方向に変えるパターン。フォームのラベル+入力欄やサイドバーのナビゲーションに使う。

flex-direction: columngap: 4px
Preview
// メインコンテンツ
HTMLCSS
index.htmlcopy
<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>
style.csscopy
.sidebar {
  display: flex;
  flex-direction: column;  /* 並ぶ方向を縦(上から下)に変更 */
  gap: 4px;
}
08

同じ高さに揃える

テキスト量が異なるカードを自動で同じ高さに揃える。align-items: stretch はデフォルト値なので省略可能。

align-items: stretch(デフォルト)flex: 1(子)
Preview
短い
テキストが
長いカード
短い
少し
長め
HTMLCSS
index.htmlcopy
<div class="cards">
  <div class="card">短い</div>
  <div class="card">テキストが長いカード</div>
  <div class="card">短い</div>
</div>
style.csscopy
.cards {
  display: flex;
  gap: 10px;
  /* align-items のデフォルト値は stretch */
  /* stretch = 子要素を親の高さいっぱいに引き伸ばす */
}
.card {
  flex: 1;  /* 残りスペースを均等に分け合う */
}
09

margin: auto で端に押し出す

特定の要素を右端に寄せたいとき、margin-left: auto が余白を吸収して右端に押し出す。縦方向(margin-top: auto)にも応用可能。

margin-left: auto(子)
Preview
ホーム
ドキュメント
ブログ
+ 新規作成
↑「+ 新規作成」に margin-left: auto を指定
HTMLCSS
index.htmlcopy
<div class="toolbar">
  <a>ホーム</a>
  <a>ドキュメント</a>
  <a>ブログ</a>
  <button class="push-right">
    + 新規作成
  </button>
</div>
style.csscopy
.toolbar {
  display: flex;
  align-items: center;
  gap: 8px;
}
.push-right {
  margin-left: auto;  /* 左の余白を最大化して右端へ押し出す */
}

サイトレイアウト編

L-01

ヘッダー+サイドバー+フッター(全体構成)

Webサイトの基本的な全体構成。body を縦方向のFlexコンテナにして、内部を入れ子にしてサイドバーとメインを横並びにする。

flex-direction: column(body)flex: 1(.body-wrap)width固定(sidebar)flex: 1(main)
Preview

通知設定
📊 概要
📁 記事
⚙️ 設定
メインコンテンツ
ウィジェット A
ウィジェット B
HTMLCSS
index.htmlcopy
<body>
  <header>ヘッダー</header>
  <div class="body-wrap">
    <nav class="sidebar">ナビ</nav>
    <main>メインコンテンツ</main>
  </div>
  <footer>フッター</footer>
</body>
style.csscopy
body {
  display: flex;
  flex-direction: column;  /* ヘッダー・本体・フッターを縦に並べる */
  min-height: 100vh;       /* 最低でも画面全体の高さを確保 */
}
.body-wrap {
  display: flex;  /* サイドバーとメインを横並びにする */
  flex: 1;        /* 縦の残りスペースをすべて占有する */
}
.sidebar {
  width: 200px;
  flex-shrink: 0;  /* 縮まないよう固定 */
}
main {
  flex: 1;  /* 残りスペースをすべて占有 */
}
L-02

メインコンテンツ+右サイドバー(ブログ向け)

ブログやニュースサイトでよく見るレイアウト。メインを HTML の先頭に書くことで SEO・アクセシビリティ上も有利。右サイドバーは幅を固定する。

flex: 1(main)flex: 0 0 220px(aside)align-items: flex-start
Preview
記事タイトル
記事本文エリア。メインが HTML 上で先にくるため SEO に有利。
前の記事 ← → 次の記事

📌 カテゴリ

  • CSS
  • HTML
  • JS
HTMLCSS
index.htmlcopy
<div class="body-wrap">
  <main>
    <article>記事本文</article>
  </main>
  <!-- aside は HTML 上は後ろに書く -->
  <aside class="sidebar">
    サイドウィジェット
  </aside>
</div>
style.csscopy
.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に固定 */
}
L-03

三カラム(Holy Grailレイアウト)

左ナビ・中央コンテンツ・右ウィジェットの三列構成。両サイドバーを固定幅にして中央だけ伸縮させる古典的なレイアウト。

flex: 0 0 160px(左ナビ)flex: 1(main)flex: 0 0 180px(右aside)
Preview
🏠 ホーム
📰 ニュース
🎵 音楽
メインコンテンツ
左右のサイドバーが固定幅のため、ここだけが伸縮する。

📢 広告

  • お知らせ
  • 新着
HTMLCSS
index.htmlcopy
<div class="body-wrap">
  <nav class="nav-left">ナビ</nav>
  <main>メインコンテンツ</main>
  <aside class="aside-right">ウィジェット</aside>
</div>
style.csscopy
.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に固定 */
}
L-04

レスポンシブ:横→縦への切り替え(2パターン)

PCでは横並び、スマートフォンでは縦積みに切り替えるモバイル対応の基本パターン。方法は2つあり、用途で使い分けられる。

display: flex / gap(PC)flex-direction: column(方法A・SP)display: block(方法B・SP)@media (max-width: 768px)
Preview
🖥 PC — display: flex(横並び)
セクション A
セクション B
セクション C
方法 A — flex-direction: column
セクション A
セクション B
セクション C
✓ gap がそのまま使える
方法 B — display: block
セクション A
セクション B
セクション C
✓ シンプル △ gap → margin 変更必要
HTMLCSSCSS — 方法B
index.htmlcopy
<div class="sections">
  <section>セクション A</section>
  <section>セクション B</section>
  <section>セクション C</section>
</div>
style.csscopy
/* PC:横並び */
.sections {
  display: flex;
  gap: 24px;
}
section {
  flex: 1;
}

/* スマホ:縦積み(flex のまま方向だけ変える) */
@media (max-width: 768px) {
  .sections {
    flex-direction: column;  /* 縦方向に変えるだけで縦積みになる */
    /* gap はそのまま縦の隙間として使える ✓ */
  }
}
style.css — 方法B(display: block)copy
/* 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 で組む
  • レスポンシブは @mediaflex-directiondisplay を切り替える

Flexboxをマスターすると、CSSのレイアウト作業が格段にスムーズになります。まずはよく使うパターンを1つずつ試してみてください。

 

この記事を書いた人

unigram
web、印刷、映像などの制作をしています。@京都、フリーランス18年目。 大学で講師もしています。 自身の備忘録も兼ねて、Web制作・WordPress・SEO・GA4・生成AI活用をテーマに情報発信しています。わかりやすく優しい内容で記事作成を心がけています。