Menu

CSS justify-content と align-items: すべての値の違い

justify-content は flex アイテムを主軸に沿って、align-items は交差軸に沿って配置します。すべての値を実測して並べ、クリックで揃え方を試せるグリッド、align-self、justify-content が効かないときの原因を解説します。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

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 で効きます。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める