当前位置: 首页 > Web前端 > JavaScript

[Webcomponents]WebComponents中引入外部CSS的8种方式

时间:2023-03-27 11:40:16 JavaScript

在开发过程中,还是会出现需要在ShadowDOM中引入外部CSS的情况,那么如何处理呢?针对最近遇到的情况,笔者给出如下解决方案。1.@import示例代码consttemplate=document.createElement('template');classWhatsUpextendsHTMLElement{connectedCallback(){constshadowRoot=this.attachShadow({mode:'open'});shadowRoot.innderHTML=`

Sup
`}}window.customElements.define('whats-up',WhatsUp);优点:此方法兼容性很好,点击查看caniuse。缺点:性能2.::part::partCSS伪元素表示影子树中与part属性相匹配的任何元素。示例代码HTMLSup
Sup
CSSwhats-up::part(sup){/*样式适用于`sup`部分*/}whats-up::part(foo){/*样式适用于`foo`部分*/}简洁明了缺点:兼容性不是很好,点击查看caniuse。3.varCSS自定义属性可以渗透到ShadowDOM中!示例代码JSconsttemplate=document.createElement('template');template.innerHTML=`
Sup
`;CSSwhats-up{--background:#1E88E5;-白颜色;--填充:2rem4rem;--font-size:1.5rem;}优点:兼容性好缺点:比较受限,只能对外设置少数,样式不能“自由飞翔”4.通过属性传递示例代码JSclassWhatsupextendsHTMLElement{staticgetobservedAttributes(){return['css']}constructor(){super();}getcss(){returnthis.getAttribute('css');}setcss(value){if(value===null||value===false){this.removeAttribute('css');}else{this.setAttribute('css',value);}}connectedCallback(){constshadowRoot=this.attachShadow({mode:'open'});阴影根。innerHTML=`Sup
`;}}HTML优点:样式可以随意修改缺点:代码不够优雅5.自定义组件内部定义修改样式函数示例代码JSclassWhatsupextendsHTMLElement{//...//核心代码reStyle(els,styles){constelements=Array.isArray(els)?埃尔斯:[埃尔斯];elements.forEach((element)=>Object.assign(element.style,styles));}}HTML6.通过slot外部设置样式示例代码JSclassWhatsUpextendsHTMLElement{constructor(){super();constshadowRoot=this.attachShadow({mode:'open'});shadowRoot.innerHTML=`
`;}}customElements.define('怎么了',WhatsUp);HTMLwhat'sup
七、fetch获取示例代码classWhatsUpextendsHTMLElement{constructor(){极好的();constshadowRoot=this.attachShadow({mode:'open'});//获取样式fetch('./index.css').then(res=>res.text()).then(data=>{letnode=document.createElement('style');node.innerHTML=data;this.shadowRoot.appendChild(node);});//。..}}customElements.define('whats-up',WhatsUp);优点:优点是兼容性好,所有支持ShadowDOM的元素都支持这种语法;并且性能还可以缺点:不够优雅八、CSS模块导入该方法使用浏览器自带的导入语法,但是导入的是CSS文件而不是JS文件,即直接将CSS文件作为模块导入。示例代码从“index.css”导入样式;classWhatsUpextendsHTMLElement{constructor(){//...//核心代码shadow.adoptedStyleSheets=[styles];}}优点:优点是使用起来方便快捷,官方推荐的方法,或者importCSS模块只支持这种场景;而且性能还可以,导入本身就是一个异步过程。缺点:兼容性差,caniusecaniuse这里。综上所述,各种方法的适用场景不同,慎食。