• Flexboxのjustify-contentは主軸、align-itemsは交差軸をそろえる

Flexboxのjustify-contentは主軸、align-itemsは交差軸をそろえる

公開日: 執筆:佐藤

Flexboxで項目を配置するときは、先にflex-directionで主軸の向きを確認します。justify-contentは主軸に沿って項目をそろえ、align-itemsは主軸と直交する交差軸で項目をそろえます。

「横はjustify、縦はalign」と覚えると、flex-direction: columnへ変えたときに反対になります。プロパティ名を画面の上下左右へ直接対応させず、主軸と交差軸へ対応させます。

display:flexの直接の子がflex itemになる

2014年3月25日のCSS Flexible Box Layout Module Level 1は、displayへflexとinline-flexを加えています。display: flexを指定した要素はblock-levelのflex containerを作り、その通常フローにある直接の子がflex itemになります。

.actions {
  display: flex;
}

孫要素まで自動的に同じflex itemになるわけではありません。配置したい項目の親へdisplay: flexを指定し、その直下にどの要素があるかを確認します。

flex-directionが主軸の向きを決める

flex-directionの初期値はrowです。仕様は、次の四つの値を定義しています。

値 主軸の向き 項目の並び
row 文章の行方向 主軸の始点から終点へ並ぶ
row-reverse 行方向を反転 主軸の始点と終点を入れ替えて並ぶ
column 文章のblock方向 主軸の始点から終点へ縦方向に並ぶ
column-reverse block方向を反転 主軸の始点と終点を入れ替えて並ぶ

日本語の横書きでrowを使う単純な例では、主軸は左右方向、交差軸は上下方向になります。columnへ変えると、主軸が上下方向、交差軸が左右方向になります。

row-reverseやcolumn-reverseは見た目の順序を反転します。読み上げやキーボード操作の順序まで都合よく直すものとして使わず、HTMLの順序を先に整えます。

justify-contentは主軸の余白を配分する

justify-contentは、flexible lengthとauto marginを計算したあと、主軸に残る余白を使ってflex itemをそろえます。初期値はflex-startです。

値 主軸での配置
flex-start 主軸の始点側へ寄せる
flex-end 主軸の終点側へ寄せる
center 主軸の中央へまとめる
space-between 最初と最後を両端へ置き、項目間へ均等な余白を置く
space-around 各項目の両側へ同じ余白を割り当てる

項目の幅を足した結果がcontainerの幅と同じなら、配る余白はありません。justify-content: space-betweenを付けても、余白がなければ項目間は広がりません。配置値だけでなく、containerの寸法と各itemの寸法を確認します。

align-itemsは交差軸で全itemの基準をそろえる

align-itemsは、交差軸に沿う配置の初期値を、container内のすべてのflex itemへ与えます。初期値はstretchです。

値 交差軸での配置
flex-start 交差軸の始点側へ寄せる
flex-end 交差軸の終点側へ寄せる
center 交差軸の中央へ置く
baseline itemのbaselineをそろえる
stretch autoの交差寸法を可能な範囲でlineに合わせる

一つのitemだけ基準を変える場合は、item側のalign-selfで上書きできます。全itemの基準を変えるalign-itemsと、一項目だけを変えるalign-selfを分けます。

rowなら両端配置と上下中央を別々に指定する

次は、二つの操作項目を左右の端へ分け、上下方向では中央へそろえる説明用の例です。80pxは動きを確認するための仮の高さです。

.actions {
  display: flex;
  flex-direction: row;
  justify-content: space-between;
  align-items: center;
  min-height: 80px;
}

flex-direction: rowなので、justify-content: space-betweenは左右方向の余白を配ります。align-items: centerは、それと直交する上下方向でitemを中央へ置きます。

同じコードでflex-direction: columnへ変えると、justify-contentは上下方向、align-itemsは左右方向へ作用します。縦並びへ変えたあとで位置が逆になったように見える場合は、二つのプロパティを入れ替える前に、主軸の向きを確認してください。

高さ、overflow、個別寸法は別に確認する

中央配置を指定しても、containerとitemの交差寸法が同じなら、移動できる余白はありません。align-items: centerが効かないように見える場合は、containerの使用高さとitemの高さを調べます。

初期値stretchも、itemの交差寸法がautoの場合に働きます。明示した高さやmin-height、max-heightの制約があれば、期待した高さまで伸びないことがあります。内容がitemに収まらなければ、配置とは別にoverflowも確認します。

2014年3月25日の仕様はLast Call Working Draftです。実案件へ使う場合は、対象ブラウザーで接頭辞なしの構文、必要な代替指定、幅と高さ、折り返しを確認します。仕様に値があることと、対象環境で同じ表示になることを分けてください。

最初の一手は、flex containerを一つ選び、flex-direction、主軸、交差軸、主軸の余白、交差寸法を書き出すことです。その後で、justify-contentとalign-itemsを一つずつ指定します。

戻る