rel="stylesheet" 必须显式设置,否则浏览器完全忽略该 link 标签;插入 head 才能避免 FOUC;仅 onload/onerror 可靠监听加载;重复插入相同 href 会触发多次请求。

rel="stylesheet" 必须显式设置,否则浏览器完全忽略该 link 标签——这是最常被跳过的硬性前提,不是可选项。
必须设 rel="stylesheet" 才会触发加载
浏览器只识别 rel="stylesheet"(注意拼写,rel="style"、rel="css" 或漏写都会失效)。rel 值错误或缺失时,link 元素虽存在于 DOM 中,但不会发起任何网络请求,也不会应用样式。
- 不要依赖默认值:HTML 规范中没有默认
rel,不设就是无效 - 区分
<link rel="preload">:那是预加载提示,不等于实际应用样式 - IE8–IE11 也严格遵循此规则,不存在“兼容性宽松”情况
插入位置影响样式生效时机和 FOUC
把 link 插入 document.head 是唯一稳妥做法。插到 body 后或末尾,会导致部分浏览器延迟解析、渲染时闪出无样式内容(FOUC),尤其在 CSS 含关键布局规则时更明显。
- 即使页面已渲染完成,插入
head仍能立即触发样式计算与重绘 - 不要用
document.body.appendChild(link)替代——它不保证样式及时生效 - 若 head 尚未解析完毕(如脚本在
<head>内执行),document.head仍可用,无需等待 DOMContentLoaded
onload 和 onerror 是唯一可靠监听方式
浏览器不提供 link 加载的 Promise 接口,link.onload 和 link.onerror 是原生且跨浏览器支持的事件机制。仅靠 fetch() 预检无法替代它们,因为 fetch 不反映样式是否真正被浏览器解析并应用。
立即学习“前端免费学习笔记(深入)”;
-
onerror在跨域 CSS 加载失败时通常不触发(CORS 静默丢弃),仅控制台报错;此时需配合服务端代理或同源fetch(href, { method: 'HEAD' })预判 - 不要写
link.addEventListener('load', ...):IE 不支持,且onload属性更稳定 - 加载成功后,
link.sheet可访问 CSSStyleSheet 对象,但 IE9–IE11 需轮询sheet.cssRules判断就绪
重复插入同一 href 的 link 会浪费请求
浏览器不会自动去重,相同 href 的 link 多次插入,就会发起多次 HTTP 请求(即使缓存命中,仍走完整网络栈)。
- 插入前务必检查:
document.querySelector(`link[href="${href}"]`) - 注意路径字符串一致性:
/theme.css和theme.css被视为不同资源 - 若需切换主题,应先移除旧
link(oldLink.remove()),再插入新link,避免样式叠加冲突
最容易被忽略的是 rel 属性的强制性——它不像 type 那样可选,也不像 media 那样仅影响条件匹配。没设,就等于没写这行代码。


















