Клавиша / esc

::slotted()

Псевдоэлемент ::slotted() позволяет стилизовать элементы, переданные во внешний слот веб-компонента

Время чтения: меньше 5 мин

Кратко

Скопировано

Псевдоэлемент ::slotted() позволяет стилизовать вставленные во внешний слот элементы внутри 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)

        
        
          
        
      
Открыть демо в новой вкладке

Как пишется

Скопировано

Псевдоэлемент ::slotted() пишется внутри 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>) — способ «вставить» внешний контент внутрь компонента. ::slotted() — единственный способ внутри Shadow DOM обратиться к внешнему содержимому, пришедшему через слот.

Подсказки

Скопировано

💡 Работает только внутри Shadow DOM. В обычном CSS — не сработает.
💡 ::slotted() работает только с прямыми потомками слота. Вложенные теги — игнорируются.
💡 ::slotted() имеет более низкую специфичность по сравнению с внешними стилями, вне зависимости от селектора.
💡 Если слот именованный (<slot name="title">), ::slotted() тоже работает:

        
          
          ::slotted([slot="title"]) {  font-weight: bold;}
          ::slotted([slot="title"]) {
  font-weight: bold;
}

        
        
          
        
      
Поддержка в браузерах:
  • Chrome 53, поддерживается
  • Edge 79, поддерживается
  • Firefox 63, поддерживается
  • Safari 10, поддерживается
О Baseline