当我们 讨论 Flexbox 和 gap
时,我突然意识到,有时我们会选择 Flexbox 的原因是,要将一些盒子排成一行,并稍微间隔开。
我的大脑在这种情况仍然会选择 Flexbox,有了 gap
,它可能会继续这样做。 不过值得注意的是,grid 可以用它自己的特殊方式做到同样的事情。
就像这样
.grid {
display: grid;
gap: 1rem;
grid-auto-flow: column;
}
它们看起来都一样宽,但这仅仅是因为它们没有内容。 有了内容,您会看到这些盒子会根据内容的自然宽度开始互相挤压。 如果您需要进行一些控制,您可以始终对落入这些列的元素设置 width
/ min-width
/ max-width
- 或者,使用 grid-template-columns
设置它们,但不要设置实际的列数,然后让 min-content
决定宽度。
.grid {
display: grid;
gap: 1rem;
grid-auto-flow: column;
grid-template-columns: repeat(auto-fit, minmax(min-content, 1fr));
}
灵活网格 最棒。
另一个想法...如果您只希望整个网格本身与内容一样宽(即小于 100% 或自动,如果需要),那么请注意 display: inline-grid;
是一个选择。
是的,这是 CSS grid 的主要和根本缺陷。 regilar CSS 列函数可以完成这项工作,但问题是浏览器是垂直计算而不是水平计算。 您有解决这个问题的方法吗?
CSS 列源自打印,因此它们做的是几个世纪以来列所做的事情 - 或多或少成功。 自从 CSS 区域 不再是实物,它是唯一可用的布局模式,其中内容将逐渐从一个“布局区域”流入另一个区域,即片段化。
Flexbox 和 Grid 也能做到,但方式不同。 这里片段化是在元素级别应用的,因此“流动”相当粗糙。
如果您不希望 Grid 自动为您创建新列,请告诉它,并声明列数和大小,就像您必须使用 CSS 列一样,它会相应地进行操作(此外:列可以具有不同的宽度。)
列、Flexbox 和 Grid 使用不同的范式来满足不同的布局需求,它们都有自己的优缺点。 它们不是相互排斥的!这三种方法的巧妙组合最终可能会为您提供您想要的布局,以适合您拥有的特定内容。
也许 Houdini 将在它得到广泛支持后,来拯救您(我们)。
遗憾的是,CSS 网格分数在现实世界的示例中根本无法使用。 例如,如果您有一个部分包含“grid-template-columns: 2fr 1fr;” 另一个部分包含“grid-template-columns: 1fr 1fr 1fr;”,如果 grid-gap 大于零,这些列将不会对齐。 这对于创建真正的 Bootstrap 式网格至关重要。
您可以尝试玩弄主网格容器内元素的边框... 然而,分数确实需要这种增强才能成为真正的替代方案。
如果它们具有相同的宽度,无论是通过父容器还是其他方式,它们都应该对齐。 我知道,分数只是按比例分割。 所以 30px 中的 1fr 将是 10px。
我可能是错的,我是一个新手。 但我创建了许多网格、子网格和并行网格,并成功地对齐了它们(尽管经过了一些广泛的新手努力)。
好吧,它们显然在不同的网格中,所以您为什么要期望它们对齐呢?
在这种情况下,您应该使用跨越多个列的网格元素。 要真正对齐它们,它们应该在同一个网格中的不同行,因此它们具有相同的列模板。
FR 表示剩余可用空间的一个分数,而不是容器总宽度的特定宽度:如果只有一列由于较大的图像或过长的单词而溢出,fr 值会缩小。
此外:三列之间的间隙之和(2 * 间隙)当然大于单个间隙的宽度。 因此,在减去所有间隙宽度后,从容器的初始“100%”宽度中剩余的部分将在 'fr' 轨道/列之间分配。 在您的准 3 列场景中,它们的行為与百分比相同 - 并且间隙也不会对齐。
要获得列的平均分配,您应该声明它们: “grid-template-columns: repeat(12, 1fr)” 并让各个网格项根据需要跨越轨道/列。 这样,间隙就不会被考虑在内,您的项目和列会正确对齐。 如果您放弃 Bootsrap/Foundation 布局范例,您可能会得到更少的标记和 CSS。
.cols-12 {display:grid; grid-template-columns: repeat(12, 1fr); gap: 1rem}
.span-2 {grid-column:span 2}
.span-3 {grid-column:span 3}
.full {grid-column:1/-1}
Bootstrap “网格” 面临着同样的问题,但通过使用奇怪的百分比值来定义各种容器的列宽或使用负边距来弥补。 以及数不胜数的实用程序类来在他们的网格上四处推动事物。
这段代码对其他人不起作用吗?
Firefox 和 Chrome 都抛出无效属性错误,而且它似乎没有按照文章中描述的那样工作。 不过,我不知道哪里出了问题...
Codepen: https://codepen.io/jparks/pen/dyYEpPz.
尝试使用 150px 而不是 min-content。