CSS Flexboxは、モダンWeb開発で最も広く使用されているレイアウトシステムです。要素の整列、配置、並べ替えを強力かつ効率的に行えます。この完全なCSS Flexboxチートシートは、すべてのプロパティを実践的なコード例で解説します。
Flexboxジェネレーターでレイアウトをビジュアルに構築 →
コンテナプロパティ
Flexboxはフレックスコンテナから始まります。親要素にdisplay: flexを設定します。
display: flex | inline-flex
フレックスコンテナを定義します。
.flex-container {
display: flex; /* block-level flex container */
}
.inline-flex-container {
display: inline-flex; /* inline-level flex container */
}flex-direction
主軸の方向を設定します。
.container {
/* Main axis: left to right (default) */
flex-direction: row;
/* Main axis: right to left */
flex-direction: row-reverse;
/* Main axis: top to bottom */
flex-direction: column;
/* Main axis: bottom to top */
flex-direction: column-reverse;
}| Value | Main Axis | Visual Layout |
|---|---|---|
row | Horizontal (left to right) | [1] [2] [3] |
row-reverse | Horizontal (right to left) | [3] [2] [1] |
column | Vertical (top to bottom) | [1] / [2] / [3] |
column-reverse | Vertical (bottom to top) | [3] / [2] / [1] |
justify-content
主軸に沿った要素の配置を制御します。
.container {
display: flex;
/* Pack items to the start (default) */
justify-content: flex-start;
/* Result: [1][2][3] */
/* Center items */
justify-content: center;
/* Result: [1][2][3] */
/* Pack items to the end */
justify-content: flex-end;
/* Result: [1][2][3] */
/* Equal space between items */
justify-content: space-between;
/* Result: [1] [2] [3] */
/* Equal space around items */
justify-content: space-around;
/* Result: [1] [2] [3] */
/* Equal space between and around items */
justify-content: space-evenly;
/* Result: [1] [2] [3] */
}align-items
交差軸に沿った要素の整列を制御します。
.container {
display: flex;
height: 200px;
/* Stretch to fill container (default) */
align-items: stretch;
/* Align to the top */
align-items: flex-start;
/* Align to the center */
align-items: center;
/* Align to the bottom */
align-items: flex-end;
/* Align by text baseline */
align-items: baseline;
}| Value | Behavior |
|---|---|
stretch | Items stretch to fill the container height (default) |
flex-start | Items align to the top of the container |
center | Items are vertically centered |
flex-end | Items align to the bottom of the container |
baseline | Items align by their text baseline |
flex-wrap
要素の折り返しを制御します。
.container {
display: flex;
/* All items on one line (default) — may overflow */
flex-wrap: nowrap;
/* Items wrap to next line when needed */
flex-wrap: wrap;
/* Items wrap in reverse order */
flex-wrap: wrap-reverse;
}
/* Shorthand: flex-flow combines direction + wrap */
.container {
flex-flow: row wrap; /* same as flex-direction: row + flex-wrap: wrap */
flex-flow: column nowrap; /* column direction, no wrapping */
}align-content
複数行の場合の行間スペースを制御します。
.container {
display: flex;
flex-wrap: wrap;
height: 400px;
/* Pack lines to the start */
align-content: flex-start;
/* Center lines */
align-content: center;
/* Pack lines to the end */
align-content: flex-end;
/* Equal space between lines */
align-content: space-between;
/* Equal space around lines */
align-content: space-around;
/* Lines stretch to fill container (default) */
align-content: stretch;
}gap, row-gap, column-gap
フレックス要素間のスペースを制御します。
.container {
display: flex;
flex-wrap: wrap;
/* Equal gap in both directions */
gap: 16px;
/* Different row and column gaps */
gap: 20px 12px; /* row-gap: 20px, column-gap: 12px */
/* Individual properties */
row-gap: 20px;
column-gap: 12px;
}
/* Example: card grid with gap */
.card-grid {
display: flex;
flex-wrap: wrap;
gap: 24px;
}
.card-grid > .card {
flex: 1 1 300px; /* grow, shrink, min 300px */
}アイテムプロパティ
これらのプロパティは個々のフレックスアイテムに設定します。
order
視覚的な順序を制御します。デフォルトは0。
.item-a { order: 2; } /* appears third */
.item-b { order: -1; } /* appears first */
.item-c { order: 0; } /* appears second (default) */
/* Visual result: [B] [C] [A]
DOM order: A B C
Sorted order: -1 0 2 */flex-grow
要素の拡大比率を定義します。デフォルトは0。
/* All items same size — share space equally */
.item { flex-grow: 1; }
/* Item B takes twice the extra space */
.item-a { flex-grow: 1; }
.item-b { flex-grow: 2; }
.item-c { flex-grow: 1; }
/* If 200px extra: A gets 50px, B gets 100px, C gets 50px */
/* Only item B grows to fill remaining space */
.item-a { flex-grow: 0; width: 100px; }
.item-b { flex-grow: 1; }
.item-c { flex-grow: 0; width: 100px; }
/* Result: [100px][ fill ][100px] */flex-shrink
要素の縮小比率を定義します。デフォルトは1。
/* Default: all items shrink equally */
.item { flex-shrink: 1; }
/* Prevent an item from shrinking */
.sidebar {
flex-shrink: 0;
width: 250px; /* stays at 250px even when container is small */
}
/* Item A shrinks twice as fast */
.item-a { flex-shrink: 2; width: 300px; }
.item-b { flex-shrink: 1; width: 300px; }
/* If 100px must be removed: A loses ~67px, B loses ~33px */flex-basis
スペース配分前の初期サイズを設定します。
.item {
/* Use item's content size (default) */
flex-basis: auto;
/* Fixed starting size */
flex-basis: 200px;
/* Percentage of container */
flex-basis: 25%;
/* Use content's intrinsic size */
flex-basis: content;
/* Zero basis — ignore content size for space distribution */
flex-basis: 0;
}
/* flex-basis vs width:
- flex-basis sets the initial size BEFORE grow/shrink
- width sets a fixed size
- flex-basis is relative to the main axis
- If both are set, flex-basis wins */flex(ショートハンド)
flex-grow、flex-shrink、flex-basisのショートハンド。
/* flex: <grow> <shrink> <basis> */
.item { flex: 0 1 auto; } /* default: don't grow, can shrink, auto basis */
.item { flex: 1; } /* same as flex: 1 1 0% — grow equally */
.item { flex: auto; } /* same as flex: 1 1 auto — grow based on content */
.item { flex: none; } /* same as flex: 0 0 auto — fully inflexible */
.item { flex: 2; } /* same as flex: 2 1 0% — grows 2x */
.item { flex: 1 0 300px; } /* grow, don't shrink, start at 300px */| Shorthand | Equivalent | Use Case |
|---|---|---|
flex: 1 | flex: 1 1 0% | Equal-width items |
flex: auto | flex: 1 1 auto | Items size by content then share space |
flex: none | flex: 0 0 auto | Fixed-size item (no grow or shrink) |
flex: 0 1 auto | default | Default behavior |
flex: 1 0 300px | grow from 300px, never shrink | Responsive card with min-width |
align-self
コンテナのalign-itemsを個別に上書きします。
.container {
display: flex;
align-items: flex-start; /* all items at top */
height: 200px;
}
.special-item {
align-self: center; /* this item centered vertically */
}
/* Values: auto | flex-start | flex-end | center | baseline | stretch */
.item-a { align-self: flex-start; } /* top */
.item-b { align-self: center; } /* middle */
.item-c { align-self: flex-end; } /* bottom */
.item-d { align-self: stretch; } /* full height */一般的なレイアウトパターン
実際のプロジェクトで最もよく使われるFlexboxレイアウトパターン。
要素のセンタリング
Flexboxでセンタリングが簡単に。
/* Horizontal centering */
.center-horizontal {
display: flex;
justify-content: center;
}
/* Vertical centering */
.center-vertical {
display: flex;
align-items: center;
height: 100vh;
}
/* Perfect centering (both axes) */
.center-both {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
/* Alternative: center with margin auto */
.center-auto {
display: flex;
height: 100vh;
}
.center-auto > .child {
margin: auto; /* centers in both axes */
}ナビゲーションバー
クラシックなレスポンシブナビバー。
/* Basic navbar: logo left, links right */
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 24px;
height: 64px;
}
.navbar .logo {
flex-shrink: 0;
}
.navbar .nav-links {
display: flex;
gap: 24px;
list-style: none;
}
/* Navbar with center section */
.navbar-3 {
display: flex;
align-items: center;
padding: 0 24px;
}
.navbar-3 .left { flex: 1; }
.navbar-3 .center { flex: 0; white-space: nowrap; }
.navbar-3 .right { flex: 1; display: flex; justify-content: flex-end; }カードグリッド
折り返し付きのレスポンシブカードレイアウト。
/* Responsive card grid */
.card-grid {
display: flex;
flex-wrap: wrap;
gap: 24px;
}
.card {
flex: 1 1 300px; /* grow, shrink, min 300px */
max-width: 400px;
}
/* Cards with equal height */
.card-grid-equal {
display: flex;
flex-wrap: wrap;
gap: 24px;
}
.card-equal {
flex: 1 1 300px;
display: flex;
flex-direction: column;
}
.card-equal .card-body {
flex: 1; /* body fills remaining height */
}
.card-equal .card-footer {
margin-top: auto; /* footer pushed to bottom */
}スティッキーフッター
コンテンツが少なくてもフッターが画面下部に。
/* Sticky footer layout */
body {
display: flex;
flex-direction: column;
min-height: 100vh;
margin: 0;
}
header {
flex-shrink: 0; /* fixed height header */
}
main {
flex: 1; /* takes all remaining space */
}
footer {
flex-shrink: 0; /* fixed height footer */
}
/* HTML structure:
<body>
<header>...</header>
<main>...</main>
<footer>...</footer>
</body>
*/ホーリーグレイルレイアウト
クラシックな3カラムレイアウト。
/* Holy grail layout */
.page {
display: flex;
flex-direction: column;
min-height: 100vh;
}
.page > header,
.page > footer {
flex-shrink: 0;
}
.page > .content {
flex: 1;
display: flex;
}
.page .sidebar-left {
flex: 0 0 200px; /* fixed 200px left sidebar */
order: -1; /* appears first visually */
}
.page .main {
flex: 1; /* main content fills remaining space */
min-width: 0; /* prevent overflow */
}
.page .sidebar-right {
flex: 0 0 200px; /* fixed 200px right sidebar */
}
/* HTML structure:
<div class="page">
<header>Header</header>
<div class="content">
<main class="main">Main Content</main>
<aside class="sidebar-left">Left</aside>
<aside class="sidebar-right">Right</aside>
</div>
<footer>Footer</footer>
</div>
*/Flexbox vs Grid:使い分け
両方とも強力ですが、異なる問題を解決します。
Flexboxが最適:
- One-dimensional layouts (a single row or column)
- Content-driven sizing (items determine their own width)
- Dynamic, unknown number of items
- Navigation bars and toolbars
- Centering elements
- Components where items should wrap naturally
CSS Gridが最適:
- Two-dimensional layouts (rows and columns together)
- Layout-driven sizing (the layout dictates item sizes)
- Complex page layouts with header, sidebar, content, footer
- Overlapping elements in a grid
- When you need precise control over both axes simultaneously
- Dashboard-style layouts with varying card sizes
/* Combining Flexbox and Grid */
.page {
display: grid;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
grid-template-columns: 250px 1fr;
grid-template-rows: auto 1fr auto;
min-height: 100vh;
}
/* Use Flexbox inside grid areas */
.page header {
grid-area: header;
display: flex;
justify-content: space-between;
align-items: center;
}
.page main {
grid-area: main;
display: flex;
flex-wrap: wrap;
gap: 16px;
align-content: flex-start;
}ブラウザサポート
Flexboxはすべてのモダンブラウザで優れたサポート。
| Feature | Chrome | Firefox | Safari | Edge |
|---|---|---|---|---|
| Basic Flexbox | 29+ | 28+ | 9+ | 12+ |
| flex-wrap | 29+ | 28+ | 9+ | 12+ |
| gap (in Flexbox) | 84+ | 63+ | 14.1+ | 84+ |
| row-gap / column-gap | 84+ | 63+ | 14.1+ | 84+ |
Flexbox has over 99% global browser support. The only consideration is the gap property in flex contexts, which requires slightly newer browsers. For older browser support, use margins as a fallback:
/* Fallback for gap */
.container {
display: flex;
flex-wrap: wrap;
margin: -8px; /* negative margin to offset item margins */
}
.container > .item {
margin: 8px; /* acts like gap: 16px */
}
/* Modern approach with @supports */
@supports (gap: 16px) {
.container {
gap: 16px;
margin: 0;
}
.container > .item {
margin: 0;
}
}よくある質問
justify-contentとalign-itemsの違いは?
justify-contentは主軸、align-itemsは交差軸を制御します。flex-directionがcolumnの場合、軸が入れ替わります。
FlexboxとGridの使い分けは?
Flexboxは1Dレイアウト、Gridは2Dレイアウト向け。組み合わせも効果的です。
フレックス要素を等幅にするには?
全要素にflex: 1を設定。必要に応じてmin-width: 0も追加。
フレックス要素が縮小しないのはなぜ?
デフォルトのmin-width: autoが縮小を防ぎます。min-width: 0を設定してください。
Flexboxでgapは使えますか?
はい、すべてのモダンブラウザでFlexboxのgapがサポートされています。
CSS Flexboxはモダンレイアウトに不可欠です。インタラクティブツールで練習しましょう。