如何让最后一行的项目占用CSS Grid中的剩余空间?

问题描述 投票:0回答:6

有没有办法强制网格的最后一行中的所有项目填充该行,无论它们有多少?

我不知道网格中的项目数量,所以我无法直接定位它们。我尝试使用

grid-auto-flow: dense
,但它并没有真正帮助。

这是我的可视化问题:

div {
  margin:20px auto;
  width: 400px;
  background: #d8d8d8;
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(3, 1fr);
}
span {
  height: 50px;
  background: blue;
}
<div>
  <span></span>
  <span></span>
  <span></span>
  <span></span>
  <span></span>
  <span></span>
  <span></span>  
</div>
 

css grid-layout css-grid
6个回答
24
投票

通过组合 CSS 规则 nth-child 和 nth-last-of-type,这完全可以用 CSS 网格实现。唯一需要注意的是需要提前知道列数。

.grid {
    display: grid;
    grid-template-columns: auto auto auto;
    justify-items: start;
    grid-gap: 10px;
}

.grid div {
  border: 1px solid #ccc;
  width: 100%;
}

.grid > *:nth-child(3n-1) {
  justify-self: center;
  text-align: center;
}

.grid > *:nth-child(3n) {
  justify-self: end;
  text-align: right;
}

.grid > *:nth-child(3n-1):nth-last-of-type(1) {
  border-color: red;
  grid-column: span 2;
}

.grid > *:nth-child(3n-2):nth-last-of-type(1) {
  border-color: red;
  grid-column: span 3;
}
<div class="grid">
  <div>text</div>
  <div>TEXT</div>
  <div>text</div>
  <div>text</div>
  <div>TEXT</div>
  <div>text</div>
  <div>text</div>
  <div>TEXT</div>
</div>


18
投票

我不认为 CSS Grid 是您尝试构建的布局的最佳选择,至少如果它是动态的并且您真的不知道容器上始终有多少项目,则不是。 Flexbox 实际上更适合一维布局;保持所有东西的大小完全相同并完全按照你的需要使用所有可用空间可能会有点困难,但最终这种情况就是 Flexbox 的目标。

当然,您也可以通过对 CSS 进行少量计算来使用 100% 宽度。

CSS Grid 可能更好地保持行和列对齐,但这是不同的情况。

.container {
  display: flex;
  flex-wrap: wrap;
  box-sizing: border-box;
}

.flex-item {
  width: 30%;
  border: 1px solid #000;
  flex-grow: 1;
  min-height: 120px;
  box-sizing: border-box;
  margin: 0 5px 10px;
  justify-content: space-between;
  text-align: center;
}
<div class="container">
  <div class="flex-item">1</div>
  <div class="flex-item">2</div>
  <div class="flex-item">3</div>
  <div class="flex-item">4</div>
  <div class="flex-item">5</div>
  <div class="flex-item">6</div>
  <div class="flex-item">7</div>
</div>


3
投票

对于那些只为最后一个元素寻找答案的人,如果您使用的是 tailwindcss,您可以尝试

grid-column: 1 / -1;
col-span-full

div {
  margin:20px auto;
  width: 400px;
  background: #d8d8d8;
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(3, 1fr);
}
span {
  height: 50px;
  background: blue;
}
div > span:last-of-type {
  grid-column: 1 / -1;
}
<div>
  <span></span>
  <span></span>
  <span></span>
  <span></span>
  <span></span>
  <span></span>
  <span></span>  
</div>


2
投票

这在 CSS Grid当前版本(级别 1)中是不可能的。然而,使用 flexbox 并不太复杂。

您在评论中写道:

我正在使用 Flexbox 作为回退。我研究网格的一个(不是唯一)原因是使用“间隙”和它附带的其他功能。例如,虽然 gap 可以通过 margin 来模拟,但是由于我们不知道最后一行中的项目数,所以摆脱侧边间隙(在容器的侧面)将需要额外的代码。

你说得对:CSS Grid 中的

grip-gap
功能非常方便。但是,您也可以在 flexbox 中使用边距来模拟这种行为——没有太多复杂性。

div {
  display: flex;
  flex-wrap: wrap;
  padding: 0px 0px 5px 5px;
  margin: 20px auto;
  width: 400px;
  background: #d8d8d8;

  }
span {
  flex: 1 0 30%;
  height: 50px;
  margin-top: 5px;
  margin-right: 5px;
  background: blue;
}
<div>
  <span></span>
  <span></span>
  <span></span>
  <span></span>
  <span></span>
  <span></span>
  <span></span>
</div>

<div>
  <span></span>
  <span></span>
  <span></span>
  <span></span>
  <span></span>
  <span></span>
</div>

<div>
  <span></span>
  <span></span>
  <span></span>
  <span></span>
  <span></span>
</div>

<div>
  <span></span>
  <span></span>
  <span></span>
  <span></span>
</div>

<div>
  <span></span>
  <span></span>
  <span></span>
</div>

<div>
  <span></span>
  <span></span>
</div>

<div>
  <span></span>
</div>


0
投票

您可以尝试使用

nth-child
last-of-type
选择器只选择超出的项目,最后将最后一个项目跨越到网格中的总列数(使用
grid-column: 1 / -1
自动完成)

.grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: 8px;
  row-gap: 8px;
}

.grid-item {
  background: lightblue;
}

.grid-item:nth-child(2n-1):last-of-type {
  background: coral;
  grid-column: 1 / -1;
}
<div class="grid">
  <div class="grid-item">Item 1</div>
  <div class="grid-item">Item 2</div>
  <div class="grid-item">Item 3</div>
  <div class="grid-item">Item 4</div>
  <div class="grid-item">Item 5</div>
</div>


-3
投票

我已经找到您问题的答案,我已将其复制在这里: https://jsfiddle.net/nmcobalt/dg3mutwv/13/

为了使 css 不那么复杂并解决这个复杂的问题,建议使用 SCSS* 而不是普通的 css。

在 SCSS 文件中,您必须使用 css 选择器 nth:last-child 基于模函数和 3 列的常数因子迭代计算子项。

@mixin setLastChildFluid{
  @for $i from 1 through 10 {    
    $span: 3;
    @if $i % 3 == 0{
      $span: 1;
    } @else if $i % 3 == 1{
      $span: 3;
    } @else if $i % 3 == 2{
      $span: 2;
    } 
    @if $span == 2 {
      span:nth-child(#{$i - 1}){
        &:nth-last-child(2){
          grid-column-end:span 1;
          position:relative;
          bottom:0;
          width:calc(150% + 5px);
          left:0;    
        }
      }
      span:nth-child(#{$i}){
        &:nth-last-child(1){
          grid-column-start:2;
          position:relative;
          bottom:0;
          width:calc(150% + 5px);
          left:calc(50% + 5px);
        }
      }
      
    } @else {
      span:nth-child(#{$i}){
        &:last-child{
            grid-column-end:span #{$span};          
        }
      }
    }
    
  }
}
div {
  position:relative;
  margin:20px auto;
  width: 400px;
  background: #d8d8d8;
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(3, 1fr);
  
  @include setLastChildFluid;
}
span {
  height: 50px;
  background: blue;
  color:yellow;
}

和以下 html 标记;我做了两个不同的例子(由 div 包装)来重现你的查询:

<div>
  <span>1</span>
  <span>2</span>
  <span>3</span>
  <span>4</span>
  <span>5</span>
  <span>6</span>
  <span>7</span>
  <span>8</span>
</div>
<div>
  <span>1</span>
  <span>2</span>
  <span>3</span>
  <span>4</span>
  <span>5</span>
  <span>6</span>
  <span>7</span>
</div>

更改 div 的数量以查看流畅的结果。

*SASS 是一种预处理器脚本语言,可以解释或编译成层叠样式表 (CSS)。在此处了解更多信息:https://sass-lang.com/guide

© www.soinside.com 2019 - 2024. All rights reserved.