::part() 仅对组件显式暴露的部位生效,需内部元素带 part 属性、宿主声明 exportparts 映射,且 CSS 写在 light DOM 或父 shadow 中;大小写敏感,closed shadow root 下不可用,多层嵌套需逐层暴露。

::part() 本身不能“穿透” Shadow DOM,它只对组件作者**显式暴露的部位**生效——没加 part 属性、没在 exportparts 里声明,外部写再多 ::part(x) 都不会起作用。
为什么::part(header)写了却没效果?
最常见原因是目标元素根本没带 part="header" 属性。浏览器不会自动把任意子节点变成可样式化接口,必须由组件内部主动标记。
- 检查组件源码:找到你想定制的节点(比如
<h2></h2>),确认它是否写了part="header" - 大小写敏感:
part="Header"和::part(header)不匹配 - 若组件用的是 closed shadow root,
shadowRoot不可访问,::part()根本无法注册到该 shadow 上下文 - 外部 CSS 必须写在 light DOM 或父级 shadow 中;不能写在同一个 shadow tree 内部自用
exportparts 是什么?不加它::part()就无效?
是的。exportparts 是自定义元素上的一个 HTML 属性,用于**显式映射内部结构到外部可样式化名称**。没有它,即使内部节点有 part="x",外部也拿不到。
- 正确写法:
<my-card exportparts="title:card-title body:card-body"></my-card> - 对应 CSS 必须写成:
my-card::part(card-title) { color: blue; },不是::part(title) - 如果组件没定义
exportparts,哪怕内部写了<h3 part="title"></h3>,外部::part(title)仍无效 -
exportparts只在自定义元素(class extends HTMLElement)中生效,普通<div> 加了没用 <h3>微前端里<code>::part()为什么只改了宿主、改不了内部节点?因为
::part()的作用域止步于当前 shadow boundary。主应用写的my-app::part(title)只能匹配<my-app part="title"></my-app>这个 host 元素本身,不会深入它内部 attachShadow 后的子树。立即学习“前端免费学习笔记(深入)”;
- 子应用若自己创建了 open shadow root,它的内部节点要被定制,必须由子应用自己暴露
exportparts并在自己的 shadow style 中支持::part() - qiankun / MicroApp 开启
strictStyleIsolation: true后,子应用容器外层是 light DOM,但内部 shadow 仍是独立边界 - 想跨多层定制,得逐层暴露:主应用 → 子应用 host → 子应用 shadow 内部节点,每层都要有
part+exportparts - Safari 对
:host([disabled]) ::part(button)支持比:host(:hover) ::part(button)更稳,状态类建议优先用属性而非伪类
真正可控的样式穿透,从来不是靠“绕过隔离”,而是靠组件设计时就预留好出口——
part是标签,exportparts是说明书,::part()只是按说明书翻页的动作。漏掉任何一环,页面就只能显示默认样式。 - 子应用若自己创建了 open shadow root,它的内部节点要被定制,必须由子应用自己暴露


















