【问题标题】:Why can't I target my custom-defined HTML elements in CSS?为什么我不能在 CSS 中定位我自定义的 HTML 元素?
【发布时间】:2022-01-24 17:16:54
【问题描述】:

在我的 HTML 中,我有:

<link rel="stylesheet" href="css/styles.css">
<script src="js/components/custom.js"></script> 
...
<custom></custom>

custom.js,假设我已经定义:

class Custom extends HTMLElement {
  connectedCallback() {
  const shadow = this.attachShadow({mode: 'open'});
    shadow.innerHTML = `
      <style>
        @import url('/css/styles.css');
      </style>
      ...
    `
  }
}

customElements.define('custom', Custom)

styles.css 中,当我定义样式时,它们起作用。但我不能做类似的事情

custom img {

}

custom 内的img 为目标。我必须使用 div.custom-contents 之类的包装器来定位其中的元素。

这是一个已知的限制,可能是 @imports 这样的自定义元素,还是我做错了什么?

【问题讨论】:

    标签: html css web-component custom-element css-import


    【解决方案1】:

    自定义元素的名称必须包含至少一个字母,后跟 - 破折号,然后至少包含一个其他字母。 如果您不符合该要求,您的 Web 组件将无法运行。

    您的组件使用影子 DOM。没有任何外部样式会影响 shadow DOM(继承除外),并且 shadow DOM 中的任何样式都不会影响组件之外的元素。这是 shadow DOM 背后的主要概念 - 组件带来它们的样式,并且不影响使用它们的页面上的其他元素。

    另外,您不应该在 connectedCallback 中附加影子 DOM。这应该始终在constructor 中完成。

    您可以使用part 属性和::part 伪元素来允许从外部进行样式设置。

    【讨论】:

    • connectedCallback 中创建一个shadowRoot 很好;如果您知道在 DOM 中移动组件时回调将再次执行。
    • 技术上没问题;但我几乎想不出为什么你不想在构造函数中使用它的原因。在 4 年多的时间里开发 Web 组件作为我的主要工作任务,我还没有遇到过将它放在 connectedCallback 中的情况。你能想到一个需要不断重建影子根的情况吗?如果没有,它只会产生麻烦,要么在 disconnectedCallback 中清理它,要么必须在 connectedCallback 中保护它的创建。
    • 几乎每次您想创建动态内容一次。有或没有您在constructor不应访问的属性。我在 SO 上的许多 [svg] 答案仅使用 connectedCallbackstackoverflow.com/questions/70805170/… 我一定是疯了,我已经这样做了 5 年以上的 Web 组件年。
    • “在 disconnectedCallback 中清理它” 需要清理什么?
    • 在这里操作。我的实际组件名称中确实有一个连字符,忘记在此示例代码中翻译该要求。感谢其他指针。元素本身是否算作“组件之外”?就像我可以在 CSS 中使用 p { ... } 设置 &lt;p&gt; 标记一样。但是不能在 CSS 中使用 custom-element { ... } 设置 &lt;custom-element&gt; 样式?
    猜你喜欢
    • 2020-03-22
    • 2019-01-25
    • 1970-01-01
    • 2022-11-23
    • 2016-05-20
    • 2020-10-01
    • 2021-07-05
    • 2022-09-28
    • 2010-11-03
    相关资源
    最近更新 更多