【发布时间】:2018-04-23 15:56:56
【问题描述】:
我在不使用任何第三方库(例如 Polymer)的情况下迈出了进入 web components 的第一步。主要卖点之一是 Web 组件样式与其他地方定义的样式分开,允许组件的 shadow-DOM 在类似沙盒的环境中设置样式。
我遇到的问题是样式如何通过开槽元素级联。由于开槽元素不是 shadow DOM 的一部分,因此它们只能使用组件模板中的 ::slotted() 选择器来定位。这很好,但是几乎不可能保证 Web 组件在所有上下文中都能正确显示,因为外部定义的样式也以不可战胜的特殊性* 应用于开槽元素。
*除了!important.
这个问题可以归结为:
customElements.define("my-nav",
class extends HTMLElement {
constructor() {
super();
const template = document.querySelector("template#my-nav").content;
this.attachShadow({ mode: "open" })
.appendChild(template.cloneNode(true));
}
}
);
a {
color: red; /* >:( */
}
<template id="my-nav">
<style>
.links-container ::slotted(a) {
color: lime;
font-weight: bold;
margin-right: 20px;
}
</style>
<div class="links-container">
<slot name="links"></slot>
</div>
</template>
<p>I want these links to be green:</p>
<my-nav>
<a href="#" slot="links">Link 1</a>
<a href="#" slot="links">Link 2</a>
<a href="#" slot="links">Link 3</a>
</my-nav>
我很难理解这个“功能”的价值。我要么必须以其他格式指定我的链接并使用 JS 创建它们的节点,要么将 !important 添加到我的颜色属性 - 仍然 并不能保证任何其他属性的一致性我还没定义。
这个问题是否已在某处得到解决,或者是否可以通过更改我的轻型 DOM 结构轻松解决?我不确定如何将链接列表放入插槽。
【问题讨论】:
标签: javascript html web-component shadow-dom native-web-component