Flexboxで要素を垂直方向および水平方向に中央揃えする方法
以下は、2つの一般的なセンタリングソリューションです。
1つは垂直方向に配置されたフレックスアイテム用(flex-direction: column
)で、もう1つは水平方向に配置されたフレックスアイテム用(flex-direction: row
)です。
どちらの場合でも、中央に配置されたdivの高さは、可変、未定義、不明など、さまざまです。中央のdivの高さは関係ありません。
両方のHTMLは次のとおりです。
<div id="container"><!-- flex container -->
<div class="box" id="bluebox"><!-- flex item -->
<p>DIV #1</p>
</div>
<div class="box" id="redbox"><!-- flex item -->
<p>DIV #2</p>
</div>
</div>
CSS(装飾的なスタイルを除く)
フレックスアイテムが垂直に積み重ねられている場合:
#container {
display: flex; /* establish flex container */
flex-direction: column; /* make main axis vertical */
justify-content: center; /* center items vertically, in this case */
align-items: center; /* center items horizontally, in this case */
height: 300px;
}
.box {
width: 300px;
margin: 5px;
text-align: center; /* will center text in <p>, which is not a flex item */
}
デモ
フレックスアイテムが水平に積み重ねられている場合:
flex-direction
上記のコードからルールを調整します。
#container {
display: flex;
flex-direction: row; /* make main axis horizontal (default setting) */
justify-content: center; /* center items horizontally, in this case */
align-items: center; /* center items vertically, in this case */
height: 300px;
}
デモ
フレックスアイテムのコンテンツの中央揃え
フレックスフォーマットコンテキストの範囲は、親子関係に制限されています。子を超えたフレックスコンテナの子孫はフレックスレイアウトに参加せず、フレックスプロパティを無視します。基本的に、フレックスプロパティは子を超えて継承できません。
したがって、フレックスプロパティを子に適用するには、常に、display: flex
またはdisplay: inline-flex
親要素に適用する必要があります。
フレックスアイテムに含まれるテキストまたは他のコンテンツを垂直方向または水平方向、あるいはその両方に中央揃えするには、アイテムを(ネストされた)フレックスコンテナーにして、中央揃えのルールを繰り返します。
.box {
display: flex;
justify-content: center;
align-items: center; /* for single line flex container */
align-content: center; /* for multi-line flex container */
}
詳細はこちら:フレックスボックス内のテキストを垂直方向に配置する方法は?
または、margin: auto
フレックスアイテムのコンテンツ要素に適用することもできます。
p { margin: auto; }
フレックスauto
マージンについては、こちらをご覧ください:フレックスアイテムの整列方法(box#56を参照)。
フレックスアイテムの複数行の中央揃え
フレックスコンテナーに複数の行がある場合(折り返しのため)、align-content
プロパティは軸間の配置に必要です。
スペックから:
8.4。フレックスラインのパッキング:align-content
プロパティ
align-content
フレックスコンテナ内のフレックスコンテナのライン整列プロパティは、いつどのように似たクロス軸に余分なスペースがあり、justify-content
メイン軸内に整列する個々の項目。
このプロパティは、単一行のフレックスコンテナーには影響しません。
詳細はこちら:flex-wrapはalign-self、align-items、align-contentとどのように連携しますか?
ブラウザのサポート
Flexboxは、IE <10を除くすべての主要なブラウザーでサポートされています。Safari 8やIE10などの一部の最近のブラウザーバージョンでは、ベンダープレフィックスが必要です。接頭辞をすばやく追加するには、Autoprefixerを使用します。この回答の詳細。
古いブラウザ向けのセンタリングソリューション
CSSテーブルと配置プロパティを使用した代替のセンタリングソリューションについては、この回答を参照してください:https : //stackoverflow.com/a/31977476/3597276