Flexboxとは何か
Flexbox(正式名称:Flexible Box Layout)は、一次元方向に要素を柔軟に配置するためのCSSレイアウト技術です。横一列または縦一列に要素を並べる場面で威力を発揮します。
用語の確認(コンテナー/アイテム)
Flexboxでは、親要素と子要素に特別な名前があります。
コード例
<div class="container"> ← フレックスコンテナー(親要素)
<div>アイテム</div> ← フレックスアイテム(子要素1)
<div>アイテム</div> ← フレックスアイテム(子要素2)
<div>アイテム</div> ← フレックスアイテム(子要素3)
</div> .container {
display: flex; /* この親要素がフレックスコンテナーになる */
}
/* 子要素(div)は自動的にフレックスアイテムになる */ - フレックスコンテナー
display: flexを指定した親要素。子要素の配置方法を制御する - フレックスアイテム コンテナーの直接の子要素。自動的にFlexboxの影響を受ける
- 親子関係が重要 コンテナーに指定したプロパティがアイテムの配置を決定する
使うと何が楽になるか
従来のfloatやinline-blockを使った配置と比べて、Flexboxは圧倒的にシンプルで直感的です。
実際にナビゲーションメニューを作って比較してみましょう。
<nav class="nav-old">
<a href="#">ホーム</a>
<a href="#">概要</a>
<a href="#">お問い合わせ</a>
</nav> .nav-old {
width: 100%;
overflow: hidden; /* floatした子要素を含める */
text-align: center; /* 中央揃えの準備 */
font-size: 0; /* inline-blockの隙間対策 */
}
.nav-old::after {
content: "";
display: table;
clear: both; /* clearfixが必要 */
}
.nav-old a {
float: left; /* 横並びにするため */
padding: 8px 16px;
margin-right: 12px; /* 余白を手動調整 */
text-decoration: none;
font-size: 16px; /* font-size:0を打ち消し */
/* 中央揃えは複雑な計算が必要... */
} <nav class="nav-flex">
<a href="#">ホーム</a>
<a href="#">概要</a>
<a href="#">お問い合わせ</a>
</nav> .nav-flex {
display: flex; /* この1行だけで横並び完了! */
gap: 12px; /* 要素間の余白も簡単 */
justify-content: center; /* 中央揃えも1行 */
}
.nav-flex a {
padding: 8px 16px;
text-decoration: none;
/* floatやclearfixは不要 */
} 実際に試してみよう
- display: flex コンテナーをFlexboxにする
- gap アイテム間の余白(例:8px、16px、24px)
- justify-content 水平方向の配置(center、space-between、flex-start、flex-end)
フレックスコンテナーとアイテムの関係
Flexboxを理解するには、コンテナー(親要素)とアイテム(子要素)の役割分担を把握することが重要です。それぞれに指定できるプロパティが異なり、どちらに何を指定するかで効果が決まります。
コンテナーに指定する基本(display: flex)
フレックスコンテナーには、子要素全体の配置を制御するプロパティを指定します。
.container {
display: flex; /* Flexboxを有効化 */
justify-content: center; /* 水平方向の揃え */
align-items: center; /* 垂直方向の揃え */
gap: 16px; /* アイテム間の余白 */
flex-direction: row; /* 並び方向(横並び) */
} 主要なコンテナープロパティまとめ
- display: flex Flexboxを有効化する最も重要なプロパティ
- justify-content 主軸方向(通常は水平)の配置を制御
center: 中央揃えspace-between: 両端揃えflex-start: 左揃えflex-end: 右揃えなど - align-items 交差軸方向(通常は垂直)の配置を制御
center: 中央揃えflex-start: 上揃えflex-end: 下揃えなど - flex-direction アイテムの並び方向を指定
row: 横並び(デフォルト)column: 縦並び - gap アイテム間の余白を一括で指定(例:8px、16px、24px)
実際に試してみよう
アイテムに影響する基本的な性質
フレックスアイテムは、コンテナーに display: flex が指定されると自動的に特別な性質を持ちます。
.container {
display: flex; /* 親要素にdisplay: flexを指定すると... */
}
/* 子要素(アイテム)は自動的に以下の性質を持つ */
.item {
/* 幅が自動調整される(自動伸縮) */
/* 高さが他のアイテムと揃う(高さ統一) */
/* 内容に応じた最小幅が保持される */
/* 個別プロパティで細かく制御可能 */
} - 自動伸縮 利用可能な空間に応じて幅が自動調整される
- 高さ統一 同じ行のアイテムは自動的に高さが揃う
- 最小幅保持 内容に応じた最小幅は自動的に確保される
- 個別制御 各アイテムに個別のプロパティで細かく調整可能
アイテムの個別制御
アイテムごとに以下のようなプロパティを指定して、個別に挙動を調整できます。
通常のブロック要素では実現が困難な、比率による幅制御、個別の垂直位置調整、表示順序の変更が、シンプルなプロパティ指定だけで実現できることがFlexboxの大きな特徴です。
flex: 1
flex: 3(3倍の幅)
flex: 1
align-self: flex-start
align-self: center
align-self: flex-end
order: 1(1番目に表示)
order: 2(2番目に表示)
order: 3(3番目に表示)
アイテムに指定できる主要プロパティ
フレックスアイテムには、個別の動作を制御するための専用プロパティがあります。
- flex アイテムの伸縮比率を指定。
flex: 1で均等分割、flex: 2で2倍の幅になる - align-self そのアイテムだけの垂直位置を個別に制御。コンテナーの
align-itemsを上書き
flex-start(上揃え)center(中央揃え)flex-end(下揃え) - order 表示順序を数値で指定。HTML構造を変えずに並び順だけを変更可能
- flex-grow 余った空間をどの程度伸びるかの比率。
1で均等に伸びる - flex-shrink 空間が足りない時にどの程度縮むかの比率。
0で縮まない、1で縮む - flex-basis アイテムの基本サイズを指定(例:100px、30%、autoなど)
実際に試してみよう
<div class="container">
<div class="item item1">アイテム1</div>
<div class="item item2">アイテム2</div>
<div class="item item3">アイテム3</div>
</div> 主軸と交差軸を理解しよう
主軸(main axis)
主軸は、フレックスアイテムが並ぶメインの方向を表します。flex-directionプロパティの値によって決まります。
flex-directionの値
- row(デフォルト) 主軸は水平方向。アイテムは左から右に並ぶ
- column 主軸は垂直方向。アイテムは上から下に並ぶ
justify-contentは主軸方向の配置を決めるプロパティです。横並び(row)なら水平方向、縦並び(column)なら垂直方向の配置を指定することを覚えておきましょう。
交差軸(cross axis)
交差軸は、主軸に対して垂直な方向です。主軸が決まれば、交差軸は自動的に決まります。
flex-directionの値
- row 交差軸は垂直方向(上から下)。要素の垂直配置
- column 交差軸は水平方向(左から右)。要素の水平配置
align-itemsは交差軸方向の配置を決めるプロパティです。横並び(row)なら垂直方向、縦並び(column)なら水平方向の配置を指定します。
動作を確認しよう
flex-directionプロパティを変更することで、主軸と交差軸を切り替えることができます。これにより、同じ配置プロパティでも異なる効果を得られます。
以下のように、プロパティの値を変更して動作を確認してみましょう。
flex-direction: rowに設定し、justify-content: centerとalign-items: centerを適用。アイテムが中央に配置されることを確認flex-direction: columnに変更し、同じjustify-content: centerとalign-items: centerを適用。アイテムが縦方向に中央に配置されることを確認flex-direction: rowに戻し、justify-content: flex-endとalign-items: flex-startを適用。アイテムが右上に配置されることを確認flex-direction: columnに変更し、同じjustify-content: flex-endとalign-items: flex-startを適用。アイテムが下左に配置されることを確認
理解度チェッククイズ
Flexboxミニクイズ
.container {
display: flex;
①: 16px;
justify-content: center;
} .container {
display: flex;
justify-content: space-between;
} .item {
flex: 1;
}
.item2 {
flex: 3;
} まとめ
- display: flex 親要素に指定するだけで子要素が横並びに。これがFlexboxの第一歩
- 主軸と交差軸 flex-directionで主軸の方向が決まり、交差軸は主軸に垂直な方向。この理解が重要
- justify-content 主軸方向の配置を制御。center、space-between、flex-endなど用途に応じて選択
- align-items 交差軸方向の配置を制御。要素の垂直位置調整に使用
- gap アイテム間の余白を簡単に指定。marginの個別調整が不要に
- flexプロパティ アイテムの幅比率を指定。flex: 1で均等分割、flex: 2で2倍の幅
次回は、Flexboxの応用的な配置テクニックと、実際のWebサイトでよく使われるレイアウトパターンを学びます。