【CSS】justify-contentの使い方入門(Flexboxで要素を配置)


【CSS】justify-contentの使い方入門(Flexboxで要素を配置)

ウェブサイトやアプリケーションのレイアウトを構築する上で、要素の配置は非常に重要な課題です。従来のCSSプロパティ(float, inline-block, positionなど)では、複雑な配置、特に要素の整列や中央寄せは手間がかかる場合が多くありました。そこで登場したのが「Flexbox(Flexible Box Layout)」です。

Flexboxは、コンテナ内のアイテムを簡単に整列させたり、サイズを柔軟に調整したりするための強力なレイアウトモデルです。その中でも、Flexコンテナの「主軸(main axis)」方向におけるFlexアイテムの配置方法を制御するのが、今回詳しく解説するjustify-contentプロパティです。

この記事では、Flexboxの基本的な考え方をおさらいしつつ、justify-contentプロパティがどのように機能するのか、指定できる様々な値がそれぞれどのような配置を実現するのかを、豊富なコード例と分かりやすい解説で徹底的に掘り下げていきます。ウェブ制作に携わるすべての方にとって、Flexboxとjustify-contentをマスターするための一歩となることを目指します。

さあ、Flexboxの世界へ飛び込み、justify-contentの魔法を解き明かしましょう!

1. Flexboxの基本をおさらいしよう

justify-contentについて深く理解するためには、まずFlexboxの基本的な概念をしっかりと押さえておく必要があります。

Flexboxは、主に以下の2つの要素で構成されます。

  1. Flexコンテナ (Flex Container): Flexboxレイアウトを適用する親要素です。この要素にdisplay: flex;またはdisplay: inline-flex;を指定することで、その直下の子要素がFlexアイテムとして扱われるようになります。
  2. Flexアイテム (Flex Item): Flexコンテナの直下にある子要素です。Flexコンテナのプロパティによって、これらのアイテムのサイズや配置が制御されます。

Flexboxの最も重要な概念の一つに、「軸(Axis)」があります。Flexboxには2つの軸が存在します。

  • 主軸 (Main Axis): Flexアイテムが配置される主要な方向です。
  • 交差軸 (Cross Axis): 主軸に対して垂直な方向です。

どちらの軸が主軸になるかは、Flexコンテナに指定するflex-directionプロパティによって決まります。

  • flex-direction: row; (デフォルト値): 主軸は横方向(行)になります。テキストの記述方向(左から右など)に従います。交差軸は縦方向(列)になります。
  • flex-direction: column;: 主軸は縦方向(列)になります。交差軸は横方向(行)になります。
  • flex-direction: row-reverse;: 主軸は横方向ですが、開始位置と終了位置が反転します(右から左など)。
  • flex-direction: column-reverse;: 主軸は縦方向ですが、開始位置と終了位置が反転します(下から上など)。

Flexbox Axes Illustration
(概念図のイメージ。実際は画像は表示されませんが、Flexboxの軸の概念を説明しています。)

なぜこの軸の話が重要なのか?

それは、justify-contentプロパティが主軸方向におけるFlexアイテムの配置を制御するからです。つまり、flex-direction: row;の場合は横方向の配置、flex-direction: column;の場合は縦方向の配置を制御することになります。

一方で、交差軸方向におけるアイテムの配置や整列は、align-itemsalign-contentといった別のプロパティが担当します。justify-contentはあくまで主軸の話である、という点をしっかりと理解しておきましょう。

2. justify-contentプロパティの目的と役割

justify-contentプロパティの主な目的は、Flexコンテナの主軸上にFlexアイテムをどのように配置するか、そして余分なスペースをどのように分配するかを決定することです。

具体的には、以下のような配置を制御できます。

  • アイテムを主軸の開始位置に寄せる
  • アイテムを主軸の終了位置に寄せる
  • アイテムを主軸の中央に配置する
  • アイテム間に均等なスペースを設ける
  • アイテムの周囲(両側)に均等なスペースを設ける
  • アイテム間と両端に完全に均等なスペースを設ける

Flexコンテナの主軸方向の合計サイズが、Flexアイテムの合計サイズよりも大きい場合に、justify-contentの効果が現れます。Flexアイテムの合計サイズがコンテナのサイズを超える場合は、justify-contentによるスペース分配の効果はほとんどなくなり、通常はアイテムが主軸の開始位置から順に並べられます(オーバーフローが発生します)。

それでは、justify-contentに指定できる具体的な値と、それぞれの値がどのような配置を実現するのかを見ていきましょう。

3. justify-contentの各値の詳細解説

justify-contentプロパティには、いくつかの標準的な値があります。ここでは、それぞれの値について、その意味、具体的な挙動、コード例、そして簡単な図解を用いて詳しく解説します。

解説にあたっては、Flexコンテナのflex-directionがデフォルトのrow(主軸が横方向)であると仮定します。flex-direction: columnの場合の挙動は後述します。

3.1. justify-content: flex-start;

  • 意味: Flexアイテムを主軸の開始位置に寄せて配置します。
  • 挙動: 利用可能な余分なスペースは、すべてのアイテムが並んだ後、主軸の終了位置側にまとめて確保されます。Flexアイテムは主軸の開始位置から順番に詰めて配置されます。
  • 備考: これはjustify-contentプロパティの初期値(デフォルト値)です。つまり、特にjustify-contentを指定しない場合、自動的にこの配置になります。

コード例:

HTML:
“`html

Item 1
Item 2
Item 3

“`

CSS:
“`css
.flex-container {
display: flex; / Flexコンテナにする /
/ flex-direction: row; / デフォルトなので省略可 / /
width: 400px; / コンテナの幅(主軸方向のサイズ) /
border: 2px solid #007bff; / 分かりやすいように境界線をつける /
padding: 10px;
box-sizing: border-box;
}

.flex-item {
background-color: #e9ecef; / アイテムの背景色 /
border: 1px solid #ced4da; / アイテムの境界線 /
margin: 5px; / アイテム間の余白(内部ではなく、アイテム自体のマージン) /
padding: 10px;
width: 80px; / アイテムの幅 /
text-align: center;
}

.flex-start {
justify-content: flex-start; / ここで指定 /
}
“`

解説:

この例では、.flex-containerがFlexコンテナとなり、その子要素である.flex-itemがFlexアイテムとなります。flex-directionは指定していないため、デフォルトのrowとなり、主軸は横方向です。

.flex-containerの幅は400pxです。各.flex-itemの幅は80px、左右のマージンは5pxずつ(合計10px)なので、アイテム1つあたりの主軸方向の占有幅は 80px + 5px (左マージン) + 5px (右マージン) = 90px となります。アイテムが3つあるため、アイテム全体の合計占有幅は 90px * 3 = 270px です。

コンテナの幅 (400px) がアイテムの合計占有幅 (270px) より大きいため、余分なスペースが 400px – 270px = 130px 存在します。

justify-content: flex-start;を指定すると、この余分なスペース130pxはアイテムが全て並んだ後、主軸の終了位置側(この場合は右側)にまとめて配置されます。アイテム自体は主軸の開始位置側(左側)から順番に詰められて表示されます。

図解 (テキストベース):

+-------------------------------------------------------+
| コンテナ (幅: 400px) |
| +-----------+ +-----------+ +-----------+ |
| | Item 1 | | Item 2 | | Item 3 | [ 130pxの余白 ] |
| +-----------+ +-----------+ +-----------+ |
+-------------------------------------------------------+
^ 主軸の開始 ^ ^ ^ 主軸の終了
(左端) (右端)

この配置は、通常のブロック要素やインラインブロック要素の配置に近い感覚です。要素を単に左詰めにしたい場合や、特に凝った配置が不要な場合にデフォルトのまま使用します。

3.2. justify-content: flex-end;

  • 意味: Flexアイテムを主軸の終了位置に寄せて配置します。
  • 挙動: 利用可能な余分なスペースは、すべてのアイテムが並ぶ前に、主軸の開始位置側にまとめて確保されます。Flexアイテムは主軸の終了位置に向かって詰められて配置されます。

コード例:

HTML:
“`html

Item 1
Item 2
Item 3

“`

CSS:
“`css
.flex-container {
display: flex;
width: 400px;
border: 2px solid #007bff;
padding: 10px;
box-sizing: border-box;
}

.flex-item {
background-color: #e9ecef;
border: 1px solid #ced4da;
margin: 5px;
padding: 10px;
width: 80px;
text-align: center;
}

.flex-end {
justify-content: flex-end; / ここで指定 /
}
“`

解説:

flex-startの例と同じHTML・CSS構造ですが、.flex-containerjustify-content: flex-end;を指定しています。コンテナの幅400px、アイテムの合計占有幅270px、余分なスペース130pxという条件も同じです。

justify-content: flex-end;を指定すると、この余分なスペース130pxはアイテムが全て並ぶ前に、主軸の開始位置側(左側)にまとめて配置されます。Flexアイテム自体は主軸の終了位置側(右側)に向かって順番に詰められて表示されます。

図解 (テキストベース):

+-------------------------------------------------------+
| コンテナ (幅: 400px) |
| [ 130pxの余白 ] +-----------+ +-----------+ +-----------+ |
| | Item 1 | | Item 2 | | Item 3 | |
| +-----------+ +-----------+ +-----------+ |
+-------------------------------------------------------+
^ 主軸の開始 ^ 主軸の終了
(左端) (右端)

この配置は、要素を右詰めにしたい場合によく使用されます。例えば、ツールバーのボタンを右端に寄せたい場合や、RTL (Right-to-Left) 言語でテキストフローが右から左になる場合のデフォルト配置として考えられます(ただし、RTL環境ではflex-startflex-endの物理的な位置が反転するので注意が必要です)。

3.3. justify-content: center;

  • 意味: Flexアイテムを主軸の中心にまとめて配置します。
  • 挙動: 利用可能な余分なスペースは、Flexアイテムの集合体の主軸方向の両側に均等に分配されます。これにより、アイテム全体がコンテナの中央に配置されます。

コード例:

HTML:
“`html

Item 1
Item 2
Item 3

“`

CSS:
“`css
.flex-container {
display: flex;
width: 400px;
border: 2px solid #007bff;
padding: 10px;
box-sizing: border-box;
}

.flex-item {
background-color: #e9ecef;
border: 1px solid #ced4da;
margin: 5px;
padding: 10px;
width: 80px;
text-align: center;
}

.center {
justify-content: center; / ここで指定 /
}
“`

解説:

条件はこれまでと同じです。コンテナの幅400px、アイテムの合計占有幅270px、余分なスペース130pxです。

justify-content: center;を指定すると、この余分なスペース130pxがアイテムの集合体の両側に均等に分割されます。つまり、主軸の開始位置側(左側)に 130px / 2 = 65px、主軸の終了位置側(右側)にも 65px の余白ができます。結果として、Flexアイテム全体がコンテナの主軸方向の中央に配置されます。

図解 (テキストベース):

+-------------------------------------------------------+
| コンテナ (幅: 400px) |
| [ 65px ] +-----------+ +-----------+ +-----------+ [ 65px ] |
| [ 余白 ] | Item 1 | | Item 2 | | Item 3 | [ 余白 ] |
| [ ] +-----------+ +-----------+ +-----------+ [ ] |
+-------------------------------------------------------+
^ 主軸の開始 ^ 主軸の終了
(左端) (右端)

justify-content: center;は、主軸方向の中央揃えを実現したい場合に最もよく使われる値です。ナビゲーションメニューやコンテンツブロックをコンテナ内で中央に配置する際などに非常に便利です。

また、justify-content: center;align-items: center; (交差軸方向の中央揃え) を組み合わせることで、Flexコンテナ内の要素をコンテナの真ん中に完全に配置するテクニックは非常によく使われます。

3.4. justify-content: space-between;

  • 意味: 最初のFlexアイテムを主軸の開始位置に、最後のFlexアイテムを主軸の終了位置に配置し、残りの利用可能なスペースをアイテム間に均等に分配します。
  • 挙動: アイテム間のマージンとは別に、アイテム自体とアイテム自体の間に均等な「隙間」が生まれます。コンテナの両端(主軸の開始/終了位置)と最初の/最後のアイテムの間にはスペースは生成されません(マージンがあれば別ですが、justify-contentによるスペースは生成されないということです)。
  • 注意点: アイテムが1つの場合、この値の効果はflex-startと同じになります(アイテムは開始位置に配置されるだけです)。アイテムが2つの場合、アイテムは両端に配置され、間にスペースが生まれます。アイテム数が3つ以上の場合に、アイテム間のスペースが均等になる効果が顕著になります。

コード例:

HTML:
“`html

Item 1
Item 2
Item 3

“`

CSS:
“`css
.flex-container {
display: flex;
width: 400px;
border: 2px solid #007bff;
padding: 10px;
box-sizing: border-box;
}

.flex-item {
background-color: #e9ecef;
border: 1px solid #ced4da;
/ justify-contentによるスペースと区別するため、ここではmarginは一旦削除 /
/ margin: 5px; /
padding: 10px;
width: 80px; / アイテムの幅 /
text-align: center;
}

.space-between {
justify-content: space-between; / ここで指定 /
}
``
*補足: 上記コード例では、
justify-contentによるスペースの挙動を分かりやすくするため、.flex-itemmarginをコメントアウトしています。通常はマージンと組み合わせて使用することもあります。マージンが設定されている場合、justify-content`はマージンの外側にスペースを分配します。*

解説:

ここでは、Flexアイテムにマージンがないと仮定します。コンテナの幅400px、各アイテムの幅は80pxです。アイテム3つの合計幅は 80px * 3 = 240px です。

コンテナの幅 (400px) がアイテムの合計幅 (240px) より大きいため、余分なスペースが 400px – 240px = 160px 存在します。

justify-content: space-between;を指定すると、この160pxの余分なスペースがアイテム間の「隙間」として均等に分配されます。アイテムが3つある場合、アイテム間は2箇所です(「Item 1」と「Item 2」の間、および「Item 2」と「Item 3」の間)。したがって、各アイテム間のスペースは 160px / 2 = 80px となります。

最初のアイテム「Item 1」は主軸の開始位置(左端)に、最後のアイテム「Item 3」は主軸の終了位置(右端)にぴったりくっつくように配置されます。

図解 (テキストベース):

+-------------------------------------------------------+
| コンテナ (幅: 400px) |
| +-----------+ [ 80px ] +-----------+ [ 80px ] +-----------+ |
| | Item 1 | [ 余白 ] | Item 2 | [ 余白 ] | Item 3 | |
| +-----------+ [ ] +-----------+ [ ] +-----------+ |
+-------------------------------------------------------+
^ 主軸の開始 ^ 主軸の終了
(左端) (右端)

space-betweenは、ナビゲーションメニューで項目を左右に均等に配置したり、カードリストでアイテムを横一列に並べてアイテム間の間隔を均等にしたい場合などに非常に便利です。特に、アイテム数が不定の場合でも、アイテム間のスペースが自動的に調整される点が強力です。

3.5. justify-content: space-around;

  • 意味: 利用可能な余分なスペースを、各Flexアイテムの周囲(両側)に均等に分配します。
  • 挙動: 各アイテムには、その左右(または上下、主軸による)に同じ量のスペースが割り当てられます。結果として、アイテム間のスペースは、端のスペースの2倍になります。
  • 注意点: 「周囲に均等」というのは、アイテムそれぞれに対して均等なスペースを与えるという意味です。例えば、アイテムAとアイテムBが隣接している場合、アイテムAの右側のスペースと、アイテムBの左側のスペースが合計されて、アイテム間の実際のスペースとなります。そして、この合計スペースの量は、一番左端のアイテムの左側にできるスペースや、一番右端のアイテムの右側にできるスペースと同じ量になります。したがって、アイテム間のスペースは端のスペースの倍になる、という関係が生まれます。

コード例:

HTML:
“`html

Item 1
Item 2
Item 3

“`

CSS:
“`css
.flex-container {
display: flex;
width: 400px;
border: 2px solid #007bff;
padding: 10px;
box-sizing: border-box;
}

.flex-item {
background-color: #e9ecef;
border: 1px solid #ced4da;
/ margin: 5px; /
padding: 10px;
width: 80px; / アイテムの幅 /
text-align: center;
}

.space-around {
justify-content: space-around; / ここで指定 /
}
“`

解説:

アイテムにマージンがないと仮定し、コンテナの幅400px、アイテム3つの合計幅240px、余分なスペース160pxという条件は同じです。

justify-content: space-around;を指定すると、この160pxの余分なスペースが、各アイテムの「周囲」に均等に分配されます。アイテムが3つある場合、合計6つの「周囲」があります(Item 1の左、Item 1の右、Item 2の左、Item 2の右、Item 3の左、Item 3の右)。

しかし、スペースが分配されるのは、アイテムとアイテムの間、およびコンテナの端とアイテムの間です。余分なスペース160pxは、コンテナ左端〜Item 1左端、Item 1右端〜Item 2左端、Item 2右端〜Item 3左端、Item 3右端〜コンテナ右端 の4つの「隙間」に分配されます。

分配のルールは「各アイテムの周囲に均等」なので、Item 1の右側とItem 2の左側には同じ量のスペースが割り当てられ、それらが合わさってItem 1とItem 2の間のスペースになります。具体的には、余分なスペース160pxは、Item 1の左側、Item 1の右側 + Item 2の左側、Item 2の右側 + Item 3の左側、Item 3の右側、の4箇所に分配されるように見えますが、正確には「各アイテムの周囲に同じ量のスペースが割り当てられる」と考えます。

Item 1の左側スペース = S
Item 1の右側スペース = S
Item 2の左側スペース = S
Item 2の右側スペース = S
Item 3の左側スペース = S
Item 3の右側スペース = S

コンテナ左端〜Item 1左端 = S
Item 1右端〜Item 2左端 = S + S = 2S
Item 2右端〜Item 3左端 = S + S = 2S
Item 3右端〜コンテナ右端 = S

合計スペース: S + 2S + 2S + S = 6S
これが余分なスペース160pxに等しいので、6S = 160px となります。
したがって、S = 160px / 6 ≒ 26.67px です。

Item 1の左側スペースは約26.67px、Item 3の右側スペースも約26.67pxです。
Item 1とItem 2の間のスペースは 2S = 約53.33px です。
Item 2とItem 3の間のスペースも 2S = 約53.33px です。

図解 (テキストベース):

+-------------------------------------------------------+
| コンテナ (幅: 400px) |
| [~27] +-----------+ [~53] +-----------+ [~53] +-----------+ [~27] |
| [余白] | Item 1 | [余白] | Item 2 | [余白] | Item 3 | [余白] |
| [ ] +-----------+ [ ] +-----------+ [ ] +-----------+ [ ] |
+-------------------------------------------------------+
^ 主軸の開始 ^ 主軸の終了
(左端) (右端)

数値は概算です。実際には小数点以下の精度で計算されます。

space-aroundは、アイテム間に程よい間隔を持たせつつ、端にも少し隙間を空けたい場合に有効です。ただし、端のスペースがアイテム間のスペースの半分になるため、視覚的にアイテム間の間隔が広く見えがちになる点に注意が必要です。

3.6. justify-content: space-evenly;

  • 意味: 利用可能な余分なスペースを、Flexアイテム間と、両端(コンテナの開始/終了位置と最初の/最後のアイテムの間)に完全に均等に分配します。
  • 挙動: すべての隙間(アイテム間、コンテナ左端〜最初のアイテム、最後のアイテム〜コンテナ右端)の量が同じになります。
  • 備考: space-aroundよりも新しい値であり、比較的最近のCSSレベルで導入されました。すべてのモダンブラウザでサポートされていますが、古いブラウザでは利用できない可能性があります(Can I useなどで確認推奨)。

コード例:

HTML:
“`html

Item 1
Item 2
Item 3

“`

CSS:
“`css
.flex-container {
display: flex;
width: 400px;
border: 2px solid #007bff;
padding: 10px;
box-sizing: border-box;
}

.flex-item {
background-color: #e9ecef;
border: 1px solid #ced4da;
/ margin: 5px; /
padding: 10px;
width: 80px; / アイテムの幅 /
text-align: center;
}

.space-evenly {
justify-content: space-evenly; / ここで指定 /
}
“`

解説:

アイテムにマージンがないと仮定し、コンテナの幅400px、アイテム3つの合計幅240px、余分なスペース160pxという条件は同じです。

justify-content: space-evenly;を指定すると、この160pxの余分なスペースが、すべての「隙間」に完全に均等に分配されます。アイテムが3つある場合、隙間は4箇所です。

  1. コンテナ左端 〜 Item 1左端
  2. Item 1右端 〜 Item 2左端
  3. Item 2右端 〜 Item 3左端
  4. Item 3右端 〜 コンテナ右端

したがって、各隙間のスペースは 160px / 4 = 40px となります。

図解 (テキストベース):

+-------------------------------------------------------+
| コンテナ (幅: 400px) |
| [ 40px ] +-----------+ [ 40px ] +-----------+ [ 40px ] +-----------+ [ 40px ] |
| [ 余白 ] | Item 1 | [ 余白 ] | Item 2 | [ 余白 ] | Item 3 | [ 余白 ] |
| [ ] +-----------+ [ ] +-----------+ [ ] +-----------+ [ ] |
+-------------------------------------------------------+
^ 主軸の開始 ^ 主軸の終了
(左端) (右端)

space-evenlyは、アイテム間隔と両端のスペースを視覚的に完全に統一したい場合に最適です。space-aroundの「端のスペースが狭く見える問題」を解決し、よりバランスの取れた配置を提供します。利用可能な場合は、space-aroundよりもspace-evenlyの方が意図した間隔になりやすいかもしれません。

その他の値 (stretch, start, end, left, right, normal)

justify-contentには、上記の主要な値の他に、いくつかの値が存在します。これらの値は、特定のモード(例えばグリッドレイアウト)や旧仕様、またはflex-directionや記述モード(Writing Mode)に依存する挙動を持ちますが、Flexboxの一般的な使用においては、上記6つの値が最も一般的で強力です。

  • stretch: Flexアイテムがmain-sizeプロパティ (通常はwidthまたはheight) を持たず、かつflex-wrap: nowrap;の場合に、コンテナの主軸方向のサイズに合わせてアイテムを伸ばします。しかし、flex-basiswidth/heightが指定されているアイテムには影響しません。Flexboxでjustify-content: stretch;が有効になるケースは限られており、通常はalign-items: stretch; (交差軸) の方がよく使われます。
  • start, end: これらの値は、flex-start, flex-endと似ていますが、記述モード(Writing Mode)に依存します。例えば、左から右に書く言語ではstartは左、右から左に書く言語ではstartは右になります。flex-start, flex-endは物理的な方向(開始/終了)に基づいて常に同じ挙動をするため、一般的にはflex-start/flex-endの使用が推奨されます。
  • left, right: これらの値は、その名の通り物理的な左端、右端にアイテムを寄せますが、flex-directionや記述モードによって開始/終了位置が変わるFlexboxの哲学とは少し異なります。こちらも一般的なFlexboxレイアウトではあまり使用されません。
  • normal: Flexboxにおいては、通常flex-startと同じ挙動をします。文脈によって他の挙動を示すこともありますが、Flexboxではflex-startと同等と覚えておいて問題ありません。

これらの値は、特定の高度なレイアウト要件や、古い仕様との互換性のために存在しますが、入門段階ではflex-start, flex-end, center, space-between, space-around, space-evenlyの6つを理解しておけば十分です。

4. flex-direction: column;の場合のjustify-content

これまでの解説では、Flexコンテナのflex-directionがデフォルトのrowであると仮定しました。この場合、主軸は横方向になるため、justify-contentはアイテムの横方向の配置を制御しました。

では、flex-direction: column;を指定して、主軸が縦方向になった場合はどうなるでしょうか?

Flexboxのルールでは、justify-contentは常に主軸方向の配置を制御します。したがって、flex-direction: column;の場合は、justify-contentはFlexアイテムの縦方向の配置を制御するようになります。

  • justify-content: flex-start; (column): アイテムをコンテナの上端に寄せて配置します。
  • justify-content: flex-end; (column): アイテムをコンテナの下端に寄せて配置します。
  • justify-content: center; (column): アイテムをコンテナの垂直方向の中央に配置します。
  • justify-content: space-between; (column): 最初のアイテムを上端に、最後のアイテムを下端に配置し、間のスペースを縦方向に均等に分配します。
  • justify-content: space-around; (column): 各アイテムの上下にスペースを均等に分配します。
  • justify-content: space-evenly; (column): アイテム間と両端(上下)にスペースを完全に均等に分配します。

コード例 (flex-direction: column;justify-content: center;)

HTML:
“`html

Item 1
Item 2
Item 3

“`

CSS:
“`css
.flex-container {
display: flex;
flex-direction: column; / 主軸を縦方向に設定 /
height: 300px; / コンテナの高さ(主軸方向のサイズ) /
width: 150px; / 交差軸方向のサイズ /
border: 2px solid #007bff;
padding: 10px;
box-sizing: border-box;
}

.flex-item {
background-color: #e9ecef;
border: 1px solid #ced4da;
margin: 5px;
padding: 10px;
/ widthは交差軸、heightは主軸のサイズになるが、
columnではflex-basisやalign-itemsで制御することが多い
/
/ height: 50px; / / アイテムの高さ(主軸方向のサイズ) /
text-align: center;
width: auto; / 交差軸方向はデフォルトでstretchされることが多い /
}

.column-center {
justify-content: center; / 縦方向の中央揃えになる /
}
“`

解説:

この例では、flex-direction: column;を指定しているため、主軸は縦方向です。コンテナの高さは300pxです。各アイテムはデフォルトのままだと縦方向にコンテンツに応じてサイズが決まるか、flex-basisflex-growなどで制御されます。仮に各アイテムのデフォルトの高さを占有するスペースを考慮し、合計の高さがコンテナの高さより小さい場合、余分な縦方向のスペースが生まれます。

justify-content: center;を指定すると、この余分な縦方向のスペースがアイテムの集合体の上下に均等に分配されます。結果として、アイテム全体がコンテナの垂直方向の中央に配置されます。

flex-direction: column;の場合、justify-contentは垂直方向の配置、align-itemsは水平方向の配置を制御するというように、軸の役割が入れ替わる点に注意が必要です。この「主軸に沿ってアイテムを配置」というFlexboxの原則を理解していれば、flex-directionが変わってもjustify-contentの挙動を正しく予測できます。

5. justify-contentの使用例と応用テクニック

justify-contentは、ウェブサイトの様々な部分で活用できます。いくつかの一般的な使用例と応用テクニックを紹介します。

例1: ナビゲーションメニュー

ヘッダーによくある横並びのナビゲーションメニューは、Flexboxとjustify-contentの典型的な使用例です。

  • 左寄せナビ: justify-content: flex-start; (デフォルトのまま)
  • 右寄せナビ: justify-content: flex-end;
  • 中央寄せナビ: justify-content: center;
  • 均等配置ナビ: justify-content: space-between; または space-evenly;

特にspace-betweenは、ロゴを左端に、ナビゲーションリンク群を右端に配置したい場合などにも応用できます。この場合、コンテナ全体をFlexにし、ロゴとナビゲーションリンクのulなどの要素をFlexアイテムとして配置します。

HTML:
“`html

“`

CSS:
“`css
.site-header {
display: flex;
justify-content: space-between; / ロゴとナビを左右に振り分け /
align-items: center; / 垂直方向の中央揃え(交差軸) /
padding: 10px 20px;
background-color: #f8f9fa;
border-bottom: 1px solid #e9ecef;
}

.main-nav {
display: flex; / li要素を横並びのFlexアイテムにする /
list-style: none;
margin: 0;
padding: 0;
/ li間のスペースはjustify-contentではなく、liにmarginをつけるのが一般的 /
/ justify-content: space-between; / こちらはli間のスペース用 / /
}

.main-nav li {
margin-left: 20px; / 各リスト項目の左側にマージン /
}

.logo {
font-weight: bold;
font-size: 1.2em;
}
``
この例では、
.site-headerspace-betweenを使い、子要素である.logonavを左右に配置しています。さらに、.main-navdisplay: flex;を使い、その子要素であるliを横並びにしています。ここではli間のスペースはmargin-leftで調整していますが、.main-navjustify-content: space-between;などを指定し、liからマージンをなくす方法でも実現できます(ただし、li`間のスペースだけでなく、両端にもスペースが入るか入らないかなどの違いが出ます)。

例2: 単一要素の完全中央配置

ある要素をFlexコンテナの中で、水平方向・垂直方向の両方で完全に中央に配置したい場合は、justify-content: center;align-items: center;を組み合わせて使用するのが最も一般的で簡単な方法です。

HTML:
“`html

完全に中央!

“`

CSS:
“`css
.center-container {
display: flex;
justify-content: center; / 主軸(横)方向の中央揃え /
align-items: center; / 交差軸(縦)方向の中央揃え /
width: 300px;
height: 200px;
border: 2px solid #dc3545;
}

.centered-item {
background-color: #ffc107;
padding: 20px;
}
“`

このテクニックは、モーダルウィンドウやローディングスピナーなどを画面中央に表示する際によく利用されます。

例3: カードリストの配置

商品のカードやブログ記事のプレビューカードなどを並べる際にもjustify-contentは有効です。特にflex-wrap: wrap;と組み合わせて使用する場合、各行のアイテムの配置に影響を与えます。

HTML:
“`html

Card 1
Card 2
Card 3
Card 4
Card 5

“`

CSS:
“`css
.card-list {
display: flex;
flex-wrap: wrap; / コンテナ幅を超えたら改行 /
width: 500px; / 仮のコンテナ幅 /
border: 2px solid #28a745;
padding: 10px;
box-sizing: border-box;
}

.card {
width: 150px; / カードの幅 /
height: 100px;
background-color: #e2e6ea;
border: 1px solid #d6d8db;
margin: 10px; / カード間の余白 /
text-align: center;
line-height: 100px; / 垂直方向の中央寄せ用 /
}

/ 各行のカードの配置 /
.card-list {
justify-content: flex-start; / 各行を左寄せ (デフォルト) /
/ justify-content: center; / 各行を中央寄せ / /
/ justify-content: space-between; / 各行のアイテムを両端と間に均等配置 / /
/ justify-content: space-around; / 各行のアイテムの周囲に均等配置 / /
/ justify-content: space-evenly; / 各行のアイテム間と両端に均等配置 / /
}
“`

flex-wrap: wrap;を使用する場合、justify-content各行のアイテムの配置に影響を与えます。例えば、最後に1つまたは2つのアイテムだけが残って次の行に配置された場合、その少ない数のアイテムがその行の中でどのように配置されるかをjustify-contentが制御します。

例4: レスポンシブデザインでの切り替え

画面サイズに応じてアイテムの配置を変えたい場合、メディアクエリを使ってjustify-contentの値を切り替えることができます。

例えば、小さい画面ではアイテムを中央に寄せ、大きい画面ではアイテム間にスペースを設けたい場合:

“`css
.responsive-container {
display: flex;
flex-wrap: wrap;
/ 小さい画面では中央寄せ /
justify-content: center;
}

@media (min-width: 768px) {
.responsive-container {
/ 大きい画面ではアイテム間にスペース /
justify-content: space-between;
}
}
“`

このように、メディアクエリと組み合わせることで、様々なデバイスサイズに対応した柔軟なレイアウトを実現できます。

6. justify-contentを使う上での注意点とトラブルシューティング

justify-contentは非常に強力ですが、正しく機能させるためにはいくつかのポイントを押さえておく必要があります。また、よくある問題とその解決策を知っておくと役立ちます。

注意点1: display: flex; または display: inline-flex; が必須

justify-contentはFlexコンテナのプロパティです。したがって、このプロパティを指定する要素には、必ずdisplay: flex;またはdisplay: inline-flex;が指定されていなければなりません。これらの指定がない要素にjustify-contentを適用しても、何も効果はありません。Flexアイテムにjustify-contentを指定しても効果はありません(justify-contentはコンテナのプロパティだからです)。

注意点2: 主軸方向のサイズが影響する

justify-contentによるスペースの分配は、Flexコンテナの主軸方向のサイズが、Flexアイテムの合計主軸方向サイズよりも大きい場合にのみ効果を発揮します。

  • flex-direction: row;の場合: コンテナのwidthが、アイテムの合計widthと合計左右マージンより大きい場合に余分な横方向スペースが生まれ、justify-contentが有効になります。
  • flex-direction: column;の場合: コンテナのheightが、アイテムの合計heightと合計上下マージンより大きい場合に余分な縦方向スペースが生まれ、justify-contentが有効になります。

もしアイテムがコンテナからはみ出す(オーバーフローする)場合、余分なスペースは存在しないため、justify-contentによる配置効果はほとんど失われます。通常、アイテムは主軸の開始位置から順番に並び、コンテナをはみ出します。

注意点3: flex-wrap: wrap;align-content の関係

justify-contentは、Flexコンテナが単一行(flex-wrap: nowrap;)の場合、または複数行にわたる場合でも各行内におけるアイテムの主軸方向の配置を制御します。

一方、Flexコンテナが複数行にわたって折り返す(flex-wrap: wrap;)場合、行間のスペース分配や整列を制御するのはjustify-contentではなくalign-contentプロパティです。

この2つは混同しやすいため注意が必要です。justify-content横(または縦)一列の中でのアイテムの並び方とスペース、align-content複数行(または複数列)の並び方とスペースを制御すると覚えましょう。

注意点4: アイテムのマージンとの相互作用

Flexアイテムに設定したmarginプロパティは、justify-contentによって分配されるスペースとは別個に考慮されます。justify-contentは、アイテムとそのマージンの外側の境界線の間にスペースを挿入します。

例えば、justify-content: space-between;でアイテム間にスペースを空けつつ、各アイテムに左右マージンを設定した場合、アイテム間の実際のスペースは「アイテムAの右マージン」+「justify-contentによるスペース」+「アイテムBの左マージン」の合計になります。

特に、margin: auto;はFlexアイテムの主軸方向の余分なスペースを吸収する性質があります。justify-contentと同時にmargin: auto;をアイテムに使うと、margin: auto;が優先されてスペースを吸収し、justify-contentの効果が意図通りにならない場合があります。特定のアイテムだけを端に寄せたい場合などにmargin: auto;が使われることはありますが、justify-contentで全体の配置を制御する場合は、アイテム個別のマージンには注意が必要です。

トラブルシューティング例: justify-content: center;が効かない

  • 確認1: 親要素にdisplay: flex;が指定されていますか? (display: flex;がなければjustify-contentは機能しません)
  • 確認2: コンテナの主軸方向のサイズがアイテムの合計主軸方向サイズよりも大きいですか? (flex-direction: row;ならコンテナ幅 > アイテム合計幅 + マージン、flex-direction: column;ならコンテナ高さ > アイテム合計高さ + マージン)
    • アイテムの合計サイズがコンテナサイズを超える場合(オーバーフロー)、justify-contentの効果は限定的になります。
    • アイテムにflex-growが指定されていて、余分なスペースを全てアイテム自身が吸収して伸びている場合、justify-contentのための余分なスペースが残らないため効果が出ないことがあります。
  • 確認3: flex-direction: column;の場合、justify-contentは縦方向の配置を制御します。横方向の中央寄せを期待しているなら、align-items: center;を確認してください。
  • 確認4: アイテムにmargin: auto;が設定されていませんか? margin: auto;は利用可能なスペースを吸収するため、justify-contentのスペース分配と競合する可能性があります。

これらの点を確認することで、多くのjustify-contentに関する問題は解決できます。

7. まとめ:justify-contentを使いこなす

この記事では、CSS Flexboxにおけるjustify-contentプロパティについて、その基本的な役割から具体的な各値の挙動、コード例、応用、そして注意点まで、詳しく解説しました。

justify-contentは、Flexコンテナの主軸方向におけるFlexアイテムの配置や、余分なスペースの分配方法を制御するための非常に重要なプロパティです。

  • flex-start: 主軸の開始位置に寄せる(デフォルト)
  • flex-end: 主軸の終了位置に寄せる
  • center: 主軸の中心に寄せる
  • space-between: アイテム間に均等なスペースを分配(両端にはスペースなし)
  • space-around: アイテムの周囲に均等なスペースを分配(アイテム間のスペースは両端の2倍)
  • space-evenly: アイテム間と両端に完全に均等なスペースを分配

これらの値を適切に使い分けることで、ヘッダーのナビゲーション、フッターの要素、カードリスト、フォーム要素、単一要素の中央配置など、様々なウェブサイトのレイアウトを柔軟かつ効率的に構築することができます。

justify-contentをマスターするには、Flexboxの基本であるFlexコンテナ、Flexアイテム、そして主軸・交差軸の概念をしっかりと理解することが不可欠です。また、flex-directionによって主軸の方向が変わるため、justify-contentが制御する方向も変わることを忘れてはなりません。

Flexboxには、justify-contentの他にも、交差軸のアイテム整列を制御するalign-items、複数行の整列を制御するalign-content、個別のアイテムの配置を制御するalign-self、アイテムのサイズ調整を制御するflex-grow, flex-shrink, flex-basisなど、多くの強力なプロパティがあります。justify-contentはFlexbox全体のほんの一部ですが、レイアウトの見た目を大きく左右する重要な要素です。

ぜひ実際にコードを書きながら、様々な値やアイテム数、コンテナサイズでjustify-contentの挙動を確認してみてください。実践を通じて理解を深めることが、Flexboxを使いこなすための近道です。

この記事が、あなたのFlexbox学習、特にjustify-contentの理解の一助となれば幸いです。

8. 用語集

  • Flexbox (Flexible Box Layout): CSSのレイアウトモデルの一つ。コンテナ内のアイテムのスペース分配や配置を柔軟に制御するために設計された。
  • Flexコンテナ (Flex Container): display: flex; または display: inline-flex; が指定された親要素。この要素のプロパティによって、直下の子要素(Flexアイテム)のレイアウトが制御される。
  • Flexアイテム (Flex Item): Flexコンテナの直下の子要素。Flexコンテナのレイアウトの影響を受ける個々の要素。
  • 主軸 (Main Axis): Flexアイテムが配置される主要な方向。flex-directionプロパティで決定される(rowまたはcolumn)。
  • 交差軸 (Cross Axis): 主軸に対して垂直な方向。
  • flex-direction: Flexコンテナのプロパティ。主軸の方向(横方向のrowrow-reverse、縦方向のcolumncolumn-reverse)およびアイテムの並び順を定義する。
  • justify-content: Flexコンテナのプロパティ。主軸方向におけるFlexアイテムの配置(寄せ方やアイテム間のスペース分配)を制御する。
  • align-items: Flexコンテナのプロパティ。交差軸方向におけるFlexアイテムの整列を制御する(各アイテムが交差軸方向でどのように配置されるか)。
  • align-content: Flexコンテナのプロパティ。flex-wrap: wrap;が指定され、複数行にわたるFlexアイテムがある場合に、複数行全体の交差軸方向のスペース分配や整列を制御する。
  • gap (または grid-gap): Flexbox(およびGridレイアウト)のプロパティ。FlexアイテムやGridアイテムの間に、列方向 (column-gap) および行方向 (row-gap) の隙間を一括で設定できる。justify-contentalign-contentによるスペース分配とは異なり、アイテム自体の外側に隙間を設けることができる。

これで、CSSのjustify-contentプロパティに関する約5000語の詳細な解説記事は完了です。この情報が、Flexboxを使ったレイアウト構築の助けとなれば幸いです。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール