::slotted()
::slotted() CSS 偽元素表示已放置在 HTML 模板中的插槽內的任何元素(有關更多資訊,請參閱使用模板和插槽)。
這僅在使用影子 DOM 中的 CSS 時才有效。請注意,此選擇器不會選擇放置在插槽中的文字節點;它只針對實際元素。
試一試
/* This CSS is being applied inside the shadow DOM. */
::slotted(.content) {
background-color: aqua;
}
h2 ::slotted(span) {
background: silver;
}
<template id="card-template">
<div>
<h2><slot name="caption">title goes here</slot></h2>
<slot name="content">content goes here</slot>
</div>
</template>
<my-card>
<span slot="caption">Error</span>
<p class="content" slot="content">Build failed!</p>
</my-card>
customElements.define(
"my-card",
class extends HTMLElement {
constructor() {
super();
const template = document.getElementById("card-template");
const shadow = this.attachShadow({ mode: "open" });
shadow.appendChild(template.content.cloneNode(true));
const elementStyle = document.createElement("style");
elementStyle.textContent = `
div {
width: 200px;
border: 2px dotted red;
border-radius: 4px;
}`;
shadow.appendChild(elementStyle);
const cssTab = document.querySelector("#css-output");
const editorStyle = document.createElement("style");
editorStyle.textContent = cssTab.textContent;
shadow.appendChild(editorStyle);
cssTab.addEventListener("change", () => {
editorStyle.textContent = cssTab.textContent;
});
}
},
);
css
/* Selects any element placed inside a slot */
::slotted(*) {
font-weight: bold;
}
/* Selects any <span> placed inside a slot */
::slotted(span) {
font-weight: bold;
}
語法
css
::slotted(<compound-selector>) {
/* ... */
}
示例
突出顯示插槽元素
在此示例中,我們使用帶有三個插槽的模板
html
<template id="person-template">
<div>
<h2>Personal ID Card</h2>
<slot name="person-name">NAME MISSING</slot>
<ul>
<li><slot name="person-age">AGE MISSING</slot></li>
<li><slot name="person-occupation">OCCUPATION MISSING</slot></li>
</ul>
</div>
</template>
我們定義了 <person-details> 自定義元素。在這種情況下,我們使用 JavaScript 新增樣式,儘管我們可以在<template> 中使用<style> 塊新增它們,效果相同
js
customElements.define(
"person-details",
class extends HTMLElement {
constructor() {
super();
let template = document.getElementById("person-template");
let templateContent = template.content;
const shadowRoot = this.attachShadow({ mode: "open" });
let style = document.createElement("style");
style.textContent =
"div { padding: 10px; border: 1px solid gray; width: 200px; margin: 10px; }" +
"h2 { margin: 0 0 10px; }" +
"ul { margin: 0; }" +
"p { margin: 10px 0; }" +
"::slotted(*) { color: gray; font-family: sans-serif; } " +
"::slotted(span) {text-decoration: underline;} ";
shadowRoot.appendChild(style);
shadowRoot.appendChild(templateContent.cloneNode(true));
}
},
);
當用內容填充 style 元素時,您會看到我們選擇所有插槽元素 (::slotted(*)) 並賦予它們不同的字型和顏色。這使它們與未填充的插槽區別開來。我們為所有插槽的 <span> (::slotted(span)) 設定了樣式,以區分 <span> 與 <p>。
我們的標記包含三個自定義元素,其中包括一個帶有無效插槽名稱的自定義元素,其源順序與 <template> 不同
html
<person-details>
<p slot="person-name">Wonder Woman</p>
<span slot="person-age">Immortal</span>
<span slot="person-occupation">Superhero</span>
</person-details>
<person-details>
<p slot="person-name">Malala Yousafzai</p>
<span slot="person-age">17</span>
<span slot="person-occupation">Activist</span>
</person-details>
<person-details>
<span slot="person-age">44</span>
<span slot="not-a-slot-name">Time traveler</span>
<p slot="person-name">Dr. Who</p>
</person-details>
結果
規範
| 規範 |
|---|
| CSS 作用域模組級別 1 # slotted-pseudo |
瀏覽器相容性
載入中…
另見
:host:host():host-context():has-slotted- CSS 作用域模組
- HTML
slot屬性 - HTML
<slot>元素 - HTML
<template>元素 - Web 元件