我和 Dave 在 最新的 ShopTalk Show 中播放了 Tim Brown 的一段音频片段,他回复了我们之前关于垂直节奏(以及其他)的一些闲聊。文字记录 在这里。这引发了关于这些事情的另一个有趣的讨论。
其中一小部分是关于 Tim 创造的短语 “熔融行距”,它本质上是取决于行 *长度* 的 line-height
。
正如 Tim 所说,这实际上是一种“三元”关系
这里最让我感兴趣的是排版中的基本三元关系——文本的字号、行高和行长。调整这些元素中的任何一个而没有调整其他元素,就会导致阅读不舒适,这也是设计师在处理流体网页布局时遇到困难的原因之一。
在 CSS 中,没有简单明了的方法可以将元素的宽度与其 line-height
连接起来(尽管你可以 使用 JavaScript)。我认为这又是 容器查询 的一个用例!你可以使用媒体查询调整行高(正如 Andy Clarke 建议的那样)。基本示例
main {
line-height: 1.4;
}
@media (max-width: 600px) {
main {
line-height: 1.3;
}
}
但是,浏览器窗口宽度并不一定代表当前元素的宽度。
此外,任何固定断点解决方案在这里都不是完美的解决方案。这三个属性之间更加流畅的连接会更好。自 Tim 和他的朋友们在 2012 年进行最初探索以来,calc()
与视窗单位相结合,让我们更近了一步。
我们之前谈论过 视窗单位。通过使用 vw
设置字号,我们可以使字体大小根据浏览器窗口宽度进行调整。
以下是一个示例,其中我们有一些基本值,只需要用视窗单位进行细微调整即可
body {
font-size: calc(1em + 1vw);
line-height: calc(1.2em + 1vw);
}
查看 CodePen 上 Chris Coyier (@chriscoyier) 的 熔融行距。
这很简单。Tim 最初建议使用更复杂的公式
事实证明 Mike Riethmuller 已经 玩过这个。例如,它会像 这样 进行操作
body {
font-size: 1em;
line-height: 1.4em;
}
@media screen and (min-width: 20em) {
body {
font-size: calc(1em + (1.3125 - 1) * ((100vw - 20em) / (80 - 20)));
line-height: calc(1.4em + (1.8 - 1.4) * ((100vw - 20em) / (80 - 20)));
}
}
@media (min-width: 80em) {
body {
font-size: 1.3125em;
line-height: 1.8em;
}
}
Mike 甚至 用 Sass 处理了它
$min_width: 400;
$max_width: 800;
$min_font: 12;
$max_font: 24;
:root { font-size: #{$min_font}px; }
@media (min-width: #{$min_width}px) and (max-width: #{$max_width}px) {
:root {
font-size: calc(#{$min_font}px + (#{$max_font} - #{$min_font}) * ( (100vw - #{$min_width}px) / ( #{$max_width} - #{$min_width})));
}
}
@media (min-width: #{$max_width}px) {
:root {
font-size: #{$max_font}px;
}
}
查看 CodePen 上 Mike (@MadeByMike) 的 精确响应式排版。
所以,是的:这是一个你可以做的事情。
我对播客中关于熔融行距的开头部分非常感兴趣,看到它实际应用很酷。但是——啊,看到它实际应用,我不确定,当行高在最小屏幕尺寸下发生变化时,它是否真的更“舒适”。我理解一些排版狂热者——敬意!——会认识到它的重要性,但它也让我有点眼花。
我的眼睛也感到疼痛。说真的,谁喜欢在手机上用 *那么小* 的字体,而在台式机上用 *那么大* 的字体呢?
这里没有强制任何最小值和最大值。你应该根据良好的阅读体验做出这些选择。
如果我们使用“啊!我的眼睛!!”的夸张说法,我会说当行高和字号 *没有* 与行长结合考虑时,我的脸豆子会流出最多的血 ;)
Chris,你说得对,只是那个演示的默认值真的很糟糕。
脸豆子。呵呵。
看起来这在 Firefox 48 版本之前不支持
https://bugzilla.mozilla.org/show_bug.cgi?id=594933
Chrome、IE11 和 Edge 都可以正常工作。
但是,如果你 *可以* 在 CSS 中访问元素的宽度怎么办?使用 EQCSS,这在
@element
查询中将是eval("clientWidth")
,因此你绝对可以将它用作calc()
中的值之一!我 最近不得不做类似的事情,缩短打印时更长的文本,这样它就不会分成两页——我一直思考如何调整它以考虑行长,所以这篇帖子非常及时 :)
谢谢!
对于那些想知道这使用了什么魔法的人,这里有一个关于数学的解释
让我们分解一下……
我认为我会更喜欢使用元素查询来实现这一点,https://github.com/marcj/css-element-queries
在这里获得正确的数字似乎非常棘手。
在
calc()
中使用视窗单位的常规单位还有另一个好处,即保留浏览器缩放哎呀,它把我的表情符号吃了。我向你保证,它很兴奋。