如何设置已插入元素的后代样式(在 shadowroot 的样式表中)?

How to style descendants of element that was slotted (in the stylesheet of the shadowroot)?

这是我的尝试,但是 span 元素没有我希望的 deeppink 边框(我在 Google Chrome 83):

const d = document.querySelector('div')

const r = d.attachShadow({mode: 'open'})

r.innerHTML = `
  <style>
    /* This doesn't work as I was hoping: */
    ::slotted(p) span {
      border: 1px solid deeppink;
    }
    
    /* This doesn't work (and I wouldn't expect it to), but I tried it anyways: */
    ::slotted(span) {
      border: 1px solid deeppink;
    }
    
    /* This doesn't work either: */
    :host span {
      border: 1px solid deeppink;
    }
    
    /* This works, but not what I'm trying to do. */
    ::slotted(p) {
      background: #f9f9f9
    }
  </style>
  <slot></slot>
`
<div>
  <p><span>test</span></p>
  <p><span>test</span></p>
  <p><span>test</span></p>
  <p><span>test</span></p>
  <p><span>test</span></p>
</div>

我们如何设置分布式(分槽)子代的后代样式?

  • 槽内容仍然在lightDOM中,反映到一个
  • ::slotted(*) 只能使用 简单 选择器
  • 定位 lightDOM 皮肤

长答案见:

更新:示例 <div SLOT=Hello> 内容不是 IN shadowDOM

<my-element>
  <div slot=Hello>Hello reflected (slotted) lightDOM DIV</div>
</my-element>

<my-element>
  <div slot=NoSlot>Hello not slotted lightDOM DIV</div>
</my-element>

<script>
  customElements.define('my-element', class extends HTMLElement {
    constructor() {
      super()
        .attachShadow({mode: 'open'})
        .innerHTML=`<slot name=Hello><b>I am shadowDOM SLOT content</b></slot>`;
    }
    connectedCallback() {
      console.log(this.shadowRoot.querySelector('slot').innerHTML)
    }
  });
</script>