Псевдоэлемент CSS `::slotted()`
Базовая поддержка Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в различных версиях браузеров. Она доступна во всех браузерах с января 2020 года.
::slotted() CSS псевдоэлемент представляет любой элемент, помещённый в слот HTML-шаблона (подробнее см. в разделе Использование шаблонов и слотов).
Это работает только при использовании внутри CSS, размещённого в теневом DOM. Обратите внимание: этот селектор не выбирает текстовый узел, помещённый в слот; он предназначен только для реальных элементов.
Попробуйте
/* 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(document.importNode(template.content, 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;
});
}
},
);
/* Selects any element placed inside a slot */
::slotted(*) {
font-weight: bold;
}
/* Selects any <span> placed inside a slot */
::slotted(span) {
font-weight: bold;
}
Синтаксис
::slotted(<compound-selector>) {
/* ... */
}
Примеры
Выделение элементов в слотах
В этом примере мы используем шаблон с тремя слотами:
<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, хотя можем добавить их в блоке <style> внутри <template>, получив тот же результат:
customElements.define(
"person-details",
class extends HTMLElement {
constructor() {
super();
const template = document.getElementById("person-template");
const shadowRoot = this.attachShadow({ mode: "open" });
const 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(document.importNode(template.content, true));
}
},
);
При добавлении содержимого в элемент style вы увидите, что мы выбираем все элементы в слотах (::slotted(*)) и задаём им другой шрифт и цвет. Это отличает их от незаполненных слотов. Мы стилизуем все элементы <span> в слотах (::slotted(span)), чтобы отличить элементы <span> от элементов <p>.
В нашей разметке есть три пользовательских элемента, в том числе пользовательский элемент с недопустимым именем слота, расположенный в исходном порядке, отличном от <template>:
<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 Shadow, уровень 1 # slotted-pseudo |
Совместимость с браузерами
| Настольные компьютеры | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome для Android | Firefox для Android | Opera для Android | Safari на iOS | Samsung Internet | WebView для Android | WebView на iOS | |
slotted |
50 |
79 |
63 |
37 |
10 |
50 |
63 |
37 |
10 |
5.0 |
50 |
10 |
См. также
:host:host:host-context():has-slotted- Область действия CSS — модуль
- Атрибут HTML
slot - Элемент HTML
<slot> - Элемент HTML
<template> - Веб-компоненты
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/::slotted