代码之家  ›  专栏  ›  技术社区  ›  wanaryytel

如果为列和行设置了模板,如何使css网格自动换行?

  •  1
  • wanaryytel  · 技术社区  · 8 年前

    我有12个孩子 div 在我的 .wrapper 元素,我想将其堆叠在一起。数字12实际上是动态的,所以我不知道我会有多少孩子。现在我的网格布局如下所示:

    .wrapper {
      display: grid;
      grid-template-columns: repeat(3, 1fr);
      grid-template-rows: auto auto;
      grid-auto-flow: column dense;
      grid-gap: 10px;
    }
    

    这很好,直到网格开始包装元素(布局是满的,网格是3x2,包含6个元素)。第七个,eigth和所有其他的都放在前六个旁边,尽管我希望它们用相同的模板放在一个新行中(所以基本上我的网格将变成2x(3x2))。

    这个解释本身可能没什么意义,看看 Codepen 也。

    第六行之后的元素如何换行?

    3 回复  |  直到 8 年前
        1
  •  2
  •   Ilya Streltsyn    8 年前

    您可以使用auto flow来形成网格(就像@vals的答案所建议的那样),然后通过一组 :nth-child() 规则:

    .wrapper {
        border: 2px solid #f76707;
        border-radius: 5px;
        background-color: #fff4e6;
    }
    
    .wrapper > div {
        border: 2px solid #ffa94d;
        border-radius: 5px;
        background-color: #ffd8a8;
        padding: 1em;
        color: #d9480f;
    }
    .wrapper {
      display: grid;
      grid-template-columns: repeat(3, 1fr);
      grid-auto-flow: row dense;
      grid-gap: 10px;
    }
    
    .wrapper > :nth-child(6n + 1),
    .wrapper > :nth-child(6n + 2) {
      grid-column: 1;
    }
    
    .wrapper > :nth-child(6n + 3),
    .wrapper > :nth-child(6n + 4) {
      grid-column: 2;
    }
    
    .wrapper > :nth-child(6n + 5),
    .wrapper > :nth-child(6n + 6) {
      grid-column: 3;
    }
    <div class="wrapper">
      <div>One</div>
      <div>Two</div>
      <div>Three</div>
      <div>Four</div>
      <div>Five</div>
      
      <div>Six</div>
      <div>Seven</div>
      <div>Eight</div>
      <div>Nine</div>
      <div>Ten</div>
      <div>Eleven</div>
      <div>Twelve</div>
      
      <div>Thirteen</div>      
      <div>Fourteen</div>      
      <div>And so on</div>
    </div>
        2
  •  2
  •   vals    8 年前

    使用网格自动流动:行。然后需要为项2和项4设置一个特殊规则,仅设置行就足够了。

    我已经删除了网格模板行:auto属性,它是默认值,如果您这样放置元素,则不需要它。

    .wrapper {
        border: 2px solid #f76707;
        border-radius: 5px;
        background-color: #fff4e6;
    }
    
    .wrapper > div {
        border: 2px solid #ffa94d;
        border-radius: 5px;
        background-color: #ffd8a8;
        padding: 1em;
        color: #d9480f;
    }
    .wrapper {
      display: grid;
      grid-template-columns: repeat(3, 1fr);
      grid-auto-flow: row dense;
      grid-gap: 10px;
    }
    
    .wrapper div:nth-child(-2n + 4) {
      grid-row: 2;
      background-color: yellow;
    }
    <div class="wrapper">
      <div>One</div>
      <div>Two</div>
      <div>Three</div>
      <div>Four</div>
      <div>Five</div>
      
      <div>Six</div>
      <div>Seven</div>
      <div>Eight</div>
      <div>Nine</div>
      <div>Ten</div>
      <div>Eleven</div>
      <div>Twelve</div>
    </div>
        3
  •  0
  •   Tanner Babcock    8 年前

    这应该对你有用。我改变了 grid-auto-flow column dense row dense 是的。

    * {box-sizing: border-box;}
    
    .wrapper {
        border: 2px solid #f76707;
        border-radius: 5px;
        background-color: #fff4e6;
    }
    
    .wrapper > div {
        border: 2px solid #ffa94d;
        border-radius: 5px;
        background-color: #ffd8a8;
        padding: 1em;
        color: #d9480f;
    }
    .wrapper {
        display: grid;
        grid-template-columns: repeat(3, 1fr);
        grid-template-rows: auto auto;
        grid-auto-flow: row dense;
        grid-gap: 10px;
    }
    <div class="wrapper">
        <div>One</div>
        <div>Two</div>
        <div>Three</div>
        <div>Four</div>
        <div>Five</div>
        
        <div>Six</div>
        <div>Seven</div>
        <div>Eight</div>
        <div>Nine</div>
        <div>Ten</div>
        <div>Eleven</div>
        <div>Twelve</div>
    </div>