webcomponent 样式隔离问题

使用 webcomponent 进行样式隔离需要注意继承影响样式

使用 webcomponent 的 shadowdom 可以很好的实现样式隔离,例如:

<style>
  p {
    color: red;
  }
</style>

<test-item></test-item>

<template id="itemTemplate">
  <p class="test-color">TEST CSS</p>
</template>
<script>
  class Item extends HTMLElement {
    connectedCallback() {
      const content = document
        .getElementById("itemTemplate")
        .content.cloneNode(true);
      this.attachShadow({ mode: "open" }).appendChild(content);
    }
  }
  window.customElements.define("test-item", Item);
</script>

执行代码可以看到页面中的 p 标签并没有变成红色,说明外部的选择器是无法选择到 shadowdom 内部的节点的,很好的实现了我们想要的样式隔离。

但是如果此时给任一父组件加上可继承的样式,例如给 body 加上 color

body {
  color: red;
}

重新执行就会发现 p 标签就变成红色,查看控制台会发现是从 body 继承了 color。有点隔离失效的意思。

所以父组件修改样式是可被继承的样式时,如果不想子组件被影响,最好在子组件或子组件最近一层父组件中设置具体的颜色,避免给父组件影响。