news 2026/6/15 18:35:57

【前端】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/15 16:00:38

Ubuntu启一个http server,通过terminal测试通不通

方法一&#xff1a;用python脚本cd ~/sourcemkdir -p code/pythoncd /code/pythontouch http_server.pysudo gedit http_server.py粘入如下代码&#xff1a;import socketdef start_server(host192.168.111.128, port12345):server_socket socket.socket(socket.AF_INET, sock…

作者头像 李华
网站建设 2026/6/15 14:17:58

《大模型入门:技术原理与实战应用》一书让你轻松入门AI大模型(附PDF)

随着大模型技术的不断完善和普及&#xff0c;我们将进入一个由数据驱动、智能辅助的全新工作模式和生活模式。个人和企业将能够利用大模型来降本增效&#xff0c;并创造全新的用户体验。 人工智能是人类探索未来的重要领域之一&#xff0c;以GPT为代表的大模型应用一经推出在短…

作者头像 李华
网站建设 2026/6/15 18:14:00

决策陷阱:混淆平均与边际,汤姆该新增捕鱼船吗?

决策陷阱&#xff1a;混淆平均与边际&#xff0c;汤姆该新增捕鱼船吗&#xff1f;汤姆是海边小镇的捕鱼能手&#xff0c;靠着几艘捕鱼船养活全家&#xff0c;日子过得还算安稳。最近一段时间&#xff0c;他看着自己的捕鱼生意蒸蒸日上&#xff0c;心里渐渐泛起了新的念头&#…

作者头像 李华
网站建设 2026/6/15 14:17:56

Nacos动态服务发现如何理解

现如今市面上注册中心的轮子很多&#xff0c;我实际使用过的就有三款&#xff1a;Eureka、Gsched、Nacos&#xff0c;由于当前参与 Nacos 集群的维护和开发工作&#xff0c;期间也参与了 Nacos 社区的一些开发和 Bug Fix 工作&#xff0c;过程中对 Nacos 原理有了一定的积累&am…

作者头像 李华
网站建设 2026/6/15 13:19:02

Java国际家政:多商户抢单+自营商城一体化

Java国际家政系统通过“多商户抢单自营商城”一体化模式&#xff0c;结合高并发微服务架构、智能化算法与全渠道融合技术&#xff0c;为家政服务行业构建了高效、透明、场景化的数字化生态&#xff0c;成为全球化家政服务市场的优选解决方案。 以下从技术架构、核心功能、服务创…

作者头像 李华
网站建设 2026/6/15 12:40:01

大模型智能体开发宝典:Agent框架与核心能力建设全解析,建议收藏!

本文系统介绍智能体(Agent)的框架与核心能力建设&#xff0c;从功能、核心能力和工程技术三个维度解析架构&#xff0c;详细阐述规划能力(思维链、思维树等)、工具使用(Function call和MCP协议)以及记忆系统(短期与长期记忆)。深入探讨Agent如何通过与环境交互完成任务&#xf…

作者头像 李华