【问题标题】:Control item count in a row with flexbox使用 flexbox 控制一行中的项目数
【发布时间】:2019-09-15 23:51:39
【问题描述】:

我想按原样在第一行显示 4 个项目,但在第二行只显示 3 个,然后在第三行显示 4 个,在第四行显示 3 个,依此类推...

我已经通过nth-child 实现了这一点,但是代码太多而且不够灵活和可扩展。

flex 可以吗?还是网格?

* {
  box-sizing: border-box;
}

.grid-wrapper {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
}

.grid-wrapper .grid-item {
  width: 25%;
  text-align: center;
  padding: 5px;
}

p {
  background: #ddd;
  padding: 15px;
}
<div class="grid-wrapper">
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>


</div>

【问题讨论】:

  • 所有商品的尺寸必须相同?像这样的东西对你有用吗? jsfiddle.net/jxt5cm7u/2
  • 那么...你想在哪里定义每行显示多少项目? nth-child 语法允许您以编程方式执行此操作。否则,您可以在 HTML 中使用 data- 属性并在 CSS 中使用属性选择器来关闭它。

标签: html css flexbox


【解决方案1】:

flex 可以吗?还是网格?

这是一个使用 grid 的解决方案,它更易于构建:

  • 考虑使用 grid-template-columns: repeat(12, 1fr) 的 12 列网格布局,

  • 使用grid-column: span 3 将每个grid-item 分成4 列,

  • 7 grid-items 以某种模式重复;这意味着每个偶数行都有 3 个具有 nth-child 索引的项目 7n7n - 17n - 2

请看下面的演示:

* {
  box-sizing: border-box;
}

.grid-wrapper {
  display: grid; /* grid container */
  grid-template-columns: repeat(12, 1fr); /* 12-column layout */
}

.grid-wrapper .grid-item {
  text-align: center;
  padding: 5px;
  grid-column: span 3; /* 4 items in a row */
}

.grid-wrapper .grid-item:nth-child(7n - 2),
.grid-wrapper .grid-item:nth-child(7n - 1),
.grid-wrapper .grid-item:nth-child(7n) { /* even row */
  grid-column: span 4; /* 3 items in the even row */
}

p {
  background: #ddd;
  padding: 15px;
}
<div class="grid-wrapper">
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>


</div>

弹性盒解决方案

对于 flexbox,我会使用几乎相同的 nth-child 逻辑,您的代码中唯一的变化如下:

.grid-wrapper .grid-item:nth-child(7n - 2),
.grid-wrapper .grid-item:nth-child(7n - 1),
.grid-wrapper .grid-item:nth-child(7n) { /* even row */
  width: 33.33%;
}

请看下面的演示:

* {
  box-sizing: border-box;
}

.grid-wrapper {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
}

.grid-wrapper .grid-item {
  width: 25%;
  text-align: center;
  padding: 5px;
}

p {
  background: #ddd;
  padding: 15px;
}

/* ADDED THESE */
.grid-wrapper .grid-item:nth-child(7n - 2),
.grid-wrapper .grid-item:nth-child(7n - 1),
.grid-wrapper .grid-item:nth-child(7n) { /* even row */
  width: 33.33%;
}
<div class="grid-wrapper">
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>
  <div class="grid-item">
    <p>Grid Item</p>
  </div>


</div>

另外,如果您有兴趣将 n 项放在一行中 使用 flexbox,以下答案可能会为您提供更多信息:

【讨论】:

    【解决方案2】:

    您只需要考虑如下一条规则:

     /*7 = 4 (1st row) + 3 (2nd row) and 5 = 1st element in 2nd row (4 + 1)*/
    .grid-wrapper .grid-item:nth-child(7n + 5) {
      width: calc(100%/3);
      flex-grow:0;
    }
    

    诀窍是让一个元素更大以触发换行,然后依靠flex-grow 来填充空间。

    完整代码

    * {
      box-sizing: border-box;
    }
    
    .grid-wrapper {
      display: flex;
      flex-wrap: wrap;
      justify-content: center;
    }
    
    .grid-wrapper .grid-item {
      width: 25%;
      text-align: center;
      padding: 5px;
      flex-grow: 1;
    }
    
    .grid-wrapper .grid-item:nth-child(7n + 5) {
      width: calc(100%/3);
      flex-grow:0;
    }
    
    p {
      background: #ddd;
      padding: 15px;
    }
    <div class="grid-wrapper">
      <div class="grid-item">
        <p>Grid Item</p>
      </div>
      <div class="grid-item">
        <p>Grid Item</p>
      </div>
      <div class="grid-item">
        <p>Grid Item</p>
      </div>
      <div class="grid-item">
        <p>Grid Item</p>
      </div>
      <div class="grid-item">
        <p>Grid Item</p>
      </div>
      <div class="grid-item">
        <p>Grid Item</p>
      </div>
      <div class="grid-item">
        <p>Grid Item</p>
      </div>
      <div class="grid-item">
        <p>Grid Item</p>
      </div>
      <div class="grid-item">
        <p>Grid Item</p>
      </div>
      <div class="grid-item">
        <p>Grid Item</p>
      </div>
      <div class="grid-item">
        <p>Grid Item</p>
      </div>
      <div class="grid-item">
        <p>Grid Item</p>
      </div>
      <div class="grid-item">
        <p>Grid Item</p>
      </div>
      <div class="grid-item">
        <p>Grid Item</p>
      </div>
      <div class="grid-item">
        <p>Grid Item</p>
      </div>
      <div class="grid-item">
        <p>Grid Item</p>
      </div>
      <div class="grid-item">
        <p>Grid Item</p>
      </div>
      <div class="grid-item">
        <p>Grid Item</p>
      </div>
      <div class="grid-item">
        <p>Grid Item</p>
      </div>
      <div class="grid-item">
        <p>Grid Item</p>
      </div><div class="grid-item">
        <p>Grid Item</p>
      </div>
    </div>

    【讨论】:

      猜你喜欢
      • 2015-10-15
      • 2017-10-30
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      相关资源
      最近更新 更多