如何将 Shadow Dom 与 Javascript 和 CSS 模块一起使用

问题描述 投票:0回答:1

我正在尝试在我的 Javascript 模块中使用 Shadow DOM,并将 CSS 模块/工作表导入到 Javascript 模块中:-

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”的内容就停止出现。

如果我进一步尝试将StyleSheets采用到shadowRoot而不是文档中,那么styles.css中的CSS不会生效。

样式.css

host:: {
    background-color: yellow;
}
div {
    background-color: red;
}

我需要做什么才能在模块中使用 Shadow DOM 并与 CSS 模块中采用的样式配合使用?

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>
javascript css dom es6-modules shadow-dom
1个回答
0
投票
  • 一旦我将行添加到 .attachShadow(),DIV“This is Text”的内容就停止出现。

    因为你在 lightDOM 中设置了内容,当你 <slot> 时,它才会显示在

    shadowDOM
    中。

  • 如果我进一步尝试将StyleSheets采用到shadowRoot而不是文档中,那么styles.css中的CSS不会生效。

    语法是

    :host
    不是
    host::

请阅读:

这里是一个几乎拥有所有 ShadowDOM 好东西的游乐场。

JSFiddle:https://jsfiddle.net/WebComponents/bj4n1L0r/

<h1>shadowDOM, loathed but loaded</h1>
<script>
  function adoptSheet(atRoot, styles) {
    let sheet = new CSSStyleSheet();
    sheet.replaceSync(styles);
    atRoot.adoptedStyleSheets.push(sheet);
  }
  // Global CSS
  adoptSheet(document, "h1 { background: hotpink }" +
                       "div { background: pink }" +
                       "div::part(shadowH1) { background: lightgreen }");

  const myDiv = document.createElement("div");
  myDiv.setAttribute("border", "true");
  const shadowRoot = myDiv.attachShadow({ mode: "open" });
  adoptSheet(shadowRoot, ":host { background: red; padding: 5px }" +
                         ":host([border]) { border:2px dashed green }" +
                         "h1 { color: green }" +
                         "::slotted(h1) { color: blue }");

  myDiv.innerHTML =      "<h1                >I am in lightDOM</h1>";
  shadowRoot.innerHTML = "<h1 part='shadowH1'>I am in shadowDOM</h1>" +
                         "<slot>lightDOM will be slotted here</slot>";

  document.body.append(myDiv);
</script>

© www.soinside.com 2019 - 2024. All rights reserved.