news 2026/6/10 22:15:56

【前端】JS动态加载样式方法总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【前端】JS动态加载样式方法总结

在JavaScript中动态加载样式有多种方法,以下是几种常用的方式:

1. 创建并插入<style>元素

内联样式文本

// 方法1:直接设置 innerHTMLfunctionaddStyle(cssText){conststyle=document.createElement('style');style.type='text/css';style.innerHTML=cssText;document.head.appendChild(style);returnstyle;}// 使用addStyle(`body { background-color: #f0f0f0; } .highlight { color: red; }`);// 方法2:使用 insertRule(更高效,支持批量操作)functionaddStyleWithRules(rules){conststyle=document.createElement('style');document.head.appendChild(style);constsheet=style.sheet;rules.forEach(rule=>{sheet.insertRule(rule,sheet.cssRules.length);});}// 使用addStyleWithRules(['body { background: #fff; }','.dynamic { font-size: 16px; }']);

2. 动态加载外部CSS文件

// 创建 link 元素加载外部CSSfunctionloadExternalCSS(url){returnnewPromise((resolve,reject)=>{constlink=document.createElement('link');link.rel='stylesheet';link.type='text/css';link.href=url;link.onload=()=>resolve(link);link.onerror=()=>reject(newError(`Failed to load CSS:${url}`));document.head.appendChild(link);});}// 使用loadExternalCSS('styles.css').then(()=>console.log('CSS加载成功')).catch(err=>console.error('CSS加载失败:',err));// 或者使用 async/awaitasyncfunctionloadStyles(){try{awaitloadExternalCSS('theme.css');awaitloadExternalCSS('components.css');console.log('所有样式加载完成');}catch(error){console.error('加载样式失败:',error);}}

3. 动态修改现有样式

// 获取或创建样式表functiongetStyleSheet(){// 尝试获取现有的动态样式表letstyle=document.getElementById('dynamic-styles');if(!style){style=document.createElement('style');style.id='dynamic-styles';document.head.appendChild(style);}returnstyle.sheet||style.styleSheet;}// 添加/更新样式规则functionupdateCSSRule(selector,styles){constsheet=getStyleSheet();constcssText=Object.entries(styles).map(([prop,value])=>`${prop}:${value}`).join('; ');construle=`${selector}{${cssText}}`;// 删除已存在的相同选择器规则for(leti=0;i<sheet.cssRules.length;i++){if(sheet.cssRules[i].selectorText===selector){sheet.deleteRule(i);break;}}// 添加新规则sheet.insertRule(rule,sheet.cssRules.length);}

4. 使用document.adoptedStyleSheets(现代浏览器)

// 创建可复用的样式表functioncreateAdoptedStyleSheet(cssText){constsheet=newCSSStyleSheet();sheet.replaceSync(cssText);returnsheet;}// 将样式表应用到文档或Shadow DOMfunctionapplyStyleSheet(sheet){// 应用到整个文档document.adoptedStyleSheets=[...document.adoptedStyleSheets,sheet];// 或者应用到Shadow DOM// shadowRoot.adoptedStyleSheets = [sheet];}// 使用示例constmyStyles=createAdoptedStyleSheet(`:root { --primary-color: #3498db; } .custom-element { color: var(--primary-color); }`);applyStyleSheet(myStyles);

5. 完整示例:带缓存和事件处理的CSS加载器

classCSSLoader{constructor(){this.loaded=newSet();this.pending=newMap();}// 加载CSS(支持缓存和去重)load(url,options={}){const{id=url,cache=true,force=false}=options;// 如果已经加载且不强制重新加载if(this.loaded.has(id)&&!force&&cache){returnPromise.resolve();}// 如果正在加载中if(this.pending.has(id)){returnthis.pending.get(id);}constpromise=newPromise((resolve,reject)=>{constlink=document.createElement('link');link.rel='stylesheet';link.type='text/css';link.href=url;if(id!==url)link.id=id;link.onload=()=>{this.loaded.add(id);this.pending.delete(id);resolve(link);};link.onerror=(error)=>{this.pending.delete(id);reject(error);};document.head.appendChild(link);});this.pending.set(id,promise);returnpromise;}// 加载多个CSS文件loadAll(urls,options={}){returnPromise.all(urls.map(url=>this.load(url,options)));}// 检查是否已加载isLoaded(id){returnthis.loaded.has(id);}// 移除已加载的CSSremove(id){constelement=document.getElementById(id);if(element){element.parentNode.removeChild(element);this.loaded.delete(id);}}}// 使用示例constcssLoader=newCSSLoader();// 加载单个CSScssLoader.load('https://cdn.example.com/style.css',{id:'theme'}).then(()=>console.log('主题样式已加载'));// 加载多个CSScssLoader.loadAll(['components.css','layout.css','typography.css']).then(()=>console.log('所有基础样式已加载'));

6. 性能优化建议

// 1. 使用 requestIdleCallback 或 setTimeout 延迟加载非关键CSSfunctionloadNonCriticalCSS(){if('requestIdleCallback'inwindow){requestIdleCallback(()=>{loadExternalCSS('non-critical.css');});}else{setTimeout(()=>{loadExternalCSS('non-critical.css');},3000);}}// 2. 预加载CSSfunctionpreloadCSS(url){constlink=document.createElement('link');link.rel='preload';link.as='style';link.href=url;link.onload=()=>{link.rel='stylesheet';};document.head.appendChild(link);}// 3. 媒体查询动态加载functionloadCSSByMedia(query,url){constlink=document.createElement('link');link.rel='stylesheet';link.media=query;link.href=url;document.head.appendChild(link);// 当媒体查询匹配时立即应用link.onload=()=>{link.media='all';};}

注意事项

  1. 样式优先级:动态加载的样式遵循CSS层叠规则
  2. 性能影响:避免频繁修改样式,使用CSS类切换
  3. 浏览器兼容性
    • insertRuledeleteRule在IE中使用addRuleremoveRule
    • adoptedStyleSheets需要Chrome 73+ / Firefox 101+
  4. 内容安全策略(CSP):确保动态样式符合CSP规则

选择哪种方法取决于具体需求:

  • 少量样式:使用<style>元素
  • 外部样式文件:使用<link>元素
  • 现代Web Components:使用adoptedStyleSheets
  • 需要复杂管理:使用CSSLoader类
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 12:31:04

【Python教程13】-数据库支持

13、Python 教程 - 数据库支持 本章讨论 Python 数据库 API&#xff08;一种连接到 SQL 数据库的标准化方式&#xff09;&#xff0c;并演示如何使用这个 API 来执行一些基本的 SQL。最后&#xff0c;本章将讨论其他一些数据库技术。关 Python 支持的数据库清单 Python 数据库…

作者头像 李华
网站建设 2026/6/9 21:03:16

关注英国首相访华-英国广播公司(BBC)| 国研政情·中国国政研究

关注英国首相访华-英国广播公司(BBC)| 国研政情中国国政研究2026年1月28日&#xff0c;英国首相凯尔斯塔默抵达北京&#xff0c;开启为期三天的正式访华行程。这是英国工党政府上台后首次对中国进行最高级别访问&#xff0c;也是继2018年特雷莎梅访华后&#xff0c;英国领导人时…

作者头像 李华
网站建设 2026/6/10 14:33:09

媒体关注英国首相斯塔默访华-路透社报道| 国研政情·中国国政研究

媒体关注英国首相斯塔默访华-路透社报道| 国研政情中国国政研究2026年初春&#xff0c;英国首相斯塔默对中国展开的正式访问成为国际舆论关注的焦点。路透社报道指出&#xff0c;双方围绕经贸合作、人员往来以及全球性议题进行了交流&#xff0c;释放出稳定双边关系的积极信号。…

作者头像 李华
网站建设 2026/6/10 12:32:20

阅读Java开源项目源码的18条个人总结心法奉上!

这篇文章我准备来聊一聊如何去阅读开源项目的源码。 在聊如何去阅读源码之前&#xff0c;先来简单说一下为什么要去阅读源码&#xff0c;大致可分为以下几点原因&#xff1a; 最直接的原因&#xff0c;就是面试需要&#xff0c;面试喜欢问源码&#xff0c;读完源码才可以跟面试…

作者头像 李华
网站建设 2026/6/10 12:34:34

创客匠人的IP进化论:AI智能体如何重塑创始人价值坐标系

北京798艺术区的工作室里&#xff0c;42岁的陶艺家苏青正在调试她的“泥土日记”AI智能体。屏幕上跳动着数据&#xff1a;今日与用户生成137段关于“器物与生活哲学”的对话&#xff0c;其中28人预约了线下体验课。这位曾坚持“作品说话”的传统匠人&#xff0c;如今将每日1小时…

作者头像 李华
网站建设 2026/6/10 12:58:02

爱舒适,用方盾:守护雕刻师的每一次呼吸

细密的尘埃&#xff0c;自顽石上剥落&#xff0c;从朽木间升腾而起&#xff0c;于光线下交织成一张朦胧的网。每一件惊世之作问世之际&#xff0c;如影随形的&#xff0c;往往是这无声无息、弥漫不止的碎屑与微尘。 对雕刻师来说&#xff0c;这不仅是创作留下的痕迹&#xff0c…

作者头像 李华