【发布时间】:2021-03-05 23:37:59
【问题描述】:
我目前正在尝试自定义元素中的插槽。
看这个简单的例子:
customElements.define('x-y', class extends HTMLElement {
constructor() {
super();
let template = document.createElement('template');
template.innerHTML = `<style>
:host { display: block; align-self: normal; }
div {
background-color: #666;
color: white;
padding: 5px;
}
</style>
<div>affected by styles from ShadowDOM</div>
<slot name="content"></slot>`;
const shadowRoot = this.attachShadow({
mode: 'open'
}).appendChild(template.content.cloneNode(true));
}
})
body {
border: 2px dashed magenta;
display: grid;
height: 100vh;
grid-template-rows: minmax(0, 1fr);
margin: 0;
}
* {
box-sizing: border-box;
}
x-y>div {
background-color: #f0f0f0;
padding: 5px;
}
.inner-grid {
display: grid;
grid-template-rows: 1fr 2fr;
height: 100%;
overflow: auto;
}
<x-y class="inner-grid">
<div slot="content">not affected by styles from ShadowDOM</div>
</x-y>
正如我们所见,.inner-grid 的网格定义虽然在页面的 CSS 中定义,但确实会影响 shadowDOM 内容的显示。
这虽然很方便,但有点出乎意料,因为外部 CSS 不应该影响 Web 组件的内部(例外是继承属性和自定义属性)。
我的第二个期望——也被违反了——是一个网格容器使它的直接子代成为网格单元格,如果有的话,网格模板定义适用于这些单元格。 shadowDOM 中的元素怎么会是这样的直接子元素?
这是 Chrome 元素检查器中的结构:
问:谁能解释一下具体是如何工作的? CSS 网格如何与 shadow DOM / light DOM 混合内容交互?请添加参考,如果有的话。
【问题讨论】:
标签: javascript html css-grid shadow-dom custom-element