Shadow DOM中能否使用CSS :root{}声明变量?
Shadow DOM中使用
:root声明CSS变量的问题解答 可以在Shadow DOM中使用:root声明CSS变量,但你的代码写法错误导致变量未生效。
问题原因
你在Shadow DOM中插入了完整的<html>、<head>、<body>结构,但:root在Shadow DOM环境中指向的是shadow root(阴影根节点),而非你插入的<html>元素。你写在内部<html>里的:root样式无法作用到真正的shadow root上,因此.square无法读取到--bg-color变量。
修正方案
方案1:移除冗余的html/body结构(推荐)
Shadow DOM不需要独立的html文档结构,直接在shadow root下写样式和内容即可,此时:root会正确指向shadow root:
const htmlCode = ` <style> * { box-sizing: border-box; margin: 0; padding: 24px; } :root { --bg-color: cornflowerblue; } .square { width: 500px; height: 500px; border: 5px solid #000; background-color: var(--bg-color); } </style> <div class="square"></div> `; customElements.define( "square-element", class extends HTMLElement { connectedCallback() { const shadow = this.attachShadow({ mode: "open" }); shadow.innerHTML = htmlCode; } } );
方案2:针对内部html结构调整变量声明(不推荐)
如果非要保留内部的html结构,可将变量声明在内部的<html>或<body>上,让.square能读取到:
/* 替换原样式中的:root选择器 */ html { --bg-color: cornflowerblue; }
这种写法冗余,因为Shadow DOM中的<html>只是普通DOM节点,并非文档根节点,不建议这么做。
关键说明
Shadow DOM拥有独立的样式作用域,:root在该作用域内等价于shadowRoot对象(即attachShadow返回的根节点),直接在此处声明的CSS变量可被Shadow DOM内所有元素访问。
内容的提问来源于stack exchange,提问作者tcvd
相关产品推荐
相关产品推荐

