CSS3网格布局:特定元素后的新行-可能吗?

2022-04-02 00:00:00 css css-grid

我有一个按日期排序的项目列表。

有些物品是未来的(绿色物品),因此更有趣的是,有些是过去的(棕色物品)。我希望第二组项目从新的一行开始。

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
.grid{
  width: 120px;
  display:grid;
  grid-template-columns: repeat(3,1fr);
  grid-gap: 10px;
}
.item{
  border:1px solid black;
  height:50px;
  width:50px;
}
.green{
  background:green;
}
.brown{
  background:brown;
}
<div class="grid">
  <div class="item green"></div>
  <div class="item green"></div>
  <div class="item green"></div>
  <div class="item green"></div>
  <div class="item green"></div>
  <div class="item brown"></div>
  <div class="item brown"></div>
  <div class="item brown"></div>
  <div class="item brown"></div>
</div>

每个类别的总项目数/项目数不断变化,每行的项目数取决于屏幕大小-这可能会排除某些可能的解决方案。

当然,我可以在某个点上拆分包含所有项的数组,并将输出组织到两个单独的网格中,如下所示:

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
.grid{
  width: 120px;
  display:grid;
  grid-template-columns: repeat(3,1fr);
  grid-gap: 10px;
  margin-bottom:10px;
}
.item{
  border:1px solid black;
  height:50px;
  width:50px;
}
.green{
  background:green;
}
.brown{
  background:brown;
}
<div class="grid">
  <div class="item green"></div>
  <div class="item green"></div>
  <div class="item green"></div>
  <div class="item green"></div>
  <div class="item green"></div>
</div>
<div class="grid">
  <div class="item brown"></div>
  <div class="item brown"></div>
  <div class="item brown"></div>
  <div class="item brown"></div>
</div>

这可能是最简单的选择。看起来我想要实现的目标并不太难做到。但不管怎样,我很好奇:有没有更优雅的方法来解决这个问题?我想的大概是:

.item.green + .item.brown:before { 
/* force new row */
}

解决方案

您可以针对.green之后的第一个.brown,并将grid-column-start设置为1。

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
.grid {
  width: 120px;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-gap: 10px;
}

.item {
  border: 1px solid black;
  height: 50px;
  width: 50px;
}

.green {
  background: green;
}

.brown {
  background: brown;
}

.green + .brown {
  grid-column-start: 1;
}
<div class="grid">
  <div class="item green"></div>
  <div class="item green"></div>
  <div class="item green"></div>
  <div class="item green"></div>
  <div class="item green"></div>
  <div class="item brown"></div>
  <div class="item brown"></div>
  <div class="item brown"></div>
  <div class="item brown"></div>
</div>

相关文章