moo moo
moo moo

Reputation: 484

How to get 33.33% width flex divs in multiple rows?

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

Answers (5)

connexo
connexo

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

Zohaib Mushtaq
Zohaib Mushtaq

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

user10936942
user10936942

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

Andy Hoffman
Andy Hoffman

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 floats 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>

jsFiddle

Upvotes: 10

Varsha Dhadge
Varsha Dhadge

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

Related Questions