如何访问元素内部两个阴影 dom

How to access elements inner two shadow dom

我正在使用以下网络组件树:

<x-typography>
  :shadow-root
    <x-select>
      :shadow-root
        <div class="select-container>
        </div>
    </x-select>
</x-typography>

我需要覆盖 select-container 上的 background-color。我无法访问 <x-select> 代码,只能访问 <x-typography>.

我知道如何 :host::slotted 工作,我试过:

:host(x-typography):host(x-select) .select-container
:host(x-typography):host(x-select) .select-container
:host(x-typography :host(x-select)) .select-container

但其中 none 有效。

您可以为此使用 ::part pseudo-element 和 exportparts 属性。它允许您为内部阴影 DOM 元素制作自定义样式。

您可以在影子树中的任何元素上指定一个“可设置样式”的部分:

<x-select>
  :shadow-root
    <header class="select-header"></header>
    <div class="select-container" part="container"></div>
</x-select>

然后您可以为该部分指定自定义样式,例如:

x-select::part(container){
  font-weight: bold;
}

它也适用于其他伪选择器,如 :hover:active...

x-select::part(container):hover {
  opacity: 0.8;
}

但它不适用于嵌套部分。所以,你不能像这样使用它:

x-select::part(container)::part(aside) {
}

为此,您需要通过 exportpart 属性导出零件。

<x-bar>
  :shadow-root
  <x-foo exportparts="some-box: foo-some-box"></x-foo>
</x-bar>

但是,如果您需要支持 IE11,那么它可能不是最佳选择。另一方面,所有现代浏览器都支持它:https://caniuse.com/#search=%3A%3Apart

因此,您的示例如下所示:

// x-select


render () {
  return (
    <Host>
      <div class="select-container" part="container"></div>
    </Host>
  )
}
// x-typography


render () {
  return (
    <Host>
      <x-select exportparts="container: container"></x-select>
    </Host>
  )
}
  
<!-- usage -->

<x-typography></x-typography>

<style>
  x-typography::part(container) {
    color: blue;
  }
</style>

在这里您可以找到 part 工作原理的精彩解释:https://github.com/fergald/docs/blob/master/explainers/css-shadow-parts-1.md