CSS shadow dom : 是否有 /deep 选择器的替代品?

CSS shadow dom : is there alternative to /deep selector?

据我所知,/deep selector 已弃用 select shadow dom children。所以我正在寻找另一种解决方案。

CSS scoping 看起来为升序 selector 提供解决方案,但不为降序提供解决方案。

鉴于此 dom :

<script>
    $('.child').addClass('reached');
</script>
<div id="parent">
    #shadow-root
        <div class="child"></div>
    /shadow-root
</div>

如何在脚本中编写 selector 以到达 .child 元素?

感谢您的帮助

How can I write the selector in the script to reach the .child element?

要到达阴影 DOM 中的元素,您应该在元素上使用 shadowRoot 属性。

var parent = document.querySelector( '#parent' )
var child = parent.shadowRoot.querySelector( '#child' )
child.classList.add( 'reached' )

注意:阴影 DOM 必须是在打开模式下创建的。

var sh = parent.attachShadow( { mode: 'open' } )

var parent = document.querySelector( '#parent' )
var sh = parent.attachShadow( { mode: 'open' } )
sh.innerHTML = `<style>
                    div.reached { color: green }
                </style>
                <div id="child">Child</div>
                `
var child = parent.shadowRoot.querySelector( '#child' )
child.classList.add( 'reached' )
<div id="parent">
</div>

注意:仅当 DOM 中的元素用 <slot> 显示时才需要 ::slotted


Is there alternative to /deep selector?

简短的回答是否定的。由于 Shadow DOM 旨在将 Shadom DOM 与主页隔离开来,因此 /deep 有点异端。

A very new proposal,带有 ::part::theme 伪元素可以恢复一些控制,但不会很快实现。

在那之前,主要的解决方法是使用 CSS custom properties.

然而,这 2 个解决方案必须由 Web 组件设计人员实施,否则不能被覆盖。