CSS Grid 网格布局中新引入的 Fr 单位用法教程
CSS grid 网格布局模块附带了一个新的 CSS 单位,名为 fr 。fr 是 “分数(fraction) “一词的缩写,简单明了。有了这个新单尾,我们就可以快速将网格按比例分割成不同的列或行。因此,创建完全响应和灵活的网格几乎变得轻而易举。
由于 fr 单位是与网格布局模块一起推出的,因此您可以在任何支持 CSS 网格的浏览器中使用它。
基本用法
首先,让我们来看看使用 fr 单位的基本网格。下面的布局将空间划分为三列等宽和两行等高。

假设 HTML 页面由六个标有 .box 类的 div 组成,位于一个 .wrapper div 内。
<div class="wrapper"> <div class="box box-1">1.</div> <div class="box box-2">2.</div> <div class="box box-3">3.</div> <div class="box box-4">4.</div> <div class="box box-5">5.</div> <div class="box box-6">6.</div> </div>
要使用网格布局模块,需要在父容器元素上添加 display: grid; CSS 属性。grid-template-columns 属性使用 fr 单位作为值;三列的比例为 1:1:1。
对于网格行(grid-template-rows 属性),我没有使用 fr 单位,因为只有在父容器高度固定的情况下,使用 fr 单位才有意义。否则,在某些设备上会产生奇怪的结果,不过,即便如此,fr 单位仍能保持比例(这一点非常重要)。
gap 属性会在方框之间添加一个 10px 的网格。如果不需要任何间隙,只需删除该属性即可。
.wrapper {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: 200px 200px;
gap: 10px;
}
.box {
color: white;
text-align: center;
font-size: 30px;
padding: 25px;
}
请注意,上面的 CSS 不包含一些基本样式,如背景颜色。您可以在文章末尾的演示中找到完整代码。
改变比例
当然,你不能只使用 1:1:1,而是可以使用任何你想要的比例。下面,我使用了 1:2:1 的分数,同样将空间分为三列,但中间一列的宽度是其他两列的两倍。

我还增加了 gap 的值,这样你就能看到它是如何改变布局的了。基本上,浏览器会从视口宽度中扣除网格间隙(在本例中,网格间隙加起来为 80px),然后根据给定的分数分割其余部分。
.wrapper {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
grid-template-rows: 200px 200px;
grid-gap: 40px;
}
将 fr 与其他 CSS 单位组合
您也可以将 fr 单位与任何其他 CSS 单位相结合。例如,在下面的示例中,我在网格中使用了 60% 1fr 2fr 的比例。

那么,这是如何工作的呢?浏览器会将视口宽度的 60% 分配给第一列。然后,浏览器会将其余空间按 1:2 的比例分割。
同样的内容也可以写成 60% 13.33333% 26.66667%。但老实说,为什么有人要使用这种格式呢?分数单位的一个巨大优势是提高了代码的可读性。此外,它还完全准确,因为百分比格式加起来仍然只有 99.9999%。
.wrapper {
display: grid;
grid-template-columns: 60% 1fr 2fr;
grid-template-rows: 200px 200px;
grid-gap: 10px;
}
除了百分比,您还可以将其他 CSS 单位与分数单位一起使用,例如 pt、px、em 和 rem。
用 fr 添加空白
如果你不想让你的设计杂乱无章,想在网格中添加一些空白,怎么办?fr 单元也有一个简单的解决方案。

正如你所看到的,这个网格有一列是空的,但仍然保留了所有六个方框。对于这种布局,我们需要将空间分割成四列,而不是三列。因此,我们在 grid-template-columns 属性中使用了 1fr 1fr 1fr 1fr 值。
我们使用点符号在 grid-template-areas 属性中添加空列。基本上,该属性允许你引用已命名的网格区域。而且,你可以使用 grid-area 属性来命名网格区域,每个区域都需要单独使用。
.wrapper {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
grid-template-rows: 200px 200px;
grid-gap: 10px;
grid-template-areas:
"box-1 box-2 . box-3"
"box-4 box-5 . box-6";
}
.box-1 {
grid-area: box-1;
}
.box-2 {
grid-area: box-2;
}
.box-3 {
grid-area: box-3;
}
.box-4 {
grid-area: box-4;
}
.box-5 {
grid-area: box-5;
}
.box-6 {
grid-area: box-6;
}
空白区域不一定要形成一列,可以在网格的任何位置。
repeat() 函数
您还可以将 fr 单位与 repeat() 函数结合使用,以获得更简单的语法。如果你只有一个简单的网格,这并不是必须的,但如果你想实现复杂的布局,例如嵌套网格,这就很有用了。
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
/* grid-template-columns: 1fr 1fr 1fr; */
grid-template-rows: 200px;
grid-gap: 10px;
}
repeat(3, 1fr) 语法的结果与 1fr 1fr 1fr 的布局相同。下面的布局与第一个示例相同。

如果在 repeat() 函数中增加乘数,就会有更多列。例如,repeat(6, 1fr) 的结果是六列相等。在这种情况下,我们的所有方框都将位于同一行,这意味着只需为 grid-template-rows 属性使用一个值(200px)即可。
.wrapper {
display: grid;
grid-template-columns: repeat(6, 1fr);
grid-template-rows: 200px;
grid-gap: 10px;
}

您可以多次使用 repeat()。例如,在下面的示例中,最后三列的宽度是前三列的两倍。
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr) repeat(3, 2fr);
grid-template-rows: 200px;
grid-gap: 10px;
}

您还可以将 repeat() 与其他 CSS 单位结合使用。例如,你可以使用 200px repeat(4, 1fr) 200px 作为有效代码。
如果你对如何使用 CSS grid 网格模块、repeat()函数和 fr 单位创建复杂布局感兴趣,Rachel Andrew 有一篇有趣的博文介绍了如何做到这一点。
用于实验的演示
最后,这是我承诺过的演示。它使用了与本文第一个示例相同的代码。运行它,看看你能用 fr 单位实现什么。
本文文字及图片出自 Guide to CSS Grid Layout Fr Unit
