Flexbox space-between but center if one element
For cases where you have one item in the container, you can use the :only-child
pseudo-class.
Add this to your code:
.box:only-child {
margin: 0 auto;
}
.container-box {
width: 200px;
display: flex;
flex-direction: row;
justify-content: space-between;
background-color: red;
margin: 50px;
}
.box {
background-color: #9009A0;
height: 50px;
width: 50px;
}
.box:only-child {
margin: 0 auto;
}
<div class="container-box">
<div class="box"></div>
<div class="box"></div>
</div>
<div class="container-box">
<div class="box"></div>
</div>
In such cases, flex auto
margins will override justify-content
because:
§ 8.1. Aligning with
auto
marginsPrior to alignment via
justify-content
andalign-self
, any positive free space is distributed to auto margins in that dimension.
More about :only-child
:
§ 6.6.5.10.
:only-child
pseudo-classThe
:only-child
pseudo-class represents an element that has no siblings. Same as:first-child:last-child
or:nth-child(1):nth-last-child(1)
, but with a lower specificity.
More about flex auto
margins:
- In CSS Flexbox, why are there no "justify-items" and "justify-self" properties?
Also, to spotlight some interesting flex behavior, if you were using space-around
instead of space-between
, you wouldn't need auto
margins.
- Flex item should align left, not center, when it wraps
For info, You could also use together :first-child
and :last-child
if you wanted to mind about very old browsers ;)
.container-box {
width: 200px;
display: flex;
flex-direction: row;
justify-content: space-between;
background-color: red;
margin: 50px;
}
.box {
background-color: #9009A0;
height: 50px;
width: 50px;
}
.container-box .box:first-child:last-child {
margin: 0 auto;
}
<div class="container-box">
<div class="box"></div>
<div class="box"></div>
</div>
<div class="container-box">
<div class="box"></div>
</div>