justify-content と align-items をひと言で
flex コンテナでは、justify-content がアイテムを 主軸 (行に沿った方向) に配分し、align-items が 交差軸 (行に対して上下の方向) で揃えます。どちらもコンテナに書きます:
ボックスは両方向の中央にあります。始まりと終わりの端から同じ距離で、上と下からも同じ距離です。height: 140px を取ると、コンテナがアイテム自身の高さまで縮むので、align-items: center はすることがなくなります。
justify-content のすべての値を実測する
下の各行は、同じ 3 つのアイテムに違う justify-content を指定したものです。各行の上のラベルの数値は、ブラウザが残したすき間です。最初のアイテムの前、アイテムの間、最後のアイテムの後の順に並んでいます。
コンテナは 420px、アイテムは 180px を使うので、空きスペースは 240px です。その行き先は次のとおりです:
| 値 | 空きスペースの行き先 | デモのすき間 |
|---|---|---|
flex-start (と start) | すべてアイテムの後 | 0 / 0 / 0 / 240 |
center | 半分が前、半分が後 | 120 / 0 / 0 / 120 |
flex-end (と end) | すべてアイテムの前 | 240 / 0 / 0 / 0 |
space-between | アイテムの間だけ | 0 / 120 / 120 / 0 |
space-around | 各アイテムの両側に同じだけ。両端は半分 | 40 / 80 / 80 / 40 |
space-evenly | 両端も含めてすべてのすき間が同じ | 60 / 60 / 60 / 60 |
flex-start は flex の方向に従い、start は書字方向に従います。違いが出るのは row-reverse や column-reverse のときだけで、そのとき flex-start は逆側の端になります。
align-items のすべての値
align-items は行に対して直角の方向に働きます。下のアイテムは高さがばらばらなので、各値がどう扱うかがわかります:
| 値 | 交差軸での動き |
|---|---|
stretch (初期値) | 高さを指定していないアイテムが、コンテナいっぱいに伸びる |
flex-start (と start) | アイテムは自分の高さのまま上に置かれる |
center | アイテムは自分の高さのまま中央に置かれる |
flex-end (と end) | アイテムは下に置かれる |
baseline | 文字の 1 行目が同じベースラインにそろうようにアイテムが動く |
baseline のボックスでは、1 つ目が大きく、2 つ目は上に padding があるのに、3 つの「Ag」のラベルが同じ線の上に並んでいます。大きな見出しと小さな文字が混ざる行や、ラベルと入力欄の行にはこの値を使います。
クリックして揃える
3 × 3 のグリッドのどのセルでもクリックしてください。ボックスがそこに移動し、そこに置くための CSS が下に表示されます:
ピッカーの行は align-items を、列は justify-content を変えます。真ん中のセルが定番の「div の中央寄せ」です。
縦並びでは 2 つが入れ替わる
justify-content は常に主軸に従います。flex-direction: column では主軸が縦になるので、justify-content がアイテムを上下に、align-items が左右に動かします:
取り違えたときは、レイアウトを書き直すのではなく 2 つのプロパティを入れ替えましょう。
align-self と auto の margin: 1 つのアイテムだけ
アイテムに align-self を付けると、そのアイテムについて align-items を上書きします。flexbox に justify-self はありません。1 つのアイテムを主軸に沿って動かすには auto の margin を付けます。auto の margin はその側の空きスペースをすべて使います:
緑のアイテムだけが下に下がり、琥珀色のアイテムは行の反対側の端まで押し出され、ほかは始まりにとどまります。
複数行のとき: align-content
align-items はアイテムをその行の中で揃えます。コンテナが複数行に折り返すとき、行そのもの の間隔を決めるのが align-content で、justify-content と同じ値を使えます。nowrap のコンテナでは何もしません。その 1 行が常にコンテナの高さいっぱいになるからです。flex-wrap のページ で実例を見られます。
よくある間違い
- 軸を取り違える。
justify-contentは並ぶ方向、align-itemsはそれと直角の方向です。縦並びでは、縦方向の中央寄せはjustify-content: centerです。 - 空きスペースがない。
flex: 1のアイテムがスペースをすべて使うので、justify-contentが配分するものがありません。コンテナがinline-flexでアイテムとちょうど同じ幅のときも同じです。 align-itemsなのに高さがない。 内容と同じ高さのコンテナでは、揃える余地がありません。heightかmin-heightを指定しましょう。- flexbox で
justify-selfを探す。 flexbox では無視されます。アイテムにmargin-inline-start: auto(またはmargin-left: auto) を使いましょう。 align-items: stretchなのに伸びない。 自分のheightを持つアイテムはそれを保ちます。高さを取り除きましょう (最小値が必要ならmin-heightを使います)。- プロパティをアイテムに書く。 どちらも flex コンテナに書きます。アイテムに書くのは
align-selfだけです。
よくある質問
justify-content と align-items の違いは何ですか?
justify-content はアイテムを主軸、つまり並ぶ方向 (flex-direction: row なら横) に沿って配分します。align-items は交差軸 (横並びなら縦) に沿って配置します。縦並びでは 2 つが入れ替わり、justify-content が縦方向になります。
space-between、space-around、space-evenly の違いは何ですか?
space-between は最初のアイテムの前と最後のアイテムの後に余白を置かず、残りをアイテムの間で分けます。space-around はすべてのアイテムの両側に同じ余白を置くので、両端はすき間の半分になります。space-evenly は両端も含めて、すべてのすき間を同じにします。
justify-content が効かないのはなぜですか?
たいていは配分する空きスペースがないからです。アイテムに flex-grow や flex: 1 がある、またはコンテナの幅がアイテムと同じしかない (たとえば display: inline-flex や float したコンテナ) といった場合です。display: flex がアイテムではなく親に付いているかも確認しましょう。
align-items: center で縦方向の中央に寄らないのはなぜですか?
おそらくコンテナの高さが内容とぴったり同じで、中央に寄せる余地がないからです。flex コンテナに高さか min-height を与えると、アイテムが真ん中に移動します。
align-self は何をしますか?
align-self は、1 つのアイテムについてコンテナの align-items を上書きします。たとえば 1 つの子要素に align-self: flex-end を付けると、その子要素だけが交差軸の終わりに移動し、ほかは align-items で置かれた位置にとどまります。
flexbox に justify-self はありますか?
ありません。主軸はすべてのアイテムで共有されるので、flexbox は justify-self を無視します。1 つのアイテムを主軸に沿って押し出すには、margin-inline-start: auto のような auto の margin を使います。justify-self は grid で効きます。