Reputation: 484
I am trying to get flex divs stacked in rows of 3. Sometimes I will have 3 divs, sometimes 6 or 21, etc. I got the widths and paddings figured out, but I can't figure out how to get them to start a new row after each set of 3.
How can I achieve that? Right now it's putting them all in 1 line.
The HTML code is like this:
<div id="container">
<div class="sections__container">
<div class="sections__container__a">A-1</div>
<div class="sections__container__b">A-2</div>
<div class="sections__container__c">A-3</div>
<div class="sections__container__a">B-1</div>
<div class="sections__container__b">B-2</div>
<div class="sections__container__c">B-3</div>
</div>
</div>
Each flex div is using CSS like:
width: 33.33%;
height: 100%;
float: left;
flex-grow: 1;
And here's a jsFiddle to make things easier: https://jsfiddle.net/xr746syj/
Thank you so much for any advice :)
Upvotes: 7
Views: 12379
Reputation: 56753
Why would you use flex for the purpose? This seems to be a much better suit for grid.
/* this is already enough for the layout */
.sections__container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1em;
}
/* this is only for the boxes to look nicer */
.sections__container {
background-color: #f0f0f0;
padding: 1em;
&> * {
background-color: #fff;
border-radius: 0.3em;
display: flex;
padding: 1em;
place-content: center;
}
}
<div class="sections__container">
<div class="sections__container__a">A-1</div>
<div class="sections__container__b">A-2</div>
<div class="sections__container__c">A-3</div>
<div class="sections__container__a">B-1</div>
<div class="sections__container__b">B-2</div>
<div class="sections__container__c">B-3</div>
</div>
Upvotes: 0
Reputation: 35
My method has reduced complexity and uses padding instead. I also gave the same class to the children but different id so that it will be easier to control many children easily.
#container{
padding: 25px 50px;
display: flex;
flex-direction: column;
gap: 32px;
background:#ececec;
}
.sections__container{
display: flex;
gap: 32px;
}
.sections__container .sections__container__child{
padding: 10px 30px;
flex: 1 auto;
background: white;
text-align: center; /* you can use flexbox to center if the objects are not a text */
}
<div id="container">
<div class="sections__container">
<div class="sections__container__child" id="sections__container__a">A-1</div>
<div class="sections__container__child" id="sections__container__b">A-2</div>
<div class="sections__container__child" id="sections__container__c">A-3</div>
</div>
<div class="sections__container">
<div class="sections__container__child" id="sections__container__a">B-1</div>
<div class="sections__container__child" id="sections__container__b">B-2</div>
<div class="sections__container__child" id="sections__container__c">B-3</div>
</div>
</div>
Upvotes: 0
Reputation: 171
Hope this will also helps!
* {
box-sizing: border-box;
}
#container {
width: 600px;
margin: 0 auto;
padding-left: 10px;
padding-right: 10px;
}
.sections__container {
margin-left: -10px;
margin-right: -10px;
display: -ms-flexbox;
display: flex;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
}
.sections__container .col {
-ms-flex: 0 0 calc(33.333% - 20px);
flex: 0 0 calc(33.333% - 20px);
max-width: calc(33.333% - 20px);
margin-left: 10px;
margin-right: 10px;
margin-bottom: 20px;
border-radius: 4px;
background-color: #eee;
font-size: 12px;
padding: 15px;
font-weight: 600;
text-align: center;
}
<div id="container">
<div class="sections__container">
<div class="col sections__container__a">A-1</div>
<div class="col sections__container__b">A-2</div>
<div class="col sections__container__c">A-3</div>
<div class="col sections__container__a">B-1</div>
<div class="col sections__container__b">B-2</div>
<div class="col sections__container__c">B-3</div>
</div>
</div>
Upvotes: 1
Reputation: 19109
First, you need to use flex-wrap: wrap
so that your rows break at the proper point.
Second, you're using margins and need to account for them in your width
calculations.
So, if you're saying a block is 33.33%
but has margin-left: 5px
, you need to use width: calc(33.33% - 5px)
.
Last, I removed the float
s from your code, since they are useless properties when applied to flex children. Your code could be massively simplified by creating a common class
that contained all the shared values between each section.
Here's the full, working code:
* {
box-sizing: border-box;
}
#container {
width: 600px;
margin: 0 auto;
background-color: #ececec;
padding: 10px;
margin-bottom: 30px;
}
.sections__container {
margin: 0 auto;
max-width: 600px;
display: flex;
flex-wrap: wrap;
}
.sections__container__a {
margin-right: 5px;
width: calc(33.33% - 5px);
height: 100%;
border-radius: 4px;
flex-grow: 1;
background-color: #FFFFFF;
font-size: 0.80rem;
padding: 15px 0px 10px 0px;
font-weight: 600;
margin-bottom: 10px;
text-align: center;
}
.sections__container__b {
margin: 0 5px;
width: calc(33.33% - 10px);
height: 100%;
border-radius: 4px;
flex-grow: 1;
background-color: #FFFFFF;
font-size: 0.80rem;
padding: 15px 0px 10px 0px;
font-weight: 600;
margin-bottom: 10px;
text-align: center;
}
.sections__container__c {
margin-left: 5px;
width: calc(33.33% - 5px);
height: 100%;
border-radius: 4px;
flex-grow: 1;
background-color: #FFFFFF;
font-size: 0.80rem;
padding: 15px 0px 10px 0px;
font-weight: 600;
margin-bottom: 10px;
text-align: center;
}
<div id="container">
<div class="sections__container">
<div class="sections__container__a">A-1</div>
<div class="sections__container__b">A-2</div>
<div class="sections__container__c">A-3</div>
<div class="sections__container__a">B-1</div>
<div class="sections__container__b">B-2</div>
<div class="sections__container__c">B-3</div>
</div>
</div>
Upvotes: 10
Reputation: 1751
I hope this will help.
Here is the cheatsheet for flex for future reference: https://yoksel.github.io/flex-cheatsheet/
#container{
width:600px;
margin: 0 auto;
background-color:#ececec;
padding:10px;
margin-bottom:30px;
}
.sections__container {
margin: 0 auto;
max-width: 600px;
display: flex;
flex-wrap: wrap;
align-content: stretch;
justify-content: space-between;
}
.sections__container div {
width: 30%;
border-radius: 4px;
flex-grow: 1;
background-color: #FFFFFF;
font-size: 0.80rem;
padding: 15px 0px 10px 0px;
font-weight: 600;
margin:10px;
text-align: center;
}
<div id="container">
<div class="sections__container">
<div class="sections__container__a">A-1</div>
<div class="sections__container__b">A-2</div>
<div class="sections__container__c">A-3</div>
<div class="sections__container__a">B-1</div>
<div class="sections__container__b">B-2</div>
<div class="sections__container__c">B-3</div>
</div>
</div>
Upvotes: 5