FlexboxとFlexアイテムの初期値を完全理解|何も指定しないときの挙動ガイド

6 min 84 views
Flexboxの初期値の説明画像

display: flex; と書いた瞬間、レイアウトが「なんとなくいい感じ」に動いてくれる一方で、

  • 「なぜ勝手に横並び?」
  • 「なんで幅がギュッと潰れる?」
  • 「flex: 1; 付ける前ってどういう状態なの?」

と違和感が残りやすいところでもあります。

この記事では、「初期値だけ」にフォーカスして、Flexboxの挙動を体系的に整理します。
余計な情報を混ぜずに、「何も指定していないときに本当はどう動いているのか?」を理解できる完全版です。

0.まずは全体のcodeを俯瞰する

/* Flexコンテナの主な初期値 */
.container {
display: flex;
flex-direction: row; /* 横並び(左 → 右) */
flex-wrap: nowrap; /* 折り返さない */
justify-content: flex-start; /* 主軸方向は先頭寄せ */
align-items: stretch; /* 高さ方向に引き伸ばす */
align-content: normal; /* 複数行時の行揃え(単一行では影響なし) */
}

/* Flexアイテムの主な初期値 */
.container > .item {
order: 0; /* 並び順はそのまま */
flex-grow: 0; /* 余白があっても伸びない */
flex-shrink: 1; /* 狭いときは縮む */
flex-basis: auto; /* コンテンツ or width を基準 */
align-self: auto; /* 親の align-items を継承 */
/* → まとめると実質 flex: 0 1 auto; */
}

1. Flexboxの基本構造をおさらい

まず前提です。

.container {
  display: flex;
}

この1行で

  • .container → Flexコンテナ
  • .container 直下の子要素 → Flexアイテム

として扱われます。

役割イメージ

  • コンテナ:並べ方・揃え方・折り返しなど「ルール」を決める側
  • アイテム:そのルールの中で伸び縮みする「コマ」

ここを押さえたうえで、
コンテナの初期値 → アイテムの初期値 の順に掘り下げます。

2. Flexコンテナの初期値を整理する

 2-1. display

display: flex;
  • ブロック要素として表示されつつ、中身がFlexレイアウトに切り替わる。
  • display: inline-flex; を指定した場合はインライン要素扱いになりつつ中身は同じFlex。

ここは素直に「FlexモードONのスイッチ」と理解してOKです。

 2-2. flex-direction:なぜ横並びになるのか

初期値:row

.container {
  flex-direction: row; /* デフォルトは左から右へ横並び */
}
  • 主軸(main axis):左 → 右
  • 交差軸(cross axis):上 → 下

理由
「何もしていないのに横並びになる」のは、この初期値のせいです。
縦並びにしたいときは column を明示的に書く必要があります。

 2-3. flex-wrap:なぜ折り返してくれないのか

初期値:nowrap

.container {
  flex-wrap: nowrap; /* 折り返さない = 1行に押し込む */
}
  • コンテナ幅を超えても、まずは1行に詰め込もうとする のが標準動作
  • その結果、子要素が勝手に縮んで「潰れたカードレイアウト」が発生しがち。

複数行にしたい場合は

flex-wrap: wrap;

を必ず指定します。

 2-4. justify-content:主軸方向の揃え

初期値:flex-start

.container {
  justify-content: flex-start; /* 左寄せ(row時) */
}
  • 余白があっても、自動で中央揃えや均等割りにはしない
  • 中央や均等配置にしたいときは center, space-between, space-around などを明示。

 2-5. align-items:交差軸方向の揃え(高さが揃う理由)

初期値:stretch

.container {
  align-items: stretch;
}
  • 高さが指定されていないFlexアイテムは、行の高さに合わせて 縦方向に引き伸ばされる
  • これが「なぜか高さそろって見える」理由。

変更例

align-items: center;    /* 縦中央揃え */
align-items: flex-start;/* 上揃え */
align-items: flex-end;  /* 下揃え */

 2-6. align-content:複数行になったときだけ効く

初期値:normal(実装的には多くの場面で stretch に近い挙動)

.container {
  align-content: normal;
}

ポイント:

  • 効くのは flex-wrap で折り返して行が2行以上になったときだけ
  • 単一行レイアウトでは何も起こりません。

初学者のうちは

「複数行レイアウトで行同士をどう並べるかのプロパティ。1行なら無視してOK」

くらいの理解で十分です。

3. Flexアイテムの初期値を整理する

ここからは .container > .item 側に自動で適用されている設定です。

 3-1. order:見た目の順番

初期値:0

.item {
  order: 0;
}
  • 全アイテムが 0 なので、HTMLの順番通り に表示される。
  • order に数値を設定すると、その数値が小さいものから順に並ぶ。

※アクセシビリティの観点から、order で見た目だけ入れ替える使い方は慎重に。

 3-2. flex-grow:余白をどれだけ「取りに行くか」

初期値:0

.item {
  flex-grow: 0; /* 余白があっても自分からは伸びない */
}
  • flex-grow: 1; を指定して初めて「余白を分け合って伸びる」ふるまいになります。
  • よくある誤解:「Flexは勝手に均等に伸びる」→ 初期値のままだと伸びません。

 3-3. flex-shrink:狭いときにどれだけ縮むか

初期値:1

.item {
  flex-shrink: 1; /* 狭いときは縮んでよい、がデフォルト */
}
  • コンテナ幅 < アイテム合計幅 のとき、自動でギュッと縮む。
  • 幅指定しているのに潰れるときの犯人はだいたいこれ。

潰したくない要素は

flex-shrink: 0;

を指定します。

 3-4. flex-basis:基本サイズの基準

初期値:auto

.item {
  flex-basis: auto;
}
  • auto の場合の基準:
    • width 指定があればその値
    • なければコンテンツサイズ
  • flex-basis: 0; にすると、「一旦全員幅0として、余白を均等に配る」ような挙動に変わります。

 3-5. align-self:1つだけ縦位置を変える

初期値:auto

.item {
  align-self: auto; /* 親の align-items を引き継ぐ */
}

特定の要素だけ縦位置を変えたいときに使用

.item--center {
  align-self: center;
}

 3-6. flex(ショートハンド)の実際の初期値

flex はこの3つのまとめです

flex: flex-grow flex-shrink flex-basis;

何も指定していないときの実質的な姿

.item {
  flex: 0 1 auto;
}

つまり

  • 伸びない (grow: 0)
  • 縮む (shrink: 1)
  • サイズは中身や指定widthに任せる (basis: auto)

よく使う指定との比較

.item {
  flex: 1;       /* = 1 1 0 → 余白を均等に取り合う伸縮ボックス */
}

.item-fixed {
  flex: 0 0 auto;/* = 伸びない・縮まない・サイズ固定寄り */
}

この違いを理解しておくと、カードレイアウトやグリッド風レイアウトを意図通りに組めるようになります。

4. 初期値を「原因」として読む練習

よくある「なぜ?」を、初期値から読み解いてみます。

  1. なぜ横並び?
    → flex-direction: row;
  2. なぜ折り返さない?
    → flex-wrap: nowrap;
  3. なぜ幅が潰れる?
    → flex-shrink: 1; + nowrap
  4. なぜ高さがそろう?
    → align-items: stretch;
  5. なぜ flex: 1; で均等になる?
    → flex: 1 1 0; によって「余白を平等に分け合う」ルールになるから

初期値を「暗記」ではなく、レイアウト崩れの原因を説明するためのチェックリストとして使えるようになると、Flexboxは一気に扱いやすくなります。

5. 「初期値まとめ表」

 Flexコンテナの主な初期値

プロパティ初期値役割・挙動
displayflexFlexレイアウトを有効化
flex-directionrow横並び(左→右)
flex-wrapnowrap折り返さず1行に詰め込む
justify-contentflex-start主軸方向の先頭寄せ
align-itemsstretchアイテムを縦方向に伸ばして高さを揃える
align-contentnormal複数行レイアウト時の行揃え(単一行では影響なし)

 Flexアイテムの主な初期値

プロパティ初期値役割・挙動
order0HTMLの順番通りに表示
flex-grow0余白があっても自分からは伸びない
flex-shrink1スペース不足時に縮む
flex-basisautoコンテンツ or widthを基準にサイズ決定
align-selfauto親の align-items を継承
flex0 1 auto上記3つをまとめたデフォルト状態

6. 実務で意識するとラクになるポイント

  • カードを均等に伸ばしたい → flex: 1; を指定して「デフォルト(0 1 auto)」を上書きする。
  • 特定要素だけ潰したくない → flex-shrink: 0;
  • 自然に折り返したい → コンテナ側に flex-wrap: wrap;
  • 縦中央揃えにしたい → コンテナ側に align-items: center;

「うまくいかない」と感じたときは、まずここまでの初期値セットに照らし合わせるだけで原因が見えやすくなります。

関連記事