Кратко
СкопированоПсевдоэлемент :
позволяет стилизовать вставленные во внешний слот элементы внутри 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, поддерживается