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

Mat*_*idt 8 css css3 css-grid

我有一个项目列表,按日期排序.

有些项目是未来的(绿色项目),因此更有趣,有些是过去(棕色项目).我希望第二组项目在新行中开始.

.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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

每个类别的整体项目/项目数量不断变化,每行的项目数量取决于屏幕大小 - 这可能会消除一些可能的解决方案.

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

.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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

可能这是最简单的选择.看起来像我想要实现的目标并不是很难做到.但无论如何,我很好奇:这有更优雅的方法吗?我想的是:

.item.green + .item.brown:before { 
/* force new row */
}
Run Code Online (Sandbox Code Playgroud)

sol*_*sol 8

你可以第一个目标.brown.green,并设置网柱开始至1.

.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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)


Kob*_*uek 6

由于您正在使用grid-template-columns,您将无法使用before或 实现此目的after,您需要grid-column-start使用item.green + .item.brown选择将 设置为 1 :

.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;
}
.item.green + .item.brown { 
    
    grid-column-start: 1;

}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)