在“相同类型”的Web组件之间共享样式

问题描述 投票:4回答:1

如果我理解正确的话,创建Web组件的实例可以概括为创建阴影根并复制标记,例如,从模板到它:

var Template = document.querySelector('#myTemplate');
var TemplateClone = document.importNode(Template.content,true);
TargetElement.appendChild(TemplateClone);

当然,如果模板在样式标记中包含css规则,那么它们也将被复制。因此,我们可以使用属于Web组件的内部标记的范围样式。

问题:

  1. 当我创建大量同一个Web组件的实例时,它是否有任何性能影响,因为样式只是复制而不是重用?
  2. 有没有办法在同一Web组件的多个实例之间共享样式节点?
html5 web-component shadow-dom html-imports html5-template
1个回答
4
投票

它有任何性能影响......?

是的,这取决于有多少实例,以及浏览器中实现的CSS引擎。您必须测试每个用例并考虑速度与内存消耗。

有没有办法在同一Web组件的多个实例之间共享样式节点?

是的,你可以使用@import url like in this SO question。或者您可以选择不使用Shadow DOM并仅使用全局CSS样式。

2019年更新

正如Harshal Patil建议的那样,自Chrome 73和Opera 60以来,多个Shadow DOM可能采用相同的样式表。这样,样式表中的更新将应用于所有Web组件。

let css = new CSSStyleSheet
css.replaceSync( `div { color: red }` )

customElements.define( 'web-comp', class extends HTMLElement {
    constructor() {
        super()
        let shadow = this.attachShadow( { mode: 'open' } )
        shadow.innerHTML = `<div><slot></slot></div>`
        shadow.adoptedStyleSheets = [ css ]
    }
} )
color.oninput = () => css.replaceSync( `div { color: ${color.value} }` )
<web-comp>Hello</web-comp>
<web-comp>World</web-comp>
<input value=red id=color>
© www.soinside.com 2019 - 2024. All rights reserved.