JavaScript 可动态检测运行时条件(如屏幕宽度、暗色模式等)并插入 link 标签按需加载 CSS;需去重、监听 load 事件、支持 preload 优化,且注意异步延迟与 SSR 兼容性。
可以通过 JavaScript 检测运行时条件(比如设备类型、屏幕宽度、用户偏好、URL 参数等),然后动态创建 标签插入到 中,实现按需加载 CSS 文件。
核心思路是:用 JS 获取条件 → 构造 link 元素 → 设置 href 和属性 → 插入 head。
if (window.innerWidth < 768) {
loadCSS('mobile.css');
} else {
loadCSS('desktop.css');
}
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
loadCSS('dark-theme.css');
} else {
loadCSS('light-theme.css');
}
function loadCSS(href) {
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = href;
document.head.appendChild(link);
}
多次调用可能重复插入相同样式表,建议加去重逻辑;如需依赖样式就绪后再执行后续操作,可监听 load 事件。
function loadCSS(href) {
if (document.querySelector(`link[href="${href}"]`)) return;
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = href;
document.head.appendChild(link);
}
link.onload = () => console.log('CSS loaded');
link.onerror = () => console.error('CSS load failed');
现代浏览器支持 rel="preload" 提前获取资源,再切换为 stylesheet,提升性能。
const link = document.createElement('link');
link.rel = 'preload';
link.as = 'style';
link.href = 'theme.css';
link.onload = () => {
link.rel = 'stylesheet';
};
document.head.appendChild(link);
media 属性做条件加载(无需 JS):注意: 这种方式由浏览器原生处理,不触发 JS,但条件有限(仅支持媒体查询)。
动态加载 CSS 在所有现代浏览器中均支持,IE9+ 也可用。需注意以下几点:
的位置documen
t.querySelector('link[title="theme"]').remove()