【问题标题】:protecting a ShadowRoot element保护 ShadowRoot 元素
【发布时间】:2022-02-11 18:30:06
【问题描述】:

我正在开发一个可以向任何网站添加自定义叠加元素的网络扩展。当然,我不希望网站 CSS 和 JavaScript 干扰我的自定义元素,也不想以任何方式影响任何网站的外观,除了我的叠加层。

所以我很自然地转向Shadow DOM。我很快就知道我不能简单地将影子 DOM 附加到 document.body,因为这会取代整个页面。

事实证明,我需要在正文中使用一个常规元素来充当影子根:

    const shadowHost = document.createElement('div');
    document.body.appendChild(shadowHost);
    const shadow = shadowHost.attachShadow({mode: 'closed'});

但是如何保护这个shadow root不受网站css或js的影响呢?

【问题讨论】:

  • 为什么不直接使用 Web 组件?

标签: javascript css shadow-dom


【解决方案1】:

你试过什么?

shadowRoots 不被全局 CSS 设置样式,除非它们是可继承的样式

mode:"closed" 与 CSS 无关,只是没有在 element.shadowRoot 中发布 shadowRoot,因此无法从外部访问 shadow DOM。

当影子根的模式是“关闭”时,影子根的内部实现是 JavaScript 无法访问和不可更改的 - 就像 <video> 元素的内部实现无法从 JavaScript 访问和更改一样.

document.body
  .appendChild(document.createElement('div'))
  .attachShadow({mode:'closed'})
  .innerHTML = `<style>h1{color:green}</style><h1>Hello</h1><h2>Component</h2>`;
<style>
  body {
    /* inheritable styles do style shadowRoots */
    font: 10px Arial;
    color: red;
  }
</style>

【讨论】:

  • 在一个 div 上应用一个 shadow DOM 并没有把它变成一个 web 组件。
  • 术语“Web 组件”是一个容器术语,几乎所有人(包括我)都错误地使用它。许多个月前,没有 shadowDOM 的自定义元素也不能称为Web 组件
  • 我所知道的带有影子 DOM 的自定义元素并被称为 Web 组件。
  • 声明性影子根将使shadowRoot 可用,即使选择了mode: 'closed'web.dev/declarative-shadow-dom
  • 我不确定最后的评论。最初,这就是他们宣布的将是声明性影子 DOM 的强制结果;我在当前的解释器中找不到更多了。
猜你喜欢
  • 1970-01-01
  • 2020-09-23
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
相关资源
最近更新 更多