CSS变量在Shadow DOM中不自动继承,必须通过:host显式声明(如:host { --my-var: var(--my-var, #007bff); })才能被内部元素读取;否则var(--my-var)将回退到默认值或undefined。
Web Components 的 Shadow DOM 默认不继承外部 CSS 变量,--my-var 在 :host 或子元素里直接 var(--my-var) 会 fallback 到默认值或 undefined——这不是 bug,是规范行为。必须显式承接或透传。
:host 元素本身不继承父级样式,包括 CSS 变量;Shadow DOM 是样式隔离边界,变量不会自动穿透。即使你在 <body> 或 :root 定义了 --theme-color,组件内部的 .button { background: var(--theme-color) } 仍可能失效。
getComputedStyle(host).getPropertyValue('--theme-color') 返回空字符串adoptedStyleSheets 注入后未重置作用域时最轻量、兼容性最好的做法:让 :host 主动“接住”变量,再由其子元素自然继承。
:host { --theme-color: var(--theme-color, #007bff); }
var(--theme-color) 读取,无需重复定义:host 上声明,不能只写在 :host-context(...) 或子选择器里v-bind:style,需确保绑定到 host 元素上,例如:<my-button style="--theme-color: red">
投射进 <slot> 的 light DOM 节点默认不继承 shadow 内变量,但可以继承 host 上设置的变量——前提是外层容器开启继承链。
:host 上加 all: inherit 不推荐(会覆盖所有属性),改用 color: inherit; background: inherit 等按需继承style="--theme-color: blue",并在 :host 中承接用 JS 动态修改主题(如换肤)时,仅改 document.documentElement.style 不足以触发 shadow 内响应——因为变量没被重新计算。
:host 样式,或触发一次 shadowRoot.adoptedStyleSheets 重载getComputedStyle(document.documentElement),应集中读取后批量注入adoptedStyleSheets 动态更新变量,需降级用 innerHTML 替换 <style> 标签slotchange 事件来重设变量——它不感知外部 CSS 变量变更真正关键的不是“怎么传”,而是“在哪接”:所有穿透都始于 :host 是否主动声明并承接变量。漏掉这一行,后面所有 var() 都是空转。