我正在尝试使用 Vanilla 自定义元素,但似乎无法插入样式标签:
class MyElement extends HTMLElement {
constructor() {
super();
this.attachShadow({mode: "open"});
}
connectedCallback() {
this.shadowRoot.append(document.getElementById('my-element-template').content.cloneNode(true));
}
}
window.customElements.define("my-element", MyElement);
<template id="my-element-template">
<slot name="my-style">
<style>
p { color: red; }
</style>
</slot>
<p>Why am I still red instead of green?</p>
</template>
<my-element>
<style slot="my-style">
p { color: green; }
</style>
</my-element>
更新- 将样式元素移至 ShadowDOM
原始解决方案有效,但评论者建议改进。插槽内的样式元素的行为与其他类型元素不同。它们出现在 DOM 中,而不是组件的 ShadowDOM 中。这就是 OP 的代码无法按预期工作的原因。原始解决方案使用shadowRoot.adoptedStyleSheets解决了这个问题,但这些步骤是不必要的。更简单的解决方案是将样式元素直接移入 ShadowDOM。
重要的是,这仅适用于添加到插槽的样式,而不适用于组件定义中的样式。
原始解决方案-有效,但冗长