CSS未生效的五大原因:①preload/prefetch未配合JS注入导致白屏;②media属性不匹配使样式被屏蔽;③link标签误加defer/async属性无效且危险;④服务器未返回text/css MIME类型;⑤构建工具配置错误混淆script与style处理逻辑。
rel="preload" 或 rel="prefetch" 加载了这类预加载方式不会自动将 CSS 应用到页面,仅下载资源。如果误用 且没接 onload 注入逻辑,页面就会白屏或无样式。
preload 却没补上 JS 注入:需手动创建 或插入
prefetch 更不适用——它只用于未来导航,当前页面完全不生效 同步加载;非关键才考虑 preload + onload 动态注入media 属性导致 CSS 被“屏蔽”常见
于响应式写法:,或错误设为 media="(max-width: 0px)" 等永远不匹配的条件,浏览器会下载但不应用。
css,点击对应请求 → 查看 Initiator 列是否显示 link[media]
标签的 media 值,临时改成 media="all" 测试是否恢复样式media 不支持 JS 表达式,也不能写成 media="screen and (min-width: 768px) and print" 这类矛盾组合defer 或 async 加载 CSS(无效且危险)defer 和 async 是为 设计的,对 完全无效——但部分构建工具(如 Webpack 的 mini-css-extract-plugin 配置错误)可能意外产出带这些属性的标签,导致浏览器忽略或报错。
,确认是否存在非法属性
,说明打包配置混淆了 script 与 style 处理逻辑link 标签而非动态 script 注入;禁用对 的自动添加 defer 行为Content-Type: text/plain 而不是 text/css
即使路径正确、标签合法,如果服务端未设置正确的 MIME 类型,浏览器会拒绝解析 CSS,控制台报错 The resource ... was preloaded using link preload but not used within a few seconds 或直接静默失败。
Content-Type 字段python -m http.server 默认不设 .css 类型location ~ \.css$ {
add_header Content-Type text/css;
}media、一行错误的构建配置、甚至本地起的服务根本没发对头。别急着重写样式,先盯住 Network 面板里的那条 CSS 请求,看它到底被浏览器怎么对待了。