关键css必须紧贴之后、无任何标签插入,否则首屏白屏;需内联且gzip≤14.6kb,禁用@import和url(),非关键css用media="print" onload切换,preload需配合onload动态启用。

关键CSS没放对位置,首屏就白屏
浏览器解析HTML是字节流式顺序执行的,遇到第一个阻塞渲染的资源(比如未设media的<link rel="stylesheet">)就会暂停DOM构建和绘制。如果关键CSS的<style></style>标签前面插了任何东西——哪怕只是一个内联<script></script>、一个<meta>或另一个<link>——它就无法及时参与首屏Render Tree构建。
常见错误现象:document.querySelector('.hero-title')能取到元素,但getComputedStyle(el).color返回空字符串;Performance面板里Layout事件卡在某个<style></style>上;页面有DOM但无样式,纯白屏。
-
<style></style>必须紧贴<meta charset>之后,不能有任何其他标签(包括统计脚本、SEO meta、preload link)插在中间 - 不要把关键CSS拆成多个
<style></style>块,浏览器会按顺序逐个解析,中间插入任何内容都会打断 - 服务端模板(如EJS)注入逻辑必须在
闭合前完成,不能在body渲染中途插入
非关键CSS用media="print"异步加载才不阻塞
默认<link rel="stylesheet">是强阻塞的,不管它用在页面哪部分,只要出现在里,浏览器就等它下载+解析完才继续渲染。但加了media属性后行为完全不同:只要当前不匹配(比如media="print"),浏览器就异步加载,不阻塞渲染树构建。
典型翻车点:media="(max-width: 768px)"在iPhone SE(375×667)上会命中,照样阻塞;media="screen"也阻塞,因为默认匹配;@import写在CSS里,不仅串行加载,还可能被重复请求两次。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- 非关键CSS推荐写法:
<link href="non-critical.css" rel="stylesheet" media="print" onload="this.media='all'"> - 降级必须加:
<noscript><link rel="stylesheet" href="non-critical.css"></noscript>,否则JS失败时样式永久丢失 - 禁止在已构建的CSS文件中写
@import url(),改用PostCSS@use或Sass@forward
preload + onload组合能提前调度关键CSS
<link rel="preload" as="style">只下载不解析,必须配合onload回调动态切换rel为stylesheet才能生效。它绕过默认阻塞时机,让关键CSS更早进入CSSOM构建流程。
容易踩的坑:as="style"漏写,浏览器当普通fetch处理;onload里没立刻改rel,样式不会应用;没清空this.onload = null,可能重复执行;插入位置不对,导致样式覆盖顺序错乱。
- preload后必须立即用JS插入对应
<link rel="stylesheet">,且插入位置要手动控制在关键样式之后、非关键样式之前 - 体积控制:内联关键CSS需gzip后≤14.6KB,否则仍可能延迟首屏绘制
- 剔除
@import、url()、@font-face等异步引用,它们会让内联CSS实际仍需等待外部资源
构建工具输出的CSS顺序常被忽略
Webpack/Vite生成带contenthash的文件名(如button.789xyz.css),但HTML插件(如HtmlWebpackPlugin)可能按字母序或chunk id排序插入<link>,导致基础样式(如reset.fgh456.css)反而后加载——结果就是按钮样式覆盖了重置规则,页面错乱。
这不是运行时问题,而是构建产物中link顺序与设计意图脱钩。一旦出现FOUC或样式闪烁,先查HTML源码里<link>的实际顺序,而不是盯着JS逻辑看。
- 显式声明CSS chunk依赖关系,在构建配置中设置优先级
- 避免用
@import跨文件引入,会导致加载顺序不可控 - 动态插入
<link>时,必须insertBefore目标节点,不能appendChild到末尾
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










