Кратко
СкопированоПсевдоэлемент : позволяет стилизовать вставленные во внешний слот элементы внутри Shadow DOM компонента.
Пример
Скопировано
<template id="card-template"> <style> ::slotted(h1) { font-weight: bold; color: #FF8630; margin-bottom: 8px; font-size: 2rem; } ::slotted(p) { font-size: 1.2rem; } </style> <div class="card" part="box"> <slot name="title">Пустая карточка 😔</slot> <slot name="content"></slot> </div></template><my-card> <h1 slot="title">Крутая карточка 😎</h1> <p slot="content">Контент очень крутой карточки</p></my-card><my-card></my-card>
<template id="card-template">
<style>
::slotted(h1) {
font-weight: bold;
color: #FF8630;
margin-bottom: 8px;
font-size: 2rem;
}
::slotted(p) {
font-size: 1.2rem;
}
</style>
<div class="card" part="box">
<slot name="title">Пустая карточка 😔</slot>
<slot name="content"></slot>
</div>
</template>
<my-card>
<h1 slot="title">Крутая карточка 😎</h1>
<p slot="content">Контент очень крутой карточки</p>
</my-card>
<my-card></my-card>
class MyCard extends HTMLElement { constructor() { super() const shadow = this.attachShadow({ mode: 'open' }) const template = document.getElementById('card-template') const content = template.content.cloneNode(true) shadow.appendChild(content) }}customElements.define('my-card', MyCard)
class MyCard extends HTMLElement {
constructor() {
super()
const shadow = this.attachShadow({ mode: 'open' })
const template = document.getElementById('card-template')
const content = template.content.cloneNode(true)
shadow.appendChild(content)
}
}
customElements.define('my-card', MyCard)
Как пишется
СкопированоПсевдоэлемент : пишется внутри Shadow DOM, и работает только для элементов, переданных в <slot> из внешнего DOM:
::slotted(h2) { color: red;}
::slotted(h2) {
color: red;
}
Можно указывать тег, класс, атрибуты и другие селекторы:
::slotted(.highlighted) { background: yellow;}
::slotted(.highlighted) {
background: yellow;
}
Нельзя стилизовать вложенные элементы:
/* НЕ РАБОТАЕТ! */::slotted(div span) { color: red;}
/* НЕ РАБОТАЕТ! */
::slotted(div span) {
color: red;
}
Как понять
СкопированоShadow DOM создаёт изоляцию: стили внутри компонента не влияют на внешний DOM, и наоборот. Слот (<slot>) — способ «вставить» внешний контент внутрь компонента. : — единственный способ внутри Shadow DOM обратиться к внешнему содержимому, пришедшему через слот.
Подсказки
Скопировано💡 Работает только внутри Shadow DOM. В обычном CSS — не сработает.
💡 : работает только с прямыми потомками слота. Вложенные теги — игнорируются.
💡 : имеет более низкую специфичность по сравнению с внешними стилями, вне зависимости от селектора.
💡 Если слот именованный (<slot name), : тоже работает:
::slotted([slot="title"]) { font-weight: bold;}
::slotted([slot="title"]) {
font-weight: bold;
}
- Chrome 53, поддерживается
- Edge 79, поддерживается
- Firefox 63, поддерживается
- Safari 10, поддерживается