有没有办法强制网格最后一行中的所有项目填充该行,无论它们有多少?
我不知道网格中的项目数量,因此我无法直接定位它们。我尝试使用
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 规则 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>
我不认为 CSS 网格是您尝试构建的布局的最佳选择,至少如果它是动态的并且您并不真正知道容器上始终有多少项,则不是。 Flexbox 实际上更适合一维布局;让所有东西保持完全相同的大小并完全根据需要使用所有可用空间可能会有点困难,但最终这种类型的情况就是 Flexbox 的用途。
当然,您也可以通过对 CSS 进行少量计算来利用 100% 宽度。
CSS 网格可能会更好地保持行和列对齐,但这是一个不同的情况。
.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>
对于那些只为最后一个元素寻找答案的人,如果您使用的是 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>
这在 CSS Grid 当前版本(级别 1)中是不可能的。不过,使用 Flexbox 并不太复杂。
您在评论中写道:
我正在使用 Flexbox 进行后备。我研究网格的一个(不是唯一)原因是使用“间隙”和它附带的其他功能。例如,尽管间隙可以通过边距来模拟,但由于我们不知道最后一行中的项目数量,因此消除侧面间隙(在容器侧面)将需要额外的代码。你是对的: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>
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>
我尝试组合多个选择器,看看它们是否可以一起工作。
所以只要知道自己有多少列,就可以准备几个组合选择器。
span:nth-child(3n+1):last-child {grid-column: 1/-1;} span:nth-child(3n+2):last-child {grid-column: 2/-1;} span:nth-child(3n+3):last-child {grid-column: 3/-1;}
div {
margin:20px auto;
width: 400px;
background: #d8d8d8;
display: grid;
grid-gap: 10px;
grid-template-columns: repeat(3, 1fr);
}
span {
height: 50px;
background: blue;
}
span:nth-child(3n+1):last-child {grid-column: 1/-1;}
span:nth-child(3n+2):last-child {grid-column: 2/-1;}
span:nth-child(3n+3):last-child {grid-column: 3/-1;}
<div>
<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>
<span></span>
<span></span>
</div>
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)。在这里了解更多: