主軸に沿ってFlexアイテムを配置する方法
質問で述べたように:
主軸に沿ってフレックスアイテムを配置するには、1つのプロパティがあります。 justify-content
クロス軸に沿ってフレックスアイテムを配置するには、3つのプロパティalign-content
がalign-items
ありalign-self
ます。
質問はそれを尋ねます:
justify-items
とjustify-self
プロパティがないのはなぜですか?
1つの答えは次のとおりです。それらは必要ないためです。
フレキシボックス仕様は提供2つの主軸に沿ってフレックスアイテムを整列させるための方法を。
justify-content
キーワード財産、および
auto
マージン
正当化するコンテンツ
justify-content
プロパティは、Flexコンテナの主軸に沿ってフレックスのアイテムを揃えます。
フレックスコンテナーに適用されますが、フレックスアイテムにのみ影響します。
5つの配置オプションがあります。
flex-start
〜フレックスアイテムはラインの初めに向かって詰められます。
flex-end
〜フレックスアイテムはラインの終わりに向かってパックされます。
center
〜フレックスアイテムはラインの中心に向かって詰め込まれています。
space-between
〜Flexアイテムは等間隔で配置され、最初のアイテムはコンテナーの1つの端に揃えられ、最後のアイテムは反対側の端に揃えられます。最初と最後の項目で使用されるエッジはflex-direction
、書き込みモード(ltr
またはrtl
)によって異なります。
space-around
〜space-between
両端に半角スペースがある以外は同じです。
自動マージン
auto
マージン、フレックス項目は、中心離間又はサブグループにパックすることができます。
justify-content
flexコンテナに適用されるとは異なり、auto
マージンはflexアイテムに適用されます。
それらは、指定された方向にすべての空きスペースを消費することによって機能します。
フレックスアイテムのグループを右に揃えますが、最初のアイテムは左に揃えます
質問のシナリオ:
フレックスアイテムのグループを右揃え(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
です。
flexコンテナのこのコードの代わりに:
.container {
justify-content: center;
align-items: center;
}
これはflexアイテムで使用できます。
.box56 {
margin: auto;
}
この方法は、コンテナーからオーバーフローするフレックスアイテムを中央に配置する場合に役立ちます。
フレックスアイテムを中央に配置し、最初のフレックスアイテムとエッジの間に2番目のフレックスアイテムを中央に配置します。
フレックスコンテナーは、フリースペースを配布することでフレックスアイテムを整列させます。
したがって、均等なバランスを作成し、中央のアイテムを1つのアイテムと並べてコンテナの中央に配置できるようにするには、カウンターバランスを導入する必要があります。
以下の例では、「実際の」アイテム(ボックス63および66)のバランスをとるために、非表示の3番目のフレックスアイテム(ボックス61および68)が導入されています。
もちろん、この方法はセマンティクスの点で優れたものではありません。
または、実際のDOM要素の代わりに疑似要素を使用することもできます。または、絶対配置を使用できます。ここでは、3つの方法すべてについて説明します。中央揃えと下揃えのフレックスアイテム
注:上記の例は、真のセンタリングに関して、最も外側のアイテムの高さ/幅が等しい場合にのみ機能します。フレックスアイテムの長さが異なる場合は、次の例を参照してください。
隣接するアイテムのサイズが異なる場合にフレックスアイテムを中央に配置する
質問のシナリオ:
3つのフレックスアイテムの行で、中央のアイテムをコンテナの中央に貼り付け(justify-content: center
)、隣接するアイテムをコンテナの端に揃えます(justify-self: flex-start
および
justify-self: flex-end
)。
隣接するアイテムの幅が異なる場合、値space-around
とspace-between
on justify-content
プロパティは中央のアイテムをコンテナに対して中央に配置しないことに注意してください(デモを参照)。
前述のように、すべてのflexアイテムが同じ幅または高さ(に依存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:ネストされたフレックスコンテナー(絶対配置なし)
.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
)はflexアイテムになりました。
- 各
.box
アイテムはflex: 1
、コンテナスペースを均等に配分するために与えられます。
- これで、アイテムは行内のすべてのスペースを消費し、幅は同じになります。
- 各アイテムを(ネストされた)フレックスコンテナーにして、を追加し
justify-content: center
ます。
- これで、各
span
要素は中央揃えのフレックスアイテムになります。
- フレックス
auto
マージンを使用して、外側span
のsを左右にシフトします。
マージンを忘れて排他的にjustify-content
使用することもできauto
ます。
ただしjustify-content
、auto
マージンが常に優先されるため、ここで機能します。スペックから:
8.1。整列auto
マージン
justify-content
およびによる位置合わせの前にalign-self
、正の空きスペースはその次元の自動マージンに分配されます。
justify-content:space-same(概念)
少し前に戻ってjustify-content
、もう1つのオプションのアイデアを示します。
space-same
〜のハイブリッドspace-between
とspace-around
。フレックスアイテムはspace-between
、(のように)両端にハーフサイズのスペースではなく、両端にspace-around
フルサイズのスペースがあることを除いて、(のように)等間隔に配置されます。
このレイアウトで実現することができる::before
と::after
フレックス容器上の擬似要素。
(クレジット:@oriolコードについて、および@crlラベル用)
更新:space-evenly
上記を実現するブラウザの実装が始まっています。詳細については、この投稿を参照してください:フレックスアイテム間の等間隔
PLAYGROUND(上記のすべての例のコードを含む)
justify-self
フレックスアイテムにはどのように働きますか?アイテムa、b、c、dがあり、それらの周りに配置するための追加のスペースがあり、フレックスコンテナーにがjustify-content: space-between
あるため、最終的に| abcd |のようになります。justify-self: center
アイテム「b」だけにeg または「justify-self:flex-end」を追加するとはどういう意味ですか?どこに行くと思いますか?(私はここの答えの1つにいくつかのデモを見ますが、それが一般的に機能するかどうかの明確な方法はわかりません。)