フレックス コンテナーの主軸と交差軸について考えてみましょう。
ソース:ウィキペディア
フレックス アイテムを主軸に沿って配置するには、次のプロパティが 1 つあります。
フレックス アイテムを交差軸に沿って配置するには、次の 3 つのプロパティがあります。
上の画像では、主軸は水平で、交差軸は垂直です。これらはフレックス コンテナーのデフォルトの方向です。
しかし、これらの指示は、flex-direction
財産。
/* main axis is horizontal, cross axis is vertical */
flex-direction: row;
flex-direction: row-reverse;
/* main axis is vertical, cross axis is horizontal */
flex-direction: column;
flex-direction: column-reverse;
(交差軸は常に主軸に対して垂直です。)
軸の働きを説明する上で私が言いたいのは、どちらの方向にも特別なことは何もないように思われるということです。主軸、交差軸、どちらも重要性の点で同等であり、flex-direction
簡単に切り替えることができます。
では、なぜ交差軸には 2 つの追加の配置プロパティが付与されるのでしょうか?
主軸に対して とalign-content
が1 つのプロパティに統合されるのはなぜですか?align-items
主軸にjustify-self
プロパティが設定されないのはなぜですか?
これらのプロパティが役立つシナリオ:
フレックスコンテナの角にフレックスアイテムを配置する
#box3 { align-self: flex-end; justify-self: flex-end; }
フレックスアイテムのグループを右揃えにする(
justify-content: flex-end
)が、最初のアイテムを左揃えにする(justify-self: flex-start
)
ナビゲーション項目のグループとロゴを含むヘッダー セクションを検討してください。justify-self
ロゴを左揃えにし、ナビゲーション項目を右端に配置すると、全体がさまざまな画面サイズに合わせてスムーズに調整されます (「フレックス」)。
- 3 つの flex アイテムを並べる場合は、中央のアイテムをコンテナーの中央 (
justify-content: center
) に貼り付け、隣接するアイテムをコンテナーの端 (justify-self: flex-start
およびjustify-self: flex-end
) に揃えます。
隣接する項目の幅が異なる場合、値space-around
とspace-between
onjustify-content
プロパティでは中央の項目がコンテナーの中央に配置されないことに注意してください。
#container {
display: flex;
justify-content: space-between;
background-color: lightyellow;
}
.box {
height: 50px;
width: 75px;
background-color: springgreen;
}
.box1 {
width: 100px;
}
.box3 {
width: 200px;
}
#center {
text-align: center;
margin-bottom: 5px;
}
#center > span {
background-color: aqua;
padding: 2px;
}
<div id="center">
<span>TRUE CENTER</span>
</div>
<div id="container">
<div class="box box1"></div>
<div class="box box2"></div>
<div class="box box3"></div>
</div>
<p>note that the middlebox will only be truly centered if adjacent boxes are equal width</p>
本稿執筆時点ではjustify-self
、justify-items
フレックスボックス仕様。
しかし、CSS ボックス配置モジュールこれは、すべてのボックス モデルで使用するための共通の配置プロパティ セットを確立するという W3C の未完成の提案ですが、次のようになります。
ソース:ウィキペディア
justify-self
とがjustify-items
考慮されていることに気づくでしょう...ただし、 flexbox の場合は考慮されません。
最後に、主な質問を繰り返します。
「justify-items」プロパティと「justify-self」プロパティがないのはなぜですか?
ベストアンサー1
フレックスアイテムを主軸に沿って整列させる方法
質問にあるように:
フレックス アイテムを主軸に沿って配置するには、次のプロパティが 1 つあります。
justify-content
フレックス アイテムを交差軸に沿って配置するには、次の 3 つのプロパティがあります。
align-content
、align-items
そしてalign-self
。
すると、次のような質問が出てきます。
justify-items
なぜおよびjustify-self
プロパティがないのですか?
一つの答えは、「それらは必要ではないから」かもしれません。
のフレックスボックス仕様フレックス アイテムを主軸に沿って配置するための2 つの方法を提供します。
- キーワード
justify-content
プロパティ、および auto
余白
コンテンツの正当化
のjustify-content
プロパティは、フレックス コンテナーの主軸に沿ってフレックス アイテムを配置します。
これはフレックス コンテナーに適用されますが、フレックス アイテムにのみ影響します。
配置オプションは 5 つあります。
flex-start
~ フレックスアイテムはラインの先頭に向かって詰め込まれます。flex-end
~ フレックスアイテムはラインの最後尾に詰められます。center
~ フレックスアイテムはラインの中央に向かって詰め込まれます。space-between
~ フレックスアイテムは均等に配置され、最初のアイテムはコンテナの一方の端に揃えられ、最後のアイテムは反対側の端に揃えられます。最初のアイテムと最後のアイテムが使用する端は、flex-direction
そして書き込みモード(ltr
またはrtl
)。space-around
~space-between
両端に半角スペースがあること以外は と同じです。
自動マージン
とauto
余白フレックスアイテムは、中央に配置したり、間隔を空けて配置したり、サブグループにまとめたりすることができます。
フレックス コンテナーに適用される とは異なりjustify-content
、auto
マージンはフレックス アイテムに適用されます。
指定された方向のすべての空き領域を消費することによって動作します。
フレックスアイテムのグループを右揃え、最初のアイテムを左揃えにする
質問からのシナリオ:
フレックスアイテムのグループを右揃えにする(
justify-content: flex-end
)が、最初のアイテムを左揃えにする(justify-self: flex-start
)ナビゲーション項目のグループとロゴを含むヘッダー セクションを検討してください。
justify-self
ロゴを左揃えにし、ナビゲーション項目を右端に配置すると、全体がさまざまな画面サイズに合わせてスムーズに調整されます (「フレックス」)。
その他の便利なシナリオ:
コーナーにフレックスアイテムを配置する
質問からのシナリオ:
- コーナーにフレックスアイテムを配置する
.box { align-self: flex-end; justify-self: flex-end; }
フレックスアイテムを垂直方向と水平方向に中央揃えする
margin: auto
justify-content: center
はおよびの代替ですalign-items: center
。
フレックス コンテナー上の次のコードの代わりに:
.container {
justify-content: center;
align-items: center;
}
これをフレックスアイテムで使用できます:
.box56 {
margin: auto;
}
この代替案は次のような場合に便利ですコンテナから溢れたフレックスアイテムを中央に配置する。
フレックスアイテムを中央に配置し、2つ目のフレックスアイテムを最初のフレックスアイテムと端の間に中央に配置する
フレックス コンテナーは、空きスペースを分散することでフレックス アイテムを配置します。
したがって、均等なバランスを作り、中央のアイテムをコンテナの中央に配置し、その横に 1 つのアイテムを配置できるようにするには、カウンターバランスを導入する必要があります。
以下の例では、「実際の」項目 (ボックス 63 と 66) のバランスをとるために、非表示の 3 番目のフレックス項目 (ボックス 61 と 68) が導入されています。
もちろん、この方法は意味論的にはそれほど素晴らしいものではありません。
あるいは、実際の DOM 要素の代わりに疑似要素を使用することもできます。または、絶対位置を使用することもできます。ここでは、3 つの方法すべてについて説明します。フレックスアイテムを中央揃えと下揃えにする
注意: 上記の例は、真の中央揃えの観点から、最も外側のアイテムの高さと幅が等しい場合にのみ機能します。フレックス アイテムの長さが異なる場合は、次の例を参照してください。
隣接するアイテムのサイズが異なる場合にフレックスアイテムを中央に配置する
質問からのシナリオ:
3 つの flex アイテムを並べる場合は、中央のアイテムをコンテナーの中央 (
justify-content: center
) に貼り付け、隣接するアイテムをコンテナーの端 (justify-self: flex-start
およびjustify-self: flex-end
) に揃えます。隣接するアイテムの幅が異なる場合、値
space-around
とspace-between
onjustify-content
プロパティは中央のアイテムをコンテナに対して中央に配置しないことに注意してください(デモを見る)。
前述のように、すべてのフレックス項目の幅または高さが同じでない限り ( に依存)、中央の項目を正確に中央に配置することはできません。この問題は、プロパティ (もちろん、このタスクを処理するように設計されている)flex-direction
の必要性を強く示しています。justify-self
#container {
display: flex;
justify-content: space-between;
background-color: lightyellow;
}
.box {
height: 50px;
width: 75px;
background-color: springgreen;
}
.box1 {
width: 100px;
}
.box3 {
width: 200px;
}
#center {
text-align: center;
margin-bottom: 5px;
}
#center > span {
background-color: aqua;
padding: 2px;
}
<div id="center">
<span>TRUE CENTER</span>
</div>
<div id="container">
<div class="box box1"></div>
<div class="box box2"></div>
<div class="box box3"></div>
</div>
<p>The middle box will be truly centered only if adjacent boxes are equal width.</p>
この問題を解決するには、次の 2 つの方法があります。
解決策1: 絶対位置指定
フレックスボックスの仕様では、フレックスアイテムの絶対配置これにより、兄弟アイテムのサイズに関係なく、中央のアイテムが完全に中央に配置されます。
ただし、絶対位置で配置されたすべての要素と同様に、アイテムは文書フローつまり、コンテナ内のスペースを占有せず、兄弟要素と重ね合わせることができます。
以下の例では、中央の項目が絶対位置で中央に配置され、外側の項目はインフローのままです。ただし、同じレイアウトを逆の方法で実現することもできます。つまり、中央の項目を中央に配置しjustify-content: center
、外側の項目を絶対位置に配置します。
解決策 2: ネストされた Flex コンテナ (絶対配置なし)
.container {
display: flex;
}
.box {
flex: 1;
display: flex;
justify-content: center;
}
.box71 > span { margin-right: auto; }
.box73 > span { margin-left: auto; }
/* non-essential */
.box {
align-items: center;
border: 1px solid #ccc;
background-color: lightgreen;
height: 40px;
}
<div class="container">
<div class="box box71"><span>71 short</span></div>
<div class="box box72"><span>72 centered</span></div>
<div class="box box73"><span>73 loooooooooooooooong</span></div>
</div>
仕組みは次のとおりです:
- 最上位の div (
.container
) は flex コンテナーです。 - 各子 div (
.box
) はフレックス アイテムになりました。 - 各アイテムは、コンテナスペースを均等に分配するために
.box
与えられます。flex: 1
- これで、アイテムは行内のすべてのスペースを占め、幅が均等になりました。
- 各項目を (ネストされた) フレックス コンテナーにして、 を追加します
justify-content: center
。 - これで、各
span
要素は中央に配置されたフレックス アイテムになりました。 - フレックス
auto
マージンを使用して、外側の要素をspan
左右にシフトします。
justify-content
マージンのみを使わずに使用することもできますauto
。
しかし、マージンは常に優先されるjustify-content
ため、ここでは機能しますauto
。仕様から:
および による位置合わせの前に
justify-content
、align-self
正の空きスペースはその次元の自動マージンに分配されます。
justify-content: スペース-同じ (概念)
戻ってjustify-content
ちょっと、もう一つの選択肢のアイデアをご紹介します。
space-same
space-between
~とのハイブリッドですspace-around
。フレックス項目は均等間隔で配置されます ( と同様space-between
)。ただし、両端に半角スペースがある ( と同様space-around
) のではなく、両端に全角スペースがあります。
このレイアウトは次のように実現できます。::before
そして::after
フレックス コンテナ上の疑似要素。
更新:space-evenly
ブラウザは上記を実現する の実装を開始しました。詳細については、この投稿を参照してください。フレックスアイテム間の均等スペース
遊び場(上記のすべての例のコードが含まれています)