【问题标题】:Fill grid container so that last grid item area is always filled填充网格容器,以便始终填充最后一个网格项区域
【发布时间】:2019-09-29 08:56:54
【问题描述】:

现在我有一个包含 1 行5 列 的网格,我将用于导航链接,但有可能在某些页面上网格容器可能没有 5 个孩子。

问题是网格从第一个可用区域开始填充。

有没有办法用网格项填充网格容器,以便始终填充最后一个区域?

例如...

[a][b][c][d][ ] 应该是 [ ][a][b][c][d]

[a][b][c][ ][ ] 应该是 [ ][ ][a][b][c]

值得注意的是,我不想反转元素的方向,而是始终保持元素的顺序相同。

有没有一种简单的方法可以做到这一点修改列数?

【问题讨论】:

  • 总是1行吗?如果是这样,那么弹性盒子看起来是一个更好的选择。
  • @arieljuod 是的,它永远是一排。 flex 肯定是更好的方法,但我在这种情况下选择网格的原因是因为与 flex 不同,孩子总是假设宽度的 1/5,并且可能会有少于 5 个孩子的情况。

标签: css css-grid grid-layout


【解决方案1】:

由于它只有 5 列,因此您可以使用 nth-last-child() 为每个元素显式定义它

.grid {
  display:grid;
  grid-template-columns:repeat(5,1fr);
  grid-gap:5px;
  margin:5px;
}
.grid > span {
  padding:10px;
  background:yellow;
  
}

.grid > span:nth-last-child(1) { grid-column:5; }
.grid > span:nth-last-child(2) { grid-column:4; }
.grid > span:nth-last-child(3) { grid-column:3; }
.grid > span:nth-last-child(4) { grid-column:2; }
/*.grid > span:nth-last-child(5) { grid-column:1; } this one is not needed*/
<div class="grid">
<span>a</span>
<span>b</span>
<span>c</span>
<span>d</span>
</div>

<div class="grid">
<span>a</span>
<span>b</span>
</div>

<div class="grid">
<span>a</span>
<span>b</span>
<span>c</span>
<span>d</span>
<span>e</span>
</div>

或者考虑使用 flexbox 会更容易:

.grid {
  display:flex;
  margin:5px;
  justify-content:flex-end;
}
.grid > span {
  padding:10px;
  background:yellow;
  width:calc(20% - 10px);
  margin:5px;
  box-sizing:border-box;
}
<div class="grid">
<span>a</span>
<span>b</span>
<span>c</span>
<span>d</span>
</div>

<div class="grid">
<span>a</span>
<span>b</span>
</div>

<div class="grid">
<span>a</span>
<span>b</span>
<span>c</span>
<span>d</span>
<span>e</span>
</div>

另一个使用 CSS 网格的想法,其中语法可以更直观,更容易扩展到任意数量的列:

.grid {
  display:grid;
  grid-template-columns:repeat(var(--n,5),1fr);
  grid-gap:5px;
  margin:5px;
}
.grid > span {
  padding:10px;
  background:yellow;
  
}

.grid > span:nth-last-child(1) { grid-column-end:-1; }
.grid > span:nth-last-child(2) { grid-column-end:-2; }
.grid > span:nth-last-child(3) { grid-column-end:-3; }
.grid > span:nth-last-child(4) { grid-column-end:-4; }
.grid > span:nth-last-child(5) { grid-column-end:-5; }
.grid > span:nth-last-child(6) { grid-column-end:-6; }

/*.grid > span:nth-last-child(n) { grid-column-end:-n; }
  and so on ...
*/
<div class="grid">
<span>a</span>
<span>b</span>
<span>c</span>
</div>
<div class="grid" style="--n:4">
<span>a</span>
<span>b</span>
<span>c</span>
</div>

<div class="grid" style="--n:3">
<span>a</span>
<span>b</span>
</div>

<div class="grid" style="--n:6">
<span>a</span>
<span>b</span>
<span>c</span>
<span>d</span>
<span>e</span>
</div>

【讨论】:

  • 我不确定会是 5 个孩子。目前,我说“最多 5 列”,但孩子的数量会有所不同
  • @Anthony 是的,我的意思是列不是子项。如您所见,在示例中我使用了不同数量的子项。最后还添加了另一个示例
  • 是的,所以我尝试在容器上使用justify-content,但因为容器的宽度是由子项、间隙和填充的集体宽度决定的,所以没有帮助。我是gtg,但稍后会回来,并更深入地了解您的答案。看到您的方法后想到的一种解决方案是使用您的方法并简单地设置容器的显式宽度,但这可能会导致问题
  • @Anthony 检查我添加的第三种方法,如果列数未知,它应该更适合您的情况
  • @Anthony 从不,在大多数示例中,您都可以在 :root 中看到它,这只是一种习惯(不确定是谁决定的......)。我个人从未(或很少)在:root 中使用它
猜你喜欢
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 2014-06-24
  • 2022-08-14
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 2020-12-09
相关资源
最近更新 更多