外部CSS样式在Shadow DOM中失效不是bug,而是浏览器按规范强制隔离:外部规则根本不会进入shadowRoot的CSSOM,连匹配机会都没有;唯一合法跨边界方式是:host和::slotted(),其余穿透写法已被主流浏览器移除。

外部CSS样式在Shadow DOM中“无法穿透”不是bug,是浏览器按规范强制隔离的结果——那条规则压根没进shadowRoot的CSSOM,!important也无效。
为什么button { color: red }对Shadow内按钮完全没反应
浏览器解析HTML时,会把全局
-
button { color: red !important }写在里?Shadow内的 - 用
document.querySelector('button')能拿到元素,但getComputedStyle()显示color还是UA默认值(如蓝色) - 你以为是权重不够,其实是“通信链路不存在”——就像往另一个进程发消息却不走IPC
唯一合法的跨boundary方式只有:host和::slotted()
W3C只保留这两个伪类作为边界协议接口,其余所有“穿透”写法(/deep/、::ng-deep、>>)已在Chrome 120+和Firefox 115+中彻底移除。
-
:host只匹配宿主元素自身(比如<my-button></my-button>这个标签),不能写:host button去选内部子元素 -
::slotted(p)只作用于被<slot></slot>投影进来的light DOM节点,且仅支持可继承属性(color、font-family、line-height),禁止设margin、display、width - 别写
::slotted(*)——它不可靠,也违背slot的设计本意:内容布局责任应由使用者承担
正确注入样式必须走CSSOM路径,不能拼字符串
样式要参与重排重绘、支持动态更新,就必须进入shadowRoot的CSSOM。任何绕过CSSOM的写法(如shadowRoot.innerHTML = '<style>...</style>')都会让

