简答
如果目标是创建一个具有等高行的网格,其中网格中最高的单元格设置所有行的高度,那么这里有一个快速而简单的解决方案:
- 将容器设置为
grid-auto-rows: 1fr
怎么运行的
网格布局提供了一个在网格容器中建立灵活长度的单元。这是fr单元。它旨在分配容器中的可用空间,有点类似于flex-grow
Flexbox 中的属性。
如果将网格容器中的所有行设置为1fr
,让我们这样说:
grid-auto-rows: 1fr;
...那么所有行的高度将相等。
这并没有什么意义,因为fr
应该分配可用空间。如果几行的内容具有不同的高度,那么当空间分布时,一些行会成比例地变小和变高。
Except,埋藏在网格规范深处的是这个小金块:
7.2.3.灵活的长度:fr
unit
...
当可用空间无限大时(当网格
容器的宽度或高度是不确定的),弹性大小(fr
)网格轨道是
调整其内容的大小,同时保留各自的比例。
每个弹性大小的网格轨道的使用大小是通过确定来计算的
这max-content
每个弹性大小的网格轨道的大小并将其划分
尺寸通过相应的弹性系数来确定“假设的1fr
尺寸”。
其中的最大值用作已解析的1fr
长度(
flex 分数),然后乘以每个网格轨道的 flex
决定其最终尺寸的因素。
因此,如果我正确地阅读了本文,那么在处理动态大小的网格(例如,高度不确定)时,网格轨道(在本例中为行)的大小将根据其内容进行调整。
每行的高度由最高的 (max-content) 网格项。
这些行的最大高度变为长度1fr
.
这就是如何1fr
在网格容器中创建等高的行。
为什么 Flexbox 不是一个选择
正如问题中所指出的,使用 Flexbox 不可能实现等高行。
Flex 项目在同一行上可以具有相同的高度,但不能跨多行。
此行为在 Flexbox 规范中定义:
6. 柔性线
在多行 Flex 容器中,每行的交叉大小是包含该行上的 Flex 项目所需的最小大小。
换句话说,当基于行的 Flex 容器中有多行时,每行的高度(“交叉大小”)是包含该行上的 Flex 项目所需的最小高度。