I'm trying to achieve the effect where the boxes labeled "HALF", take up only 50% of the width (aka they share the first row evenly).
The base requirement is that they remain in a single container. Is this possible to achieve using flexbox?
I've tried playing around with flex-grow
, flex-shrink
, and flex-basis
but I'm afraid I'm not understanding how to make it work, or if it's even possible, given the single container requirement.
Consider this fiddle: http://jsfiddle.net/GyXxT/270/
div {
border: 1px solid;
}
.container {
width: 400px;
display: flex;
flex-direction: column;
}
.child {
height: 200px;
}
.child.half {
flex: 1 1 10em;
color: green;
}
.child:not(.half) {
flex-shrink: 2;
flex-basis: 50%;
color: purple;
}
<div class="container">
<div class="child half">
HALF
</div>
<div class="child half">
HALF
</div>
<div class="child">
FULL
</div>
<div class="child">
FULL
</div>
<div class="child">
FULL
</div>
<div class="child">
FULL
</div>
</div>
The flex sizing properties --
flex-grow
,flex-shrink
,flex-basis
andflex
-- work only along the main axis of the flex container.Since your container is
flex-direction: column
, the main axis is vertical, and these properties are controlling height, not width.For sizing flex items horizontally in a column-direction container you'll need the
width
property.(Here's a more detailed explanation: What are the differences between flex-basis and width?)
To achieve your layout with a single container, see another answer to this question.
If you want to stay in column-direction, you'll need to wrap the
.half
elements in their own container.Instead of
flex-direction: column
, you can try a wrapping flexbox usingflex-wrap: wrap
; and you can set:flex-basis: 50%
for the half width divsflex-basis: 100%
for the full width divsSee that I have thrown in
box-sizing: border-box
to adjust for the widths when using flex-basis.See demo below:
That can also be done without
flexbox
, by simply float the 2half
elements