该代码是

<html>

<head>

</head>

<script src="https://cdnjs.cloudflare.com/ajax/libs/document-register-
element/1.7.2/document-register-element.js"></script>
<div id = "1">
<style>
div {
    height: 30px;
    width: 30px;
    background-color: brown;
}
</style>
 </div>

 <script>
  document.getElementById('1').attachShadow({mode: "open"})
</script>
<div id = "2"></div>
<div id = "3"></div>
</body>

</html>


并且jsfiddle链接是https://jsfiddle.net/o5r229hf/

我已将div id 1声明为阴影dom,但div id 2和3正在获得样式。我编写这些元素的顺序可能会有所不同吗?

最佳答案

您正在将<style>标记创建为<div id="1">的子代,而不是影子DOM的子代。因此<style>存在于您创建的阴影之外。

CSS必须存在于shadowRoot内部才能影响该shadowRoot中的元素。

shadowRoot外部的任何CSS都不应影响shadowRoot内部的元素。 One minor exception is when using slots.

如果您的代码仅限于上面显示的内容,则需要通过执行以下操作将CSS移到shadowRoot中:



var el = document.getElementById('1');

var s = el.attachShadow({mode: "open"});

while(el.firstElementChild) {
  s.append(el.firstElementChild);
}

div {
  background-color: #F00;
  outline: 1px solid black;
  height: 80px;
  width: 80px;
}

<div id = "1">
  <style>
  div {
    height: 30px;
    width: 30px;
    background-color: brown;
  }
  </style>
  <div>I1</div>
</div>
<div id="2">
  <div>I2</div>
</div>
<div id="3">
  <div>I3</div>
</div>





这是将<div id="1">的子代复制到您创建的shadowRoot中。

这会将<style>标记移入其中,使其仅影响该<div>,而不会影响其他标记。

如果您的代码不限于上面的代码,则只需将CSS创建为shadowRoot的子代即可。

更新:

即使您的代码不在影子DOM中,您也可能需要将CSS添加到容器的影子DOM中。 Here is how to handle that.

09-25 16:29