前几天 Dave 和我在 ShopTalk 上邀请了 Jen Simmons。Jen 在谈论 内在网页设计,以及其中一个核心原则就是网格具有行和列,它们不一定会以相同的速率变化,或者本质上具有不同的行为规则。
例如,采用以下(人为的)网格设置
.grid {
display: grid;
grid-template-columns: 1fr minmax(50px, 100px) 20% auto;
}
这些列中的每一列都会表现不同。
我正在努力理解这一点,并且肯定没有完全理解它。根据“强度”(我想?)从 1 到 4 对宽度进行编号,它似乎是这样的。
.grid {
display: grid;
grid-template-columns:
1fr /* #4 - Weakest, will fill remaining space */
minmax(50px, 100px) /* #3 - Will only start changing when other columns force it */
20% /* #1 - Definite size, steady */
auto /* #2 - Indefinite size, entirely based on content, pushy */
;
}
这与我们过去设置网格列的相当长的历史大不相同。基于浮动网格通常使用百分比(明确的尺寸)来设置列。基于内联块的网格也是如此,通常也是如此。
即使使用网格,如果您使用所有百分比或所有分数单位设置所有列,您可能也会得到一个稳定的网格,其中内部内容不会影响大小。但 Jen 说,有趣的是,有一个网格让内容决定其大小的方式。拥抱它。在我看来很有趣。
但无论如何,假设您正在设置一个网格,该网格使用混合的值来设置列宽,例如这样。不要在完全空的列上使用这种方法,否则,您将对这些列的行为产生错误的认识。
看看这个演示,这四个网格具有完全相同的设置,唯一的不同是每列中的文本量。
查看笔 不同列宽值的不同折叠率 由 Chris Coyier (@chriscoyier) 在 CodePen 上。
又酷又奇怪。
这与您非常有用的 Flexbox 页面(https://css-tricks.cn/snippets/css/a-guide-to-flexbox/)上 3 列示例中遇到的问题非常相似 :) 如果您在该 3 列示例的侧边栏中添加更多内容,整个内容就会崩溃。
在创建演示时,使用“奢华”的内容非常重要,因为这将很快显示出概念中的错误 :)
哇,这太有用,因为许多教程都没有深入探讨设置网格单元格的不同方式时会遇到什么情况。一个问题:为什么设置为“minmax(50px, 100px)”的单元格从不低于 100px?
在第一个网格中,为什么
auto
列(其文本已经换行)没有将第二列向下推到50px
?当视窗缩小时,第二列最终会下降到50px
。为什么只在那时?什么决定了何时开始发生这种情况?难道不应该在第四列中的文本开始换行之前下降到50px
吗?背后肯定存在某种算法。我以为是类似于同时缩小的列被设计为同时达到其最小值...但这里似乎并非如此。
我认为这与 Rachel Andrew 最近在 Smashing Mag 上写到的内在/外在大小有关:https://www.smashingmagazine.com/2018/09/flexbox-sizing-flexible-box/#the-css-intrinsic-and-extrinsic-sizing-specification
我认为我已经弄明白了。浏览器根据
auto
列的宽度缩小minmax()
列。该算法如下确定
auto
列的最小宽度(在演示中为89px
)。计算
minmax()
列中min
和max
之间的差值 (100px
–50px
=50px
)。将这两个值加在一起:
89px
+50px
=139px
。当
auto
列缩小到139px
时,minmax()
列将开始缩小。这两列将以相同的速率缩小50px
,直到它们达到其最小值。这真是太有趣了。我创建了 Codepen 的一个分支来显示列属性。(我发现以这种方式进行比较/对比更容易)
我想看到这些类型的示例始终包含至少一个额外长的词。我认为这应该是网页设计的基本原则。
在这种情况下,可以使用
overflow-wrap
轻松解决,但没有经验的人总是会陷入非断字词的经典错误(尤其是在使用被诅咒的表格渲染时)。干杯
这是一个好主意。基于内容过大而导致网格膨胀的问题与内容过小导致奇怪现象的问题一样严重。
你可以始终使用这个:Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch。是的,这是一个真实的词语(世界上最长的城市名)
来自规范
https://www.w3.org/TR/css-grid-1/#min-size-auto
“请注意,虽然基于内容的最小尺寸通常是合适的,并且有助于防止内容重叠或溢出其容器,但在某些情况下它是不合适的
特别是,如果使用网格布局作为文档的主要内容区域,最好设置一个明确的字体相对最小宽度,例如 min-width: 12em。基于内容的最小宽度会导致大型表格或大型图像拉伸整个内容区域的大小,可能会进入溢出区域,从而使文本行不必要地长且难以阅读。
还要注意,当对包含大量内容的项目使用基于内容的大小设置时,布局引擎必须遍历所有这些内容才能找到其最小尺寸,而如果作者设置了明确的最小值,则不需要这样做。(但是,对于包含少量内容的项目,这种遍历是微不足道的,因此不会影响性能。)”