Клавиша / esc

:has-slotted

CSS-псевдокласс для стилизации <slot> в Shadow DOM в зависимости от наличия пользовательского контента.

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

Кратко

Скопировано

:has-slotted — CSS-псевдокласс, который позволяет определить, содержит ли <slot> в Shadow DOM пользовательский контент (не только значение по умолчанию). Работает только внутри стилей, размещённых в Shadow DOM.

Пример

Скопировано
        
          
          <template id="my-element-template">  <style>    :has-slotted {      color: green;    }    :not(:has-slotted) {      color: red;    }  </style>  <slot><code>:has-slotted</code> Не работает!</slot></template><div class="container">  <my-element>    <code>:has-slotted</code> Работает!  </my-element>  <my-element></my-element></div>
          <template id="my-element-template">
  <style>
    :has-slotted {
      color: green;
    }
    :not(:has-slotted) {
      color: red;
    }
  </style>
  <slot><code>:has-slotted</code> Не работает!</slot>
</template>

<div class="container">
  <my-element>
    <code>:has-slotted</code> Работает!
  </my-element>

  <my-element></my-element>
</div>

        
        
          
        
      
        
          
          class MyElement extends HTMLElement {  constructor() {    super();    const shadow = this.attachShadow({ mode: 'open' });    const template = document.getElementById('my-element-template');    shadow.appendChild(template.content.cloneNode(true));  }}customElements.define('my-element', MyElement);
          class MyElement extends HTMLElement {
  constructor() {
    super();
    const shadow = this.attachShadow({ mode: 'open' });
    const template = document.getElementById('my-element-template');
    shadow.appendChild(template.content.cloneNode(true));
  }
}

customElements.define('my-element', MyElement);

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

Как пишется

Скопировано
        
          
          :has-slotted {  /* Стили для слотов с пользовательским контентом */}:not(:has-slotted) {  /* Стили для слотов без пользовательского контента */}
          :has-slotted {
  /* Стили для слотов с пользовательским контентом */
}

:not(:has-slotted) {
  /* Стили для слотов без пользовательского контента */
}

        
        
          
        
      

Псевдокласс применяется только к элементу <slot> внутри Shadow DOM.

Как понять

Скопировано

:has-slotted позволяет стилизовать <slot>, если в него был передан контент из Light DOM (то есть если слот не пустой и не использует значение по умолчанию). Даже если в слот передан только пробел или текстовый узел, псевдокласс сработает.

Это удобно для создания адаптивных компонентов, которые меняют внешний вид в зависимости от наличия пользовательского контента.

Подсказки

Скопировано

💡 Работает только внутри CSS, размещённого в Shadow DOM.
💡 Если слот пустой или использует только значение по умолчанию, :has-slotted не применяется.
💡 Даже пробел или невидимый текст считаются контентом для этого псевдокласса.
💡 Для стилизации содержимого слота используйте также ::slotted.

Поддержка в браузерах:
  • Chrome 134, поддерживается
  • Edge 134, поддерживается
  • Firefox 136, поддерживается
  • Safari, не поддерживается
О Baseline