如何在多行中获得33.33%宽度的flex div?

时间:2019-03-05 12:45:55

标签: css flexbox

我正在尝试将flex div堆叠成3行,有时我会有3 div,有时是6或21,依此类推。我弄清楚了宽度和填充,但是我不知道如何获得它们在每3组之后开始新的一行。

我该如何实现?现在,将它们全部放在一行中。

HTML代码如下:

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

每个flex div都使用CSS,例如:

width: 33.33%;
height: 100%;
float: left;
flex-grow: 1;

下面是一个jsFiddle,它使事情变得更容易: https://jsfiddle.net/xr746syj/

非常感谢您的任何建议:)

3 个答案:

答案 0 :(得分:4)

首先,您需要使用flex-wrap: wrap,以便您的行在适当的位置中断。

第二,您正在使用边距,并且需要在width计算中考虑它们。

因此,如果您说一个区块是33.33%但有margin-left: 5px,则需要使用width: calc(33.33% - 5px)

最后,我从您的代码中删除了float,因为当将它们应用于flex子代时,它们是无用的属性。通过创建包含每个部分之间所有共享值的公用class,可以大大简化您的代码。

这是完整的有效代码:

* {
  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

答案 1 :(得分:4)

我希望这会有所帮助。

以下是flex的备忘单,以供将来参考: 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>

答案 2 :(得分:1)

希望这也会有所帮助!

* {
    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>