次のプロパティを持つフレックスコンテナ(青い正方形)があります。
_display: flex;
justify-content: center;
align-items: center;
flex-wrap: nowrap;
_
したがって、その子(水色の四角)は、以下に示すように配置されます。ただし、通常のフローから別の子(緑の四角)を追加し、親に対して相対的に配置します。あなたは以下を参照してくださいと私は_bottom: 20px;
_と_margin: auto;
_のような理想的な書き込みに何かをしたい、それを配置します。
私は_z-index
_を試してみましたが、役に立ちませんでした。これにどのようにアプローチすればよいですか?別の親要素の作成に頼るべきですか?
以下は、このレイアウトを達成するための5つのオプションは以下のとおりです。
flex: 1
を含むFlexboxposition: relative
をflexコンテナに適用します。
position: absolute
を緑のflexアイテムに適用します。
これで、緑色の四角形がフレックスコンテナ内に絶対に配置されました。
より具体的には、緑色の四角はドキュメントフローから削除されますが、 最近位置の祖先 の境界内に留まります。
CSSオフセットプロパティtop
、bottom
、left
およびright
を使用して、緑色の正方形を移動します。
flex-container {
display: flex;
justify-content: center;
align-items: center;
flex-wrap: nowrap;
position: relative;
border: 4px solid blue;
height: 300px;
width: 300px;
}
flex-container > flex-item:first-child {
display: flex;
}
flex-container > flex-item:first-child > flex-item {
border: 4px solid aqua;
height: 50px;
width: 50px;
margin: 0 5px;
}
flex-container > flex-item:last-child {
position: absolute;
bottom: 40px;
left: 50%;
transform: translateX(-50%); /* fine tune horizontal centering */
border: 4px solid chartreuse;
height: 50px;
width: 50px;
}
<flex-container>
<flex-item><!-- also flex container -->
<flex-item></flex-item>
<flex-item></flex-item>
<flex-item></flex-item>
</flex-item>
<flex-item></flex-item>
</flex-container>
1つの警告:一部のブラウザは完全に正常な流れから絶対位置決めさフレックス項目を削除しなくてもよいです。これにより、非標準の予期しない方法でアライメントが変更されます。詳細:絶対配置フレックス項目がのFirefox&IE11 に正常な流れから除去されません
auto
margins と新しい不可視のフレックスアイテムの組み合わせにより、レイアウトを実現できます。
新しいフレックスアイテムは下部のアイテムと同じで、反対側の端(上部)に配置されます。
より具体的には、フレックスアライメントは空き領域の分布に基づいているため、新しいアイテムは、3つの青いボックスを垂直方向に中央に保つために必要なカウンターバランスです。新しいアイテムは、既存の緑のアイテムと同じ高さにする必要があります。そうしないと、青いボックスが正確に中央に配置されません。
新しいアイテムは、visibility: hidden
でビューから削除されます。
要するに:
auto
マージンを使用して、青いボックスを中央に保ち、両方の緑のボックスが両端から等しいバランスを作成します。visibility: hidden
を複製した緑色のボックスに適用します。flex-container {
display: flex;
flex-direction: column;
align-items: center;
border: 4px solid blue;
height: 300px;
width: 300px;
}
flex-container > flex-item:first-child {
margin-top: auto;
visibility: hidden;
}
flex-container > flex-item:nth-child(2) {
margin-top: auto;
display: flex;
}
flex-container > flex-item:last-child {
margin-top: auto;
margin-bottom: auto;
}
flex-container > flex-item:first-child,
flex-container > flex-item:last-child {
border: 4px solid chartreuse;
height: 50px;
width: 50px;
}
flex-container > flex-item:nth-child(2) > flex-item {
border: 4px solid aqua;
height: 50px;
width: 50px;
margin: 0 5px;
}
<flex-container>
<flex-item></flex-item>
<flex-item><!-- also flex container -->
<flex-item></flex-item>
<flex-item></flex-item>
<flex-item></flex-item>
</flex-item>
<flex-item></flex-item>
</flex-container>
このメソッドは#2と似ていますが、意味的にきれいであり、緑色のボックスの高さがわかっている必要があります。
::before
でコンテナの先頭に配置します。auto
マージンを使用して、青色のボックスを中央に保ち、緑色の擬似要素とDOM要素が両端から均等なバランスを作成します。flex-container {
display: flex;
flex-direction: column;
align-items: center;
border: 4px solid blue;
height: 300px;
width: 300px;
}
flex-container::before {
content: "";
margin-top: auto;
height: calc(50px + 8px); /* height + borders */
visibility: hidden;
}
flex-container > flex-item:first-child {
margin-top: auto;
display: flex;
}
flex-container > flex-item:last-child {
margin-top: auto;
margin-bottom: auto;
border: 4px solid chartreuse;
height: 50px;
width: 50px;
}
flex-container > flex-item:first-child > flex-item {
border: 4px solid aqua;
height: 50px;
width: 50px;
margin: 0 5px;
}
<flex-container>
<flex-item><!-- also flex container -->
<flex-item></flex-item>
<flex-item></flex-item>
<flex-item></flex-item>
</flex-item>
<flex-item></flex-item>
</flex-container>
flex: 1
を上部および下部のアイテムに追加する上記の方法#2または#3から始めて、均等なバランスを維持するために上下のアイテムの高さが等しくなることを心配する代わりに、それぞれにflex: 1
を与えるだけです。これにより、両者に使用可能なスペースが消費され、中央のアイテムが中央に配置されます。
次に、display: flex
を一番下のアイテムに追加して、コンテンツを揃えることができます。
これが最もクリーンで効率的な方法かもしれません。絶対配置、偽の要素、またはその他のハッカーの必要はありません。
3行のグリッドを作成するだけです。次に、2行目と3行目のアイテムを中央揃えにします。最初の行は空のままにできます。
grid-container {
display: grid;
grid-template-rows: repeat(3, 1fr);
align-items: center;
justify-items: center;
border: 4px solid blue;
height: 300px;
width: 300px;
}
grid-item:nth-child(2) {
display: flex;
}
grid-item:nth-child(2)>flex-item {
width: 50px;
height: 50px;
margin: 0 5px;
border: 4px solid aqua;
}
grid-item:nth-child(3) {
border: 4px solid chartreuse;
height: 50px;
width: 50px;
}
<grid-container>
<grid-item></grid-item>
<grid-item><!-- also flex container -->
<flex-item></flex-item>
<flex-item></flex-item>
<flex-item></flex-item>
</grid-item>
<grid-item></grid-item>
</grid-container>
コンテナにposition: relative
を、緑色の正方形にposition:absolute;
を付けます
body {
margin: 0;
}
#container {
display: flex;
justify-content: center;
align-items: center;
flex-wrap: nowrap;
width: 192px;
height: 192px;
border: 4px solid Indigo;
position: relative;
background: lavender;
}
.blue {
margin: 10px;
width: 30px;
height: 30px;
outline: 4px solid skyblue;
background: honeydew;
}
#green {
position: absolute;
width: 30px;
height: 30px;
left: 0;
right: 0;
margin: auto;
bottom: 20px;
outline: 4px solid yellowgreen;
background: greenyellow;
}
<div id=container>
<div class=blue></div><div class=blue></div><div class=blue></div>
<div id=green></div>
</div>
擬似を使用して最初の3つのコンテナを1行下に移動し、margin:auto
最後へ
div {
display:flex;
flex-wrap:wrap;
border:#0066FD solid;;
width:200px;
height:200px;
justify-content:space-around;
/* show me box center */
background:linear-gradient(to top,rgba(0,0,0,0.2) 50%, transparent 50%),linear-gradient(to left,rgba(0,0,0,0.2) 50%, transparent 50%)
}
span, div:before {
width:50px;
height:50px;
border:solid #01CDFF;
margin:0 auto 0;
}
span:last-of-type , div:before{
margin: 12px auto;
border:solid #01FE43;
}
div:before {
content:'';
width:100%;
border:none;
}
span {
/* show me box center */
background:linear-gradient(45deg,rgba(0,0,0,0.1) 50%, transparent 50%),linear-gradient(-45deg,rgba(0,0,0,0.1) 50%, transparent 50%)
}
<div>
<span></span>
<span></span>
<span></span>
<span></span>
</div>