display: flex
は便利でもうfloat
とclearfix
には戻れない感じです。そんな便利なflexですが、先日Twitterでalign-content
が効かないという話がありましたので、その原因と仕組みについて解説します。
やりたいこと
実現したいのは、縦方向に均等に配置したい以下のような感じです。
ダメな例
.wrapper {
display: flex;
flex-direction: column;
align-content: space-between;
flex-wrap: wrap;
}
flexを使って配置し、今回は縦方向に均等に並べたいのでflex-direction
をcolumn
にし、align-content: space-between
を使いました。一見すると正しいように見えますが、実はうまくいきません。
正しい例
.wrapper {
display: flex;
flex-direction: column;
justify-content: space-between;
flex-wrap: wrap;
}
align-content
をjustify-content
に直しました。えっ、justify-content
って横方向の整列に関するプロパティじゃないの?と思う方もいるかもしれません。そこに実は落とし穴があったのです。
justify-contentは「横方向」の整列ではない
justify-content
、align-content
はそれぞれ横方向・縦方向の整列だと思っている方も多いでしょう(自分もこの一件があるまでそう思っていました)。この表現は少し違い、正確にはそれぞれ「主軸方向」「主軸と交差する方向」の整列です。
では「主軸」って何でしょうか。ここで記事タイトルにもあるflex-direction
の登場です。実はflex-direction
が主軸方向を定めていたのです。デフォルトでは横方向を主軸と定めているので、justify-content
が横方向を整列させます。
ダメな例の場合、flex-direction
をcolumn
、つまり縦方向に指定したので主軸は縦方向になります。そのため縦方向の整列にはjustify-content
を指定する必要があります。
flex-directionをやめればいいんじゃない?
ここでの例の場合、flex-direction
をデフォルトに直すことでも解決します。ただ、flex-direction
をcolumn
にする必要がある場合、例えばリスト上から下、左から右へ流していく場合などはflex-direction
をcolumn
にするでしょう。(デモの3番目の例)
上級編
余談になりますが、flex-direction: row
で、なおかつその要素のdir
属性がrtl
だと(右から左へ読むアラビア語など)主軸は右から左となります。そのため通常のflex-direction: row-reverse
と挙動が逆になります。dir="rtl"
でも縦方向は変わらず、上から下が主軸になります(読む方向は上から下なので)。ややこしいですねー。
参考