2026年版 ToolShare Lab / Guide

Flexbox入門|基本プロパティと
実用レイアウトパターン

「横並びにしたい」「中央揃えできない」——CSSレイアウトの悩みをまるごと解決する。Flexboxの全プロパティを基礎から丁寧に整理し、ナビゲーション・カードレイアウト・ヘッダー・センタリングなど実務で即使える6つのパターンをコード付きで掲載した。レスポンシブ対応テクニックとFlexboxジェネレーターの活用法もカバーしている。

読了時間: 約12分 更新日: 2026年3月10日

Flexboxとは?CSS Gridとの使い分け

Flexbox(Flexible Box Layout)は、CSSで要素を柔軟に配置するためのレイアウトモジュールだ。2009年にW3Cで仕様化され、現在はすべての主要ブラウザで完全サポートされている。「子要素を横並びにしたい」「要素を縦横中央に配置したい」といった悩みをシンプルなプロパティで解決できる。

Flexboxの最大の特徴は1次元レイアウトであること。行(横方向)か列(縦方向)のどちらか一方向に要素を並べることに特化している。コンテナにひとつのプロパティを追加するだけで子要素が整列する、直感的な設計だ。

FlexboxとCSS Gridの使い分け

Flexboxと並ぶCSSレイアウト技術のCSS Gridは、2次元レイアウト(行と列の両方)を制御する。どちらを使うか迷ったときの判断基準は次のとおりだ。

用途 推奨 理由
ナビゲーションバー(横並び) Flexbox 1行の要素配置・間隔調整が得意
カードグリッド(複数行) CSS Grid 行列の2次元制御が必要
ヘッダー(ロゴ+メニュー) Flexbox 両端揃えや間隔調整がシンプル
ページ全体のレイアウト CSS Grid ヘッダー・サイドバー・フッターの2次元配置
要素の縦横中央揃え Flexbox justify-content + align-items で2行で解決
フォームのラベルと入力欄 Flexbox 同一行内の柔軟な幅調整が容易

Point

「コンテンツが主導する(コンテンツの量に応じてサイズが変わる)」ならFlexbox、「レイアウトが主導する(グリッド線に沿ってコンテンツを配置する)」ならCSS Gridが向いている。GitHubのヘッダーやStripeのナビゲーションバーを見ると、ロゴ+リンク群のような横並び構成にFlexboxが使われているのがわかる。実務では両者を組み合わせるのが一般的だ。

Flex Containerのプロパティ

Flexboxのプロパティは、Flex Container(親要素)に設定するものと、Flex Item(子要素)に設定するものに分かれる。まずはコンテナ側のプロパティから見ていく。

display: flex — Flexboxを有効化する

親要素に display: flex を設定するだけで、直接の子要素がすべてFlexboxの制御下に入る。子要素はデフォルトで横一列に並び、高さはコンテナの高さに合わせて伸びる。たったこれだけで横並びが実現できるのが、Flexboxの強みだ。

.container { display: flex; /* Flexboxを有効化 */ }

flex-direction — 並べる方向を指定する

子要素を並べる主軸の方向を設定する。デフォルトは row(横方向)だ。

.container { display: flex; flex-direction: row; /* 左から右(デフォルト) */ /* flex-direction: row-reverse; 右から左 */ /* flex-direction: column; 上から下 */ /* flex-direction: column-reverse; 下から上 */ }
並び順 主な用途
row(デフォルト) 左→右 ナビ、ボタン群、横並びリスト
row-reverse 右→左 逆順表示が必要な場合
column 上→下 縦並びのカード、サイドバーメニュー
column-reverse 下→上 チャットUI(最新メッセージを下に)

flex-wrap — 折り返しを制御する

子要素がコンテナの幅を超えた場合の折り返し動作を設定する。レスポンシブレイアウトでは flex-wrap: wrap が必須だ。

.container { display: flex; flex-wrap: nowrap; /* 折り返しなし(デフォルト)。はみ出す */ /* flex-wrap: wrap; 折り返しあり。次の行へ */ /* flex-wrap: wrap-reverse; 逆順で折り返す */ }

justify-content — 主軸方向の揃え方

主軸(flex-directionで設定した方向)に沿った子要素の配置を制御する。要素の間隔を均等にしたり両端に揃えたりするのに使う。

.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; 全ての間隔を均等に */ }

よく使うのはこの3つ

center(中央揃え)、space-between(両端揃えで均等配置)、flex-end(右寄せ)は実務で最もよく使う3つだ。GitHubのヘッダーのようにロゴとリンクを両端に置くには space-between が一番シンプルに決まる。

align-items — 交差軸方向の揃え方

主軸に対して垂直な方向(交差軸)での子要素の揃え方を設定する。縦の中央揃えに最もよく使われるプロパティだ。

.container { display: flex; align-items: stretch; /* 高さをコンテナに合わせる(デフォルト) */ /* align-items: flex-start; 上揃え */ /* align-items: flex-end; 下揃え */ /* align-items: center; 縦中央揃え */ /* align-items: baseline; テキストのベースラインで揃える */ }

align-content — 複数行の揃え方

flex-wrap: wrap で複数行になった場合の行間の揃え方を設定する。1行しかない場合は効果がない点に注意。

.container { display: flex; flex-wrap: wrap; align-content: flex-start; /* 上寄せ */ /* align-content: center; 縦中央 */ /* align-content: space-between; 上下端配置、行間均等 */ /* align-content: stretch; 行の高さをコンテナに合わせる(デフォルト) */ }

gap — 要素間の余白を一括設定

子要素同士の間隔をまとめて設定する。以前は grid-gap がGridのみの機能だったが、現在はFlexboxでも使える。margin を各要素に付けるより直感的でレスポンシブ対応も容易なので、積極的に使いたい。

.container { display: flex; gap: 16px; /* 行・列ともに16px */ /* gap: 8px 16px; 行間8px、列間16px */ /* row-gap: 8px; 行間のみ設定 */ /* column-gap: 16px; 列間のみ設定 */ }

Flex Itemのプロパティ

次は子要素(Flex Item)に設定するプロパティだ。各アイテムの伸び縮みや順序を細かく制御できる。

flex-grow — 余白を埋める伸び率

コンテナに余白がある場合に、子要素がどれだけ伸びるかを比率で設定する。デフォルトは 0(伸びない)だ。

.nav { display: flex; } .nav__logo { /* flex-grow: 0; デフォルト。伸びない */ } .nav__spacer { flex-grow: 1; /* 残りの余白を全て占有する */ } .nav__links { /* flex-grow: 0; デフォルト。伸びない */ }

flex-shrink — 縮む比率

コンテナが子要素の合計幅より小さい場合に、どれだけ縮むかを比率で設定する。デフォルトは 1(均等に縮む)だ。0 を設定すると縮まなくなる。サイドバーの固定幅を守りたいときに重宝する。

.sidebar { flex-shrink: 0; /* サイドバーは縮まない(固定幅を保つ) */ width: 240px; } .main-content { flex-grow: 1; /* メインコンテンツが残りを占める */ flex-shrink: 1; /* デフォルトのまま縮む */ }

flex-basis — 基準サイズの設定

flex-grow・flex-shrinkが適用される前の、子要素の基準サイズを設定する。width に似ているが、主軸方向に作用するため flex-direction が column の場合は高さとして機能する。

.item { flex-basis: auto; /* コンテンツのサイズ(デフォルト) */ /* flex-basis: 200px; 200pxを基準サイズとする */ /* flex-basis: 33.333%; コンテナの3分の1を基準サイズとする */ /* flex-basis: 0; コンテンツサイズを無視して flex-grow で分配 */ }

flex — grow・shrink・basisの短縮形

flex-growflex-shrinkflex-basis をまとめて記述できる短縮プロパティだ。実務ではこの短縮形を使うのが一般的で、可読性も上がる。

.item { flex: 1; /* flex: 1 1 0 と同じ。均等に伸縮 */ /* flex: auto; flex: 1 1 auto と同じ */ /* flex: none; flex: 0 0 auto と同じ。伸縮しない */ /* flex: 0 1 200px; grow=0, shrink=1, basis=200px */ }

order — 表示順序を変更する

HTMLの記述順を変えずに、表示順を変更できる。デフォルトはすべて 0 で、数値が小さいほど先に表示される。モバイルで画像を上に出したいときに活躍する。

.item-a { order: 2; } /* 3番目に表示 */ .item-b { order: 0; } /* 1番目に表示(デフォルト値) */ .item-c { order: 1; } /* 2番目に表示 */

align-self — 個別の縦揃えを上書き

コンテナの align-items を個別のアイテムで上書きする。特定の子要素だけ縦揃えを変えたい場合に使う。

.container { display: flex; align-items: center; /* 全体は縦中央揃え */ } .special-item { align-self: flex-end; /* この要素だけ下揃え */ }

実用レイアウトパターン6選

ここからは、実務で頻繁に登場する6つのレイアウトパターンをコード付きで紹介する。どれもコピー&ペーストで即使える。

パターン1:ナビゲーションバー(ロゴ+リンク群)

ロゴを左端、ナビリンクを右端に配置する定番パターン。GitHubのヘッダーやStripeのナビなどで見かける、あの構成だ。justify-content: space-betweenalign-items: center の組み合わせで実現できる。

/* HTML */ <header class="header"> <a href="/" class="header__logo">ロゴ</a> <nav class="header__nav"> <a href="/about/">About</a> <a href="/works/">Works</a> <a href="/contact/">Contact</a> </nav> </header> /* CSS */ .header { display: flex; justify-content: space-between; /* ロゴとナビを両端に */ align-items: center; /* 縦中央揃え */ padding: 0 24px; height: 64px; } .header__nav { display: flex; gap: 32px; /* リンク間の余白 */ }

パターン2:カードレイアウト(均等幅・折り返し)

サービス紹介やポートフォリオでよく使う、カードが均等幅で並ぶレイアウト。flex-wrap: wrapflex-basis で実装する。

/* CSS */ .cardList { display: flex; flex-wrap: wrap; gap: 24px; } .cardList__item { flex: 1 1 280px; /* 最低280px。余白は均等に伸びる */ /* または */ /* flex: 0 0 calc(33.333% - 16px); 常に3列 */ }

Point

flex: 1 1 280px は「最低280px幅を基準に、余白があれば均等に伸びる」という意味だ。ビューポート幅に応じて自動的に列数が変わるため、メディアクエリなしでレスポンシブになる。これが意外に便利。

パターン3:ヘッダーレイアウト(アイコン+テキスト)

アイコンとテキストを横に並べて縦中央揃えにする、ボタンやリストアイテムで頻出のパターン。

/* HTML */ <div class="listItem"> <svg class="listItem__icon" ...></svg> <div class="listItem__body"> <p class="listItem__title">タイトル</p> <p class="listItem__desc">説明文</p> </div> </div> /* CSS */ .listItem { display: flex; align-items: center; /* アイコンとテキストを縦中央に */ gap: 12px; } .listItem__icon { flex-shrink: 0; /* アイコンは縮まない */ width: 24px; height: 24px; } .listItem__body { flex: 1; /* テキストが残りの幅を占める */ }

パターン4:フッターレイアウト(複数カラム)

フッターによく見られる、会社情報・リンク集・SNSアイコンが横並びになるレイアウト。

/* CSS */ .footer__inner { display: flex; flex-wrap: wrap; gap: 40px; justify-content: space-between; } .footer__brand { flex: 0 0 240px; /* ブランドエリアは固定幅 */ } .footer__links { flex: 1 1 160px; /* リンク列は均等に伸縮 */ min-width: 160px; }

パターン5:サイドバーレイアウト(固定+可変)

サイドバーが固定幅で、メインコンテンツが残りの幅を占める定番の2カラムレイアウト。

/* CSS */ .layout { display: flex; gap: 32px; align-items: flex-start; /* サイドバーがコンテンツと同じ高さに伸びない */ } .layout__sidebar { flex: 0 0 260px; /* 伸縮なし、固定260px */ position: sticky; top: 24px; } .layout__main { flex: 1; /* 残りの幅を全て占める */ min-width: 0; /* overflow対策(重要!) */ }

注意: min-width: 0 を忘れずに

Flex Itemはデフォルトで min-width: auto が設定されており、コンテンツ幅より小さくなれない。メインコンテンツに長いURLや長い単語がある場合にはみ出すことがある。min-width: 0 を設定すれば解決できる。これを知らずに詰まる人が多いので覚えておこう。

パターン6:縦横センタリング(完全中央揃え)

CSSで長年難しかった「縦横完全中央揃え」が、Flexboxではたった3行で実現できる。ローディング画面、モーダル、エラー表示で活躍するパターンだ。

/* 親要素に設定するだけ */ .centeringContainer { display: flex; justify-content: center; /* 横中央 */ align-items: center; /* 縦中央 */ /* 縦方向の高さが必要 */ height: 100vh; /* ビューポート全体 */ /* または */ /* min-height: 400px; 最低高さを設定 */ }

ツールで試す

FlexboxのプロパティをGUIで試せるFlexboxジェネレーターを使えば、コードを書かずにリアルタイムで結果を確認できる。各プロパティの効果を視覚的に学ぶのに最適だ。

レスポンシブ対応テクニック

Flexboxはレスポンシブデザインと相性が抜群だ。いくつかのテクニックを組み合わせることで、メディアクエリの記述を最小限に抑えられる。

flex-wrap + min-width で自動折り返し

最もシンプルなレスポンシブ対応だ。子要素に flex-basismin-width を設定することで、コンテナ幅に応じて自動的に列数が変わる。

/* メディアクエリなしで2列→1列に自動変化 */ .cardList { display: flex; flex-wrap: wrap; gap: 20px; } .cardList__item { flex: 1 1 300px; /* 300pxを基準に自動調整 */ /* コンテナが620px以下になると1列になる */ }

flex-direction の切り替え

PCでは横並び、スマートフォンでは縦並びに切り替えるパターン。メディアクエリで flex-direction だけを変更すればいい。

/* PC: 横並び */ .section__inner { display: flex; gap: 40px; align-items: center; } /* スマートフォン: 縦並び */ @media (max-width: 767px) { .section__inner { flex-direction: column; } }

order でモバイルの表示順を変更

HTMLの記述順はSEOやアクセシビリティを考慮してPCレイアウト順に書きつつ、スマートフォンでは order で表示順を変更できる。

/* スマートフォンで画像を上・テキストを下に変更 */ @media (max-width: 767px) { .section__inner { flex-direction: column; } .section__image { order: -1; /* テキストより先に表示 */ } .section__text { order: 1; } }

gap を clamp() で可変にする

clamp() 関数と組み合わせることで、ビューポート幅に応じてスムーズにgapが変化する。

.cardList { display: flex; flex-wrap: wrap; /* ビューポート幅768pxで16px、1280pxで32px(線形補間) */ gap: clamp(16px, 2vw, 32px); }

Flexboxジェネレーターの使い方

FlexboxのプロパティはGUIで試すのが最も効率的な学習方法だ。ToolShare LabのFlexboxジェネレーターでは、すべてのプロパティをスライダーやセレクトボックスで操作し、リアルタイムで結果を確認できる。

  1. コンテナプロパティを設定

    flex-direction、flex-wrap、justify-content、align-items、align-content、gapをGUIで選択する。変更のたびにプレビューが即座に更新される。

  2. アイテム数を調整

    プレビューエリアのアイテム数を増減して、折り返しや伸縮の挙動を確認する。実際のコンテンツ量での見た目を把握できる。

  3. 個別アイテムのプロパティを設定

    特定のアイテムを選択してflex-grow、flex-shrink、flex-basis、order、align-selfを設定する。値の変化による影響が視覚的に理解できる。

  4. 生成されたCSSをコピー

    プロパティの組み合わせが決まったら、生成されたCSSコードをコピーして自分のプロジェクトに貼り付ける。コメント付きで出力されるので可読性も高い。

FlexboxとCSS Gridをジェネレーターで試す

プロパティの組み合わせをGUIで操作してリアルタイム確認。生成されたCSSコードをそのままコピーして使える。登録不要・完全無料。

よくある質問

FlexboxとCSS Gridはどちらを使うべきですか?
用途によって使い分けるのがベスト。ナビゲーション・ボタン群・アイコン+テキストのような1次元配置にはFlexbox、複数行・複数列のカードグリッドやページ全体のレイアウトのような2次元配置にはCSS Gridが向いている。実務では両者を組み合わせるのが一般的で、どちらかを選ぶ必要はない。
flex: 1 の意味を教えてください
flex: 1flex: 1 1 0 の短縮形で、「flex-grow=1(均等に伸びる)、flex-shrink=1(均等に縮む)、flex-basis=0(基準サイズはゼロ)」を意味する。複数の子要素に flex: 1 を設定すると、コンテナの幅を均等に分割できる。よく似た flex: auto(= flex: 1 1 auto)との違いは flex-basis だ。flex: 1 はコンテンツサイズを無視して均等分割、flex: auto はコンテンツサイズを考慮した上で均等分割になる。
flex-basis と width の違いは何ですか?
flex-basis はFlexboxの主軸方向の基準サイズを設定する。flex-direction: row(横並び)の場合はwidthと同じ意味になるが、flex-direction: column(縦並び)の場合はheightとして機能する。また、flex-basis は flex-grow・flex-shrink の計算に使われる「出発点」として扱われるため、width より優先される(flex-basis: auto 以外の値が設定されている場合)。Flexboxのコンテキストでは flex-basis を使うのが推奨だ。
Flexboxで縦中央揃えができません。原因は?
最もよくある原因は「親要素に高さが設定されていない」ことだ。align-items: center は親要素の高さを基準に中央揃えするため、親要素の高さがコンテンツと同じ場合は効果がわからない。height: 100vhmin-height: 400px などで高さを明示してから試してみよう。それでも解決しない場合は、display: flex が正しく親要素に設定されているか確認する。
Flexboxはすべてのブラウザで使えますか?
2026年時点でFlexboxはすべての主要ブラウザ(Chrome、Firefox、Safari、Edge)で完全サポートされている。caniuse.comによるとグローバルのブラウザシェアの99%以上でサポートされており、事実上ブラウザ差を気にせず使える。IE11のサポートが不要であれば、すべてのFlexboxプロパティを制限なく使えるのでベンダープレフィックスも不要だ。
Flexboxで等幅の3カラムを作るにはどうすればいいですか?
いくつか方法がある。最もシンプルなのは各アイテムに flex: 1 を設定する方法だ。ただしアイテム数が3の倍数でない場合、最後の行で均等にならないことがある。ピッタリ3カラムを維持したい場合は flex: 0 0 calc(33.333% - gap * 2 / 3) のように gap を考慮した計算を使うか、CSS Gridの grid-template-columns: repeat(3, 1fr) の方がシンプルで確実だ。3カラム固定レイアウトにはCSS Gridの方が向いている。