Reputation: 2933
I'm using display: flex and order values to reorder elements for different breakpoints. It's been working well so far, but I have only been working with full-width elements so it's been straightforward up to this point. Now Id like to do the same, but put two of the elements next to each other. e.g.
<div class="wrapper">
<div class="object1">...</div>
<div class="object2">...</div>
<div class="object3">...</div>
<div class="object4">...</div>
<div class="object5">...</div>
</div>
Should be laid out like this:
[ object2 ]
[ object3 ]
[ object 1 ] [ object 5 ]
[ object 4 ]
My CSS looks like this so far:
.wrapper {
display: flex;
flex-direction: column;
}
.object1 {
order: 3;
width: 50%;
}
.object2 {
order: 1;
}
.object3 {
order: 2;
}
.object4 {
order: 5;
}
.object5 {
order: 4;
width: 50%;
}
What this is giving me looks like this:
[ object2 ]
[ object3 ]
[ object 1 ]
[ object 5 ]
[ object 4 ]
Any pointers would be very gratefully received.
Upvotes: 0
Views: 4171
Reputation: 114991
I'm not sure flex-direction:column
is approproate here (without knowing the full circumstances).
Firstly you would have to enable wrapping to get two columns (and limit the height I suspect) but I think you will find the alignment of 1 & 5 problematical regardless.
See:
* {
box-sizing: border-box;
}
.wrapper {
display: flex;
width: 80%;
margin: 1em auto;
flex-direction: column;
flex-wrap: wrap;
height: 100px;
box-shadow: 0 0 1px 0 black;
}
[class^="object"] {
text-align: center;
border: 1px solid red;
width: 50%;
height: 25px;
}
.object1 {
order: 3;
}
.object2 {
order: 1;
}
.object3 {
order: 2;
}
.object4 {
order: 5;
}
.object5 {
order: 6;
margin-top: 50px;
}
<div class="wrapper">
<div class="object1"><span>object1</span>
</div>
<div class="object2"><span>object2</span>
</div>
<div class="object3"><span>object3</span>
</div>
<div class="object4"><span>object4</span>
</div>
<div class="object5"><span>object5 - But alignment is manual?</span>
</div>
</div>
However, using flex-direction:row
(and wrapping)....this is simple.
* {
box-sizing: border-box;
}
.wrapper {
display: flex;
width: 50%;
margin: 1em auto;
border: 1px solid grey;
flex-wrap: wrap;
}
[class^="object"] {
flex: 0 0 100%;
text-align: center;
border: 1px solid red;
}
.object1 {
order: 3;
flex: 0 0 50%;
}
.object2 {
order: 1;
}
.object3 {
order: 2;
}
.object4 {
order: 5;
}
.object5 {
order: 4;
flex: 0 0 50%
}
<div class="wrapper">
<div class="object1"><span>object1</span>
</div>
<div class="object2"><span>object2</span>
</div>
<div class="object3"><span>object3</span>
</div>
<div class="object4"><span>object4</span>
</div>
<div class="object5"><span>object5</span>
</div>
</div>
This would be much easier with nested flexboxes and display:contents
...but we're not there yet.
Upvotes: 2