CSS 网格布局中的等高行

2023-12-06

我认为使用 Flexbox 不可能实现这一点,因为每一行只能是适合其元素所需的最小高度,但是使用较新的 CSS 网格可以实现这一点吗?

需要明确的是,我希望网格中所有行中的所有元素的高度相等,而不仅仅是每行。基本上,最高的“单元格”应该决定所有单元格的高度,而不仅仅是其行中的单元格的高度。


简答

如果目标是创建一个具有等高行的网格,其中网格中最高的单元格设置所有行的高度,那么这里有一个快速而简单的解决方案:

  • 将容器设置为grid-auto-rows: 1fr

怎么运行的

网格布局提供了一个在网格容器中建立灵活长度的单元。这是fr单元。它旨在分配容器中的可用空间,有点类似于flex-growFlexbox 中的属性。

如果将网格容器中的所有行设置为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 项目所需的最小高度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CSS 网格布局中的等高行 的相关文章