第 9 课 21 / 25 | 编码:L09-13b

Grid:把活动卡片排成行与列

fr 是 Grid 中用于分配空间的单位,前面的数字表示分配权重;本例三个 1fr 各分一份。

定义三列,放入六张卡片

.programs {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 12px;
}

grid-template-columns 中的三个值分别设置三列。六张活动卡片默认按源码顺序逐行放置。

同一列的卡片上下对齐

唱腔赏析
服饰观察
舞台交流
唱词阅读
角色介绍
活动记录

本例没有固定宽度的列。先留出两个 12px 列间距,再由三个 1fr 等分可分配的宽度。

假设内容区宽 600px,且内容不会撑大列宽:

(600 − 12 × 2)÷ 3 = 192px/列
“剩余空间”怎么算?加入固定宽度的一列

这里的“剩余”不是放完文字、图片后留下的空白。在下面的例子中,先扣除固定列宽和列间距,再分配剩余宽度。

第一列固定,后两列按 1∶2 分配

.programs {
  display: grid;
  width: 600px;
  grid-template-columns: 200px 1fr 2fr;
  gap: 20px;
}

逐步计算

假设容器内容区宽 600px,且内容不会撑大列宽。

  1. 第一列占 200px。
  2. 两个列间距占 20 × 2 = 40px。
  3. 剩余宽度:600 − 200 − 40 = 360px。
  4. 后两列共分三份,每份 360 ÷ 3 = 120px。

第二列 1fr 得到 120px;第三列 2fr 得到 240px。

补充:repeat 简写与列宽限制

repeat(3, 1fr) 表示把 1fr 重复三次,等同于 1fr 1fr 1fr。

三个 1fr 并不在所有情况下都保证三列等宽。默认情况下,列有自动确定的最小宽度;长且不可换行的内容可能把其中一列撑大,使它不能按预期缩小。

如果希望列可以继续缩小,可写成:

grid-template-columns: repeat(3, minmax(0, 1fr));

minmax(0, 1fr) 将每列的最小宽度设为 0,再用 1fr 分配空间。内容仍可能溢出;文字换行或溢出处理需要另行设置。

参考:CSS Grid 规范中的 fr 单位。

完整代码与运行演示
<style>
.programs {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 12px;
}
article {
  padding: 12px;
  border: 1px solid teal;
}
</style>

<div class="programs">
  <article>唱腔赏析</article>
  <article>服饰观察</article>
  <article>舞台交流</article>
  <article>唱词阅读</article>
  <article>角色介绍</article>
  <article>活动记录</article>
</div>