如何在JavaScript模块中结合CSS模块使用Shadow DOM?
问题:Shadow DOM与CSS模块结合的样式作用域问题
编辑内容
非常感谢@Danny的解答。我的核心问题是CSS作用域与封装:在JS模块中导入CSS样式表后,不希望样式渗透到父级和Light DOM里,想实现类似自定义元素中把STYLE元素附加到HTMLElement扩展类的效果。
试过给myDiv设置part='shadowTree',但感觉违背Shadow DOM的初衷。也打算重新研究SLOT,但只想暴露模块调用里的特定元素,原以为#returnedDiv::part(styleableRuleException)能实现这个,剩下的CSS应该被限定在JS模块作用域内?
查过相关文档,怀疑问题在于导入的样式表不是“构造样式表”(比如let sheet = new CSSStyleSheet();这种),但有文档说CSS模块是可行的?
补充代码示例
我正尝试在JS模块里用Shadow DOM,同时导入CSS模块:
module.js
import sheet from '/styles.css' assert {type: 'css'}; export function message() { const myDiv = document.createElement("div"); const shadowRoot = myDiv.attachShadow({mode:"open"}); document.adoptedStyleSheets = [sheet]; myDiv.textContent = "This is Text"; return myDiv; }
添加attachShadow()后,DIV的内容“This is Text”就不显示了。如果把样式表附加到shadowRoot而非document,styles.css里的样式完全不生效。
styles.css
host:: { background-color: yellow; } div { background-color: red; }
test_mod.html
<!DOCTYPE html> <html> <style type="text/css"> div div { height: 100px; width: 100px; text-align: center; background-color: lightblue; } </style> <script type="module"> import {message} from "http://localhost/message.js"; document.getElementById("demo").appendChild(message()); </script> <body> <h1>JavaScript Modules</h1> <div id="demo"></div> </body> </html>
请问该如何在模块中结合使用Shadow DOM与来自CSS模块的已采用样式?
内容的提问来源于stack exchange,提问作者McMurphy
相关产品推荐
相关产品推荐

