您可以为此使用::part
伪元素和exportparts
属性。它允许您为内部 Shadow 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