はじめに
Webサイトのレイアウトを構築する際、「要素を横並びにしたい」「中央揃えにしたい」「余白を均等に配置したい」といった要件に直面します。これらの課題をシンプルかつ柔軟に解決できるのが、CSSのFlexbox(フレックスボックス)レイアウトです。
Flexboxは2012年頃から主要ブラウザでサポートが進み、現在ではモダンWebレイアウトに欠かせない技術となっています。1次元(行または列)のレイアウトを直感的に制御できるため、ナビゲーションバー、カードレイアウト、フッターの配置など、あらゆる場面で活用されています。
本記事では、Flexboxの基本概念について以下の内容を解説します。
- Flexboxの仕組み(フレックスコンテナとフレックスアイテム)
- 主軸(main axis)と交差軸(cross axis)の考え方
flex-directionとflex-wrapによる方向と折り返しの制御- 基本的な配置パターンの実装方法
前提条件
本記事を読み進めるにあたり、以下の知識があることを前提としています。
- HTMLの基本的なタグ構造(
div、span、navなど) - CSSの基本構文(セレクタ・プロパティ・値の関係)
displayプロパティの基本的な理解
動作確認環境
- Google Chrome 131以降
- Firefox 133以降
- Safari 18以降
- Microsoft Edge 131以降
Flexboxとは
Flexboxは「Flexible Box Layout Module」の略称で、要素を柔軟に配置するためのCSSレイアウトモデルです。MDN Web Docsでは次のように説明されています。
フレックスボックスレイアウトは、アイテム間の余白を分配するための一次元レイアウトモデルで、数多くの配置機能を含んでいます。
「一次元」という表現がポイントです。Flexboxは行(横方向)か列(縦方向)のいずれか一方向にレイアウトを制御します。これに対して、CSS Grid Layoutは行と列の両方を同時に制御する二次元レイアウトモデルです。
flowchart LR
subgraph flexbox["Flexbox(一次元)"]
direction LR
A["アイテム1"] --> B["アイテム2"] --> C["アイテム3"]
end
subgraph grid["Grid(二次元)"]
direction TB
D["1,1"] --- E["1,2"] --- F["1,3"]
G["2,1"] --- H["2,2"] --- I["2,3"]
endFlexboxを使う場面
Flexboxは以下のようなレイアウトに最適です。
| ユースケース | 説明 |
|---|---|
| ナビゲーションバー | 横並びのメニュー項目を等間隔に配置 |
| ヘッダーレイアウト | ロゴを左、ナビを右に配置 |
| カードリスト | 可変幅のカードを柔軟に配置 |
| フッター | コンテンツを最下部に固定 |
| 中央揃え | 水平・垂直方向の中央配置 |
フレックスコンテナとフレックスアイテム
Flexboxレイアウトを構成する2つの要素を理解することが、Flexbox習得の第一歩です。
フレックスコンテナ(Flex Container)
display: flexまたはdisplay: inline-flexを指定した要素がフレックスコンテナになります。このコンテナがFlexboxレイアウトの「親要素」となり、内部の子要素の配置を制御します。
|
|
フレックスアイテム(Flex Item)
フレックスコンテナの直接の子要素がフレックスアイテムになります。孫要素以降はフレックスアイテムにはなりません。
|
|
flowchart TB
subgraph container["フレックスコンテナ(display: flex)"]
item1["フレックスアイテム 1"]
item2["フレックスアイテム 2"]
item3["フレックスアイテム 3"]
end基本的なFlexbox適用例
以下のHTMLとCSSで、Flexboxの基本的な動作を確認できます。
|
|
|
|
display: flexを指定するだけで、子要素は自動的に横並び(行方向)に配置されます。これがFlexboxの初期動作です。
主軸と交差軸
Flexboxを使いこなすには、「主軸」と「交差軸」という2つの軸の概念を理解する必要があります。
主軸(Main Axis)
主軸は、フレックスアイテムが配置される方向の軸です。flex-directionプロパティによって定義され、アイテムはこの軸に沿って並びます。
交差軸(Cross Axis)
交差軸は、主軸に対して垂直に交わる軸です。主軸が横方向であれば交差軸は縦方向になり、主軸が縦方向であれば交差軸は横方向になります。
flowchart TB
subgraph row["flex-direction: row の場合"]
direction LR
subgraph main1["主軸(横方向)"]
R1["→"]
end
subgraph cross1["交差軸(縦方向)"]
R2["↓"]
end
end
subgraph column["flex-direction: column の場合"]
direction TB
subgraph main2["主軸(縦方向)"]
C1["↓"]
end
subgraph cross2["交差軸(横方向)"]
C2["→"]
end
end主軸の開始点と終了点
主軸には「開始点(start)」と「終了点(end)」があります。日本語や英語のような左から右に読む言語では、flex-direction: rowの場合、開始点は左側、終了点は右側になります。
この概念を理解することで、justify-contentやalign-itemsなどの配置プロパティの動作を正しく把握できます。
flex-directionプロパティ
flex-directionプロパティは、主軸の方向を決定します。これにより、フレックスアイテムがどの方向に配置されるかが決まります。
flex-directionの値
| 値 | 説明 | 主軸の方向 |
|---|---|---|
row |
左から右へ横並び(初期値) | 水平方向(→) |
row-reverse |
右から左へ横並び | 水平方向(←) |
column |
上から下へ縦並び | 垂直方向(↓) |
column-reverse |
下から上へ縦並び | 垂直方向(↑) |
row(初期値)
アイテムを左から右へ横並びに配置します。これがFlexboxの初期動作です。
|
|
|
|
表示結果: [1] [2] [3](左から右へ配置)
row-reverse
アイテムを右から左へ横並びに配置します。アイテムの順序は維持されますが、配置が右から始まります。
|
|
表示結果: [3] [2] [1](右から左へ配置)
column
アイテムを上から下へ縦並びに配置します。主軸が垂直方向になります。
|
|
表示結果:
[1]
[2]
[3]
column-reverse
アイテムを下から上へ縦並びに配置します。
|
|
表示結果:
[3]
[2]
[1]
使い分けのポイント
- row: ナビゲーションバー、ヘッダー内のロゴとメニュー配置
- column: サイドバー内のメニュー、モバイル向けレイアウト
- row-reverse: 右から左への配置が必要な場合(例:チャット画面)
- column-reverse: フッターを最下部に固定しつつ上方向に積み上げる場合
flex-wrapプロパティ
Flexboxの初期動作では、すべてのアイテムは1行(または1列)に収まろうとします。アイテムの合計幅がコンテナを超えると、アイテムは縮小するか、コンテナからはみ出します。flex-wrapプロパティを使うと、この動作を制御できます。
flex-wrapの値
| 値 | 説明 |
|---|---|
nowrap |
折り返さない(初期値)。すべてのアイテムを1行に配置 |
wrap |
複数行に折り返す。次の行は下(または右)に配置 |
wrap-reverse |
複数行に折り返す。次の行は上(または左)に配置 |
nowrap(初期値)
アイテムは折り返されず、1行に配置されます。コンテナに収まらない場合、アイテムが縮小されるか、はみ出します。
|
|
この場合、各アイテムは100pxに縮小されて1行に収まります。
wrap
アイテムがコンテナに収まらない場合、次の行に折り返されます。レスポンシブデザインで頻繁に使用されます。
|
|
flowchart TB
subgraph container["コンテナ(幅300px)"]
subgraph line1["1行目"]
A["アイテム1(150px)"]
B["アイテム2(150px)"]
end
subgraph line2["2行目"]
C["アイテム3(150px)"]
end
endwrap-reverse
wrapと同様に折り返しますが、新しい行は上方向に追加されます。
|
|
flex-flowショートハンド
flex-directionとflex-wrapは頻繁に一緒に使用されるため、flex-flowというショートハンドプロパティが用意されています。
|
|
flex-flowの構文
|
|
よく使用される組み合わせは以下の通りです。
| 値 | 意味 |
|---|---|
row nowrap |
横並び・折り返しなし(初期値) |
row wrap |
横並び・折り返しあり |
column nowrap |
縦並び・折り返しなし |
column wrap |
縦並び・折り返しあり |
基本的な配置パターンの実装
ここまでの知識を活かして、実務でよく使われる配置パターンを実装してみましょう。
パターン1: ナビゲーションバー
ロゴを左に、ナビゲーションメニューを右に配置するヘッダーレイアウトです。
|
|
|
|
パターン2: カードレイアウト
複数のカードを横並びで配置し、収まらない場合は折り返すレイアウトです。
|
|
|
|
パターン3: 垂直方向の中央揃え
要素をコンテナの中央(水平・垂直両方)に配置するパターンです。
|
|
|
|
パターン4: フッターを最下部に固定
ページのコンテンツが少ない場合でも、フッターを画面最下部に配置するパターンです。
|
|
|
|
Flexboxの初期値まとめ
Flexboxを使用する際、各プロパティの初期値を理解しておくと、意図しない動作を防げます。
コンテナに適用されるプロパティの初期値
| プロパティ | 初期値 | 説明 |
|---|---|---|
flex-direction |
row |
横方向に配置 |
flex-wrap |
nowrap |
折り返さない |
justify-content |
flex-start |
主軸の開始位置から配置 |
align-items |
stretch |
交差軸方向に引き伸ばす |
align-content |
stretch |
複数行の場合の交差軸方向配置 |
アイテムに適用されるプロパティの初期値
| プロパティ | 初期値 | 説明 |
|---|---|---|
flex-grow |
0 |
余白があっても拡大しない |
flex-shrink |
1 |
必要に応じて縮小する |
flex-basis |
auto |
コンテンツサイズを基準にする |
align-self |
auto |
align-itemsの値を継承 |
これらの初期値により、display: flexを指定するだけで以下の動作になります。
- アイテムは横並び(
row)で配置される - アイテムは1行に収まり、折り返さない(
nowrap) - アイテムは左揃え(
flex-start)で配置される - アイテムは交差軸方向に引き伸ばされる(
stretch) - アイテムは必要に応じて縮小するが、余白があっても拡大しない
まとめ
本記事では、Flexboxの基本概念について解説しました。
Flexboxの重要なポイントは以下の通りです。
- フレックスコンテナとフレックスアイテム:
display: flexを指定した要素がコンテナ、その直接の子要素がアイテムになる - 主軸と交差軸: Flexboxは2つの軸で構成され、
flex-directionで主軸の方向が決まる - flex-direction: アイテムの配置方向を
row、row-reverse、column、column-reverseで制御 - flex-wrap: アイテムの折り返しを
nowrap、wrap、wrap-reverseで制御 - flex-flow:
flex-directionとflex-wrapのショートハンド
Flexboxは一次元レイアウトに特化しており、ナビゲーション、カードレイアウト、中央揃えなど、多くのレイアウトパターンをシンプルに実装できます。
次のステップとして、justify-content、align-items、align-selfなどの配置プロパティ、flex-grow、flex-shrink、flex-basisなどのサイズ制御プロパティを学ぶことで、より複雑なレイアウトを実現できるようになります。