设置Shape Dom::Part元素的子元素样式元素、样式、Shape、Dom

2023-09-03 10:34:50 作者:仙女?

我有一个Web组件,它在阴影DOM中呈现以下内容:

<custom-banner>
  #shadow-root
    <div part="headertext">
      I am the header text!
    </div>
    ...
</custom-banner>

要设置headertext的样式,下面的css效果很好:

custom-banner::part(headertext) {
  border: 5px solid green;
}
Vue学习 动画与过度 在插入 更新移除DOM元素,合适的时候给元素添加样式类名

现在假设我有这样的东西:

<custom-banner>
  #shadow-root
    <div part="headertext">
      I am the header text!
      <span>I am the subheader text!</span>
    </div>
    ...
</custom-banner>

是否有方法以影子部件的子项为目标?也就是说,如下所示(似乎不起作用):

custom-banner::part(headertext) span {
  border: 5px solid red;
}

我意识到这类事情可能会削弱::part的整个目的,但可能不会?

明确地说,在本例中,副标题范围是而不是一个带槽的子项。它始终是组件的一部分,并且在影子DOM中。以上示例用于在浏览器中呈现组件。

谢谢!

推荐答案

唉,只能::part节点本身。

不是儿童,这将违背::part的目的 那么不妨允许所有shadowDOM样式从外部开始。(无法完成)

如果不想指定part="subheader", 您可以使用范围部分的css属性,请参阅--subheader: blue

好博客:

Why is my shadowDOM inheriting styles ::partsMonica Dinculescu(Google):https://meowni.ca/posts/part-theme-explainer/ 数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
<style>
  body {
    /* note how 'inheritable styles' do style shadowDOM */
    font: 28px Arial;
    color: green;
  }
  custom-banner::part(headertext) {
    /* style shadowDOM from global CSS */
    background: pink;
    --subheader: blue;
  }
</style>

<custom-banner></custom-banner>

<script>
  customElements.define("custom-banner", class extends HTMLElement {
    constructor() {
      super()
        .attachShadow({mode:"open"})
        .innerHTML = `<style> span {  color:var(--subheader)  } </style>` +
                     `<div part="headertext">I am the header text!` +
                        `<span>I am the subheader text!</span>` +
                     `</div>`;
    }
  });
</script>