在CSS网格中自动调整列宽:auto-fill与auto-fit

2025-2-20 20:11:26

CSS网格最强大和便捷的功能之一是,除了明确指定列宽之外,我们还可以选择重复填充网格中的列,然后自动放置项目。具体来说,我们可以指定希望网格中有多少列,并让浏览器为我们处理这些列的响应式变化——在较小的视口尺寸上显示较少的列,在屏幕空间允许时显示更多的列,而无需编写任何媒体查询来规定这种响应行为。

我们只需一行CSS就能实现这一点——这行代码让我想起了邓布利多在霍勒斯的公寓里挥动魔杖,“家具飞回了它们原来的位置;装饰品在半空中重新成形,羽毛迅速飞进垫子里;撕破的书本在落到书架上时自我修复……”。

这种神奇、无需媒体查询的响应性是通过使用repeat()函数和自动放置关键字实现的。

简单总结一下,repeat()函数允许你根据需要重复列多次。例如,如果你要创建一个12列的网格,你可以写出如下一行代码:

.grid {
  display: grid;
  /* 定义网格列的数量 */
  grid-template-columns: repeat(12, 1fr);
}

这里的1fr告诉浏览器在列之间分配空间,使每列均等地得到一份空间。也就是说,它们都是流式的等宽列。在这个例子中,网格将始终有12列,无论它有多宽。但正如你可能已经猜到的那样,这种方法在较小的视口上内容会被挤压,所以并不理想。

因此我们需要为列指定一个最小宽度,确保它们不会变得太窄。我们可以使用minmax()函数来实现这一点。

grid-template-columns: repeat(12, minmax(250px, 1fr));

但是,按照CSS网格的工作方式,如果视口宽度不足以容纳所有具有新最小宽度要求的列,则会导致行溢出,因为我们在明确告诉浏览器每行重复12次列。

为了实现换行,我们可以使用auto-fit或auto-fill关键字。

grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));

这些关键字告诉浏览器为我们处理列的大小和元素换行,使得当宽度不足以容纳所有元素而不产生溢出时,元素会换行到新行。我们使用的分数单位还确保,如果宽度允许容纳一部分列但不足以容纳一整列的空间,那么这部分空间将被分配给已有的列,确保在行末不留空隙。

关于auto-fillauto-fit之间的区别,只有在行宽足以容纳更多列时才会显现出来。如果你使用的是auto-fit,内容将会拉伸以填满整个行宽。而使用auto-fill时,浏览器会允许空列占据空间,就像它们不是空的一样——即使没有网格项,它们也会被分配一定的空间,从而影响其他列的位置和大小。哪种行为是你想要的或更喜欢的完全取决于你自己。目前我还没想到一个auto-fillauto-fit更适用的用例。如果有这样的用例,请在评论中分享。

版权声明:本文内容结合人工智能完成,对于内容的准确性和完整性我们不做保证,也不代表本站的态度或观点。本文内容版权归属相关权利人(第三方权利人或找找网)。如若内容造成侵权/违法违规,请联系我们删除!

文章标签: