文字跳动源于字体加载引发的行高重排,因后备字体与Web字体度量差异导致;需结合font-size-adjust、预加载+font-display: optional及min-height兜底三策协同解决。
文字跳动是因为字体加载导致的行高重排
浏览器默认会先用系统后备字体渲染文字,等自定义字体(比如
加载完成)再重绘——如果两种字体的
计算结果不同,行高就会突变,造成视觉跳动。这不是 bug,是浏览器的正常行为。
常见错误现象:
开启后首屏文字“闪一下”、段落突然上移或下移
关键原因:后备字体与 Web 字体的
、
不一致,导致相同
下实际行高不同
不能只靠
硬设——它只是倍数,最终像素值仍随字体度量变化而浮动
用 font-size-adjust + line-height 配合控制基线稳定性
是被严重低估的 CSS 属性,它通过保持
或
单位的视觉比例,间接稳定行高。配合固定
值(如
),能大幅削弱跳动。
推荐写法:
(根据字体
调整,思源黑体约 0.52,Inter 约 0.58)
必须搭配
用
或
单位,避免使用无单位数值(如
),否则在字体切换时仍可能波动
注意兼容性:
在 Safari 17+ 和 Chrome 119+ 才完全支持,旧版需降级 fallback
预加载关键字体 + font-display: optional 避免阻塞与闪烁权衡
虽解决 FOIT(Flash of Invisible Text),但加剧 FOUT(Flash of Unstyled Text)跳动;
又导致空白等待。折中方案是用
+
,让字体尽可能早加载,又不阻塞渲染。
在
中加:
CSS 中声明:
意味着:若字体 3s 内未就绪,浏览器直接用后备字体,且不再重试——这反而消除了“等一会儿再跳”的不确定性
注意:必须加
属性,否则预加载失效;WOFF2 格式优先,体积小、兼容好
用 clamp() + min-height 容器兜底防布局塌陷
即使做了上述优化,极端网络条件下字体仍可能延迟加载。此时可对文字容器设置最小高度,用
动态约束,防止内容区域突然收缩或拉伸。
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
立即学习
“
前端免费学习笔记(深入)
”;
示例:
—— 给行高一个弹性但有边界的缓冲区间
不要只设
,会截断内容;
更安全
对多行文本块(如卡片标题+摘要),建议包裹在
中统一设
,比逐个元素处理更可控
慎用
掩盖跳动——这只是视觉遮掩,实际布局抖动仍在,影响可访问性和打印样式
最麻烦的其实是字体度量本身不可控:不同厂商对同一字重的 ascender 设计差异可能达 10%。所以别指望一次 CSS 解决所有跳动,得把
、预加载、容器兜底三者串起来用,漏掉任意一环都容易在某个设备上重现跳动。
@font-faceline-heightfont-display: swapcap-heightascender/descenderfont-sizeline-height: 1.5font-size-adjustexchline-heightline-height: 1.6emfont-size-adjust: 0.5;aspect-valueline-heightemrem1.6font-size-adjustfont-display: swapblockoptionalpreload@font-face { font-family: 'Inter'; src: url('inter-var-latin.woff2') format('woff2'); font-display: optional; }optionalcrossoriginclamp()min-height: clamp(1.4em, 4vh, 2.2em);heightmin-heightdivmin-heightoverflow: hiddenfont-size-adjust