フレックスボックスで要素を垂直方向および水平方向に中央揃えにする方法
以下は、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
orを適用する必要があります。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
フレックスマージンについては、フレックス アイテムの配置方法(ボックス 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 の回答を参照してください。