必须设 rel="stylesheet" 和有效 href 才会触发加载,仅创建 link 元素不发起请求;rel 大小写敏感,href 需非空且可解析;插入 document.head 后按 dom 顺序决定层叠优先级。

必须设 rel="stylesheet" 和有效 href 才会触发加载
只调用 document.createElement('link') 不会发起任何请求,浏览器完全无视。真正起作用的是插入 DOM 后对 rel 和 href 的校验:
-
rel必须是字符串"stylesheet"(大小写敏感),设成"style"、"css"或漏掉,请求根本不会发出 -
href必须为非空字符串,且路径可解析:相对路径以当前 HTML URL 为基准,推荐用根相对路径(如/css/theme.css)或绝对 URL(含协议,如https://cdn.example.com/style.css) - 不要用
//example.com/style.css—— 某些环境(如本地 file:// 协议)会降级为file://导致 404 - 创建后必须调用
document.head.appendChild(link),插到body或其他位置可能延迟应用甚至失效
onload 事件不可靠,别把它当“样式已生效”的信号
link.onload 在旧版 Safari、部分 Android WebView 中经常不触发,即使 CSS 已成功下载并解析;而 getComputedStyle() 返回的值在 onload 触发后仍可能是旧值——CSS 解析、规则注入、渲染树更新是异步且分阶段的。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 不要写
link.onload = () => doSomethingWithComputedStyle(),大概率出错 - 更稳妥的做法是轮询检查:比如
getComputedStyle(document.body).backgroundColor是否变为预期值,或查document.styleSheets中是否存在匹配href的 sheet 且sheet.cssRules.length > 0 - 加超时保护,避免无限循环(例如 5 秒后 reject)
- 跨域 CSS 加载失败时,
onerror常被静默丢弃(CORS 限制),仅控制台报错,无法捕获
并发插入多个 link 时,层叠顺序由插入 DOM 的顺序决定
浏览器按 link 元素在 head 中的**位置顺序**解析和应用样式,而不是按网络响应快慢。如果你先插入 theme-dark.css,再插入 reset.css,哪怕后者后加载完,也会覆盖前者——因为 reset 在 DOM 中排后面。
- 严格按层叠优先级顺序插入:重置类(reset)→ 基础组件 → 主题 → 覆盖规则
- 插入前查重:
document.querySelector('link[href="/css/theme-dark.css"]'),避免重复插入导致 FOUC 或样式抖动 - 不要用
async/await fetch()控制加载顺序——那只能控制资源获取时机,不能改变样式层叠逻辑 - 大量动态样式建议用
document.adoptedStyleSheets(Chrome 89+、Firefox 94+),但兼容性有限,不能替代 link 标签通用场景
动态插入 style 标签时,必须用 textContent
用 innerHTML 写 CSS 规则会导致大括号 {}、引号等被 HTML 解析器转义或截断,整段样式可能被浏览器忽略。
- 正确写法:
style.textContent = 'body { margin: 0; }' - 若 CSS 字符串来自用户输入或模板,需手动转义
'、"、\,否则 JS 字符串解析直接报错 - 大量规则建议拆成多个
style标签,方便后续通过remove()精确管理,而不是拼长字符串 -
type="text/css"在现代浏览器中非必需,但若需兼容 IE8,建议保留
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










