rel="stylesheet"是硬性门槛,漏写或错写将导致css完全不加载;必须插入document.head、防重复插入、绑定onload/onerror回调,并注意加载完成不等于样式已应用。

rel="stylesheet" 是硬性门槛,漏掉或写错就完全不加载
浏览器只认 rel="stylesheet" 这个值,写成 rel="style"、rel="css" 或直接不设,link 元素会被忽略,控制台静默无提示,CSS 一丁点都不会下载。这是最常踩的坑,尤其从复制粘贴模板时容易手误。
实操建议:
-
link.rel必须显式赋值为"stylesheet",不能靠默认值 - 不要用
setAttribute('rel', 'stylesheet')—— 虽然可行,但不如直接赋值可靠(部分老环境有兼容差异) - 若需兼容 IE8 及更早版本,建议同时设
link.type = "text/css";现代浏览器可省略
插入位置必须是 document.head,插到 body 后可能 FOUC
把 link 插入 document.body 末尾,某些浏览器(如 Safari 旧版、部分 Android WebView)会延迟应用样式,导致页面先闪一下无样式的原始状态(FOUC)。这不是 bug,而是规范允许的行为:样式表应尽早参与渲染流程。
实操建议:
- 一律用
document.head.appendChild(link) - 避免用
document.body.insertBefore(link, document.body.firstChild)等绕路写法 - 如果 head 尚未解析完成(极少见),可监听
DOMContentLoaded后再执行,但通常不需要
必须手动防重复,否则同一 CSS 可能被加载多次
动态插入本身不带去重逻辑。比如在路由切换或主题切换中反复调用 loadCSS('/css/dark.css'),每次都会新建 link 并发起请求,造成冗余网络开销,还可能因加载顺序混乱引发样式覆盖问题。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
实操建议:
- 插入前查是否存在:
document.querySelector(<code>`link[href="${url}"]`) - 注意 URL 字符串需严格匹配,含查询参数(如
?v=1.2)也要一致 - 若需支持“替换”逻辑(如卸载旧主题、加载新主题),应先
remove()对应的link,再插入新的
onload 和 onerror 是唯一可靠回调机制
动态 link 没有 Promise 接口,link.onload 不代表样式已渲染生效,只表示资源下载并解析完成;link.onerror 也不会捕获所有错误——跨域 CSS 加载失败时,它常被静默丢弃,仅控制台报 CORS 错误。
实操建议:
- 必须显式绑定两个事件:
link.onload = () => { /* 样式已就绪 */ }、link.onerror = () => { /* 请求失败 */ } - 不要依赖
link.sheet立即可用,IE 和部分移动端浏览器下它可能为null,需加短延时或轮询 - 若需确保样式已参与重排,可在
onload里触发一次强制读取:getComputedStyle(document.body).marginTop
实际使用中最容易被忽略的是:加载完成 ≠ 样式已应用。哪怕 onload 触发了,DOM 重绘可能还没发生,后续 JS 若立即操作依赖该样式的元素(比如计算高度、判断 visibility),结果可能不准。这种时序差在低性能设备或复杂布局下尤为明显。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










