流式排版是指 font-size
(以及可能其他字体属性,例如 line-height
)根据屏幕大小(或者如果我们有的话,根据容器查询)而变化的想法。
主要的技巧来自 视窗单位。您可以直接使用视窗单位设置字体大小(例如 font-size: 4vw
),但尺寸的波动非常大,通常不可取。可以使用 font-size: calc(16px + 1vw)
之类的方案来进行调整。但是,当我们开始使用计算来进行美化时,最常见的实现方法变成了一个用来计算普通英文的公式
我希望字体大小在 320px 屏幕上是 16px,在 1000px 屏幕上是 22px。
最终 变成了这样
html {
font-size: 16px;
}
@media screen and (min-width: 320px) {
html {
font-size: calc(16px + 6 * ((100vw - 320px) / 680));
}
}
@media screen and (min-width: 1000px) {
html {
font-size: 22px;
}
}
这实质上是在设置字体大小的 **最小值** 和 **最大值**,这样字体就不会缩小或放大到过于极端的程度。“CSS 锁定” 是 Tim Brown 创造的一个术语。
**最小值** 和 **最大值** 您说?!正好,用于这些功能的函数已经 加入了 CSS 规范,形式为 min()
和 max()
。
因此,我们可以使用一行代码来简化上面的花哨设置并保持锁定
html {
font-size: min(max(1rem, 4vw), 22px);
}
我们实际上可能想在此处停止,因为虽然 Safari (11.1+) 和 Chrome (79+) 当前都支持此功能,但这是今天支持范围的极限。说到这里,您可能还想在它之前添加一个 font-size
声明,以设置一个没有花哨功能的合理回退值。
但是,只要我们不断突破极限,还有一个函数可以进一步简化事情:clamp()
!Clamp 接受三个值:最小值、最大值和中间的灵活单位(或计算或任何其他值),如果值在最小值和最大值之间,它将使用该值。因此,我们的单行代码变得更加简洁
body {
font-size: clamp(100%, 1rem + 2vw, 24px);
}
这将在 Chrome 79+ 中起作用(尚未 发布 到稳定版,但很快就会发布)。
Dave 叔叔非常高兴 FitText 现在只有几字节,而不是全部 jQuery 加上 40 行代码。以下就是 Dave 向其中添加 CSS 自定义属性的方式
刚看到这个不错的解释
早间开发信息:CSS
— Stefan Judis (@stefanjudis) 2020 年 4 月 20 日clamp
可用于流式排版。🎉
🔗 `clamp` 在 MDN 上:https://#/4xZpDfYoqB
视频 alt:示例展示了如何使用clamp
为 h1 元素实现流式/响应式排版 pic.twitter.com/9iiCxxXJO7
太棒了!请有人为 ES6 中的 clamp 技巧制作一个 polyfill。
但是 4vw 在屏幕宽度仅为 550px 时就能达到 22px,因此最好使用计算方法。
@Matt,这不是重点吗?或者这不是故意的吗?
字体大小在屏幕宽度为 550px 之前为 4vw。所有高于该大小的内容都限制为 22px。
同意,我更喜欢能够使用视窗宽度来定义缩放何时结束,而长
calc()
公式可以让您做到这一点。我创建了一个自定义 Sass 混合器,以便更轻松地生成这些公式 https://threespot.github.io/frontline-sass/documentation/#main-function-fs-scale 希望其他人会发现它有用!只需将其调整为 2.2vw 即可
这是一个很棒的技巧。它真的可以帮助您在使网站适应移动设备时省去很多麻烦。谢谢!
很棒的资料
我想知道这对项目中使用 rem 单位意味着什么?如果您使用的是流式字体,那么我认为您所有其他元素都应该使用 PX 进行大小调整。否则,如果用户更改了基本字体大小,那么所有元素都会放大,但文本除外。
如果用户浏览器默认字体大小超出了该最小值和最大值范围,这是否仍然正常工作?我将我的默认字体大小设置为 24px,因为我的眼睛很差。
我想知道您对使用 ch 单位的看法。它们在很大程度上得到支持,此外,虽然它们并不完美,但它们非常适合处理我们希望在段落中将每行的字符数保持在合理范围内的场景。我们还可以使用公式 (calc()) 对它们进行微调。
这很酷。我一直使用 scss 混合器做类似的事情,到目前为止效果很好。
查看 CodePen 流式排版,作者:Marc Müller
(@mkmueller) 在 CodePen 上。
RFS 也是一个很好的例子。它现在还支持其他 CSS 属性的响应式大小调整,并且是 Bootstrap 的一部分:https://github.com/twbs/rfs
您好,
感谢您的文章和解决方案!
我有两个问题
1 - 此公式也适用于其他元素吗?在这种情况下,我可以将其用于行高吗?
因为在某些屏幕上调整大小后,行会很高,而应将其减小。
‘: min (max (1.3rem, 3vw), 35px)! important;’
2 - 最小值和最大值是如何管理的?我尝试过应用它,但它似乎与我的预期相反。
这里似乎 35px 是最大尺寸,而 (1.3rem, 3vw) 是适合的最小尺寸。对吗?因为我在测试网站上尝试过,它对我来说就是这样工作的。
谢谢
我不确定如何将这两个提供的示例关联起来。考虑一下这个
不清楚
4vw
部分是如何出现的。它与我们之前使用的 100vw 有什么关系?另一个示例是这个
现在我们有了 2vw。它与 4vw 有什么关系?
毫无疑问,这是我理解上的不足,但在很多这类文章中,我发现代码示例似乎使用了不同的值,但却没有解释代码示例之间的值是如何关联的。
我想,让我感到困惑的第一点是:为什么一个示例在
html
上声明,而另一个示例在body
上声明?文章中没有任何内容说明为什么是这样。为什么一个示例显示22px
,而另一个示例显示24px
?同样,我不太清楚如何将这些示例关联起来,因为我假设它们旨在展示实现相同效果的不同方法。