如何定位 #shadow 根内的元素?

How to target element inside #shadow-root?

提问人:Ripley E 提问时间:10/25/2023 最后编辑:Mister JojoRipley E 更新时间:10/26/2023 访问量:65

问:

我想更改 #shadow 根内部的显示样式,但在定位它时遇到了一些问题。第一个问题,是否可以通过CSS定位它?还是通过JS来做更好?

#retirement-services-modal #rs-two-col::shadow(.wrapper) {
  display: flex;
  align-items: center;
}
<div id="retirement-services-modal">
  <sdf-layout-two-col id="rs-two-col">
    #shadow-root
    <div class="wrapper">
      <div class="col-1">content goes here</div>
      <div class="col-2">content goes here</div>
    </div>
  </sdf-layout-two-col>
</div>

我正在尝试以内部为目标添加一个和..wrapper#shadow-rootdisplay: flex;align-items: center;

我试图用它来定位它,但这似乎不起作用。我也试过,但似乎也没有用。有没有其他方法可以通过CSS定位它?::shadow::part

HTML CSS 用户体验 影子根

评论

0赞 Danny '365CSI' Engelman 10/25/2023
而不是复制/粘贴 HTML 结果;请将您的代码重写为一个工作片段,使用 shadowDOM 定义您/一个 Web 组件。然后我们可以一键回复它。 不起作用,添加您尝试过的代码。::shadow:part()
0赞 Mister Jojo 10/25/2023
基本上是 HTML、XML、...SGML 都有这 2 个字母 M 和 L 表示它们是 Markup L 语言。CSS 是 HTML Markup 标签属性属性的“发源”,它只能寻址属于 HTML 标签的元素。style
0赞 Ripley E 10/25/2023
@Danny'365CSI'Engelman,不幸的是没有用。我正在尝试将代码重写为工作片段,但似乎没有看到该选项(我是 Stack Overflow 的新手!让我再看一眼。

答:

0赞 Afzal K. 10/25/2023 #1

使用 JS 来定位和操作内容可能更有效、更容易。

const el = document.querySelector('#rs-two-col'); // access the outer element
const sh = el.shadowRoot; // access the shadow DOM of the element
sh.querySelector('.wrapper').style.cssText = 'display: flex; align-items: center;'; // access the nested element within the shadow DOM and change the CSS property of the element

评论

0赞 Danny '365CSI' Engelman 10/25/2023
适用于现有的 DOM 节点。但是,如果一个带有 a 的新节点进入 DOM 怎么办?那你打算如何改变呢?如果 Web 组件创建者给了你一个钩子(双关语),你就有了用 CSS 完成这一切的技术。.wrapperpart
0赞 Danny '365CSI' Engelman 10/26/2023 #2

下面是一个使用part

<style>
  host-element::part(foo){
    border:10px dashed green;
  }
  div {
    border:20px solid red; /* not applied to shadowDOM */
  }
</style>

<host-element>
  <template shadowrootmode="open">
    <style>
      :host {
        display: inline-block;
        width: 100vw;
        background:hotpink;
      }
      .wrapper {
        text-align:center
      }
    </style>
    <div part="foo" class="wrapper">
      <slot></slot>
    </div>
  </template>
  <h2>LightDOM content slotted in shadowDOM</h2>
</host-element>

注意:上面的声明式 shadowDOM 表示法在 FireFox 中尚不可用:
https://caniuse.com/declarative-shadow-dom
shadowrootmode