必须设rel="stylesheet",否则浏览器不发起css请求、不解析规则、不报错;该值大小写敏感,是强制触发机制,非可选语义标记。

直接用 document.createElement('link') 创建并插入到 document.head 就能生效,但必须设对 rel 和 href,且不能漏掉 rel="stylesheet" —— 这个漏了就完全不加载,连报错都不会有。
为什么 link 元素必须加 rel="stylesheet"
浏览器只认 rel="stylesheet" 才会真正发起 CSS 请求并解析规则;写成 rel="style"、rel="css" 或干脆不设,元素虽在 DOM 里,但样式不会应用。这个属性不是可选的“语义标记”,而是强制触发机制。
-
rel必须严格等于"stylesheet"(大小写敏感) -
type="text/css"在现代浏览器中可省略,但保留也不影响 - 如果目标 CSS 域名跨源且没配 CORS,控制台会静默失败(无 error 事件),只在 Network 面板看到 403 或 CORS 错误
如何避免重复加载同一份 CSS
多次调用加载函数时,可能插入多个相同 href 的 link 标签,既浪费请求又可能引发样式冲突。最轻量的防重逻辑是查 DOM:
用 document.querySelector(`link[href="${url}"]`) 判断是否已存在;注意要对 url 做基础转义(比如 url.replace(/"/g, '\"')),否则含引号或空格会破坏选择器。
- 不要依赖
link.onload后再检查——它只表示资源下载完成,不代表样式已计算生效 - 如果 CSS 文件本身带版本参数(如
theme.css?v=2.1),需确保比对时也带上参数,否则theme.css和theme.css?v=2.1被视为不同资源
load 和 error 事件监听要手动加
link 元素默认不抛异常,加载失败也不会中断 JS 执行。想捕获失败,得显式监听:
link.onload = () => { console.log('CSS loaded'); };link.onerror = () => { console.warn('Failed to load CSS:', url); };
-
onload在样式表解析完毕后触发(不是仅下载完),此时 DOM 已应用新规则 -
onerror在网络失败、404、CORS 拒绝等场景下触发;但注意:HTTP 200 + 空文件或语法错误的 CSS 不会触发onerror - 某些老旧安卓 WebView 对
onerror支持不稳定,必要时可配合setTimeout检查document.styleSheets长度变化作为兜底
真正容易被忽略的是:CSS 加载是异步且无阻塞的,但它的规则会立即参与样式计算。如果在插入 link 后立刻读取某个元素的 getComputedStyle,结果可能还是旧值——得等 onload 触发后才可靠。这不是缓存问题,是渲染管线本身的时机差异。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











