Кратко
Скопировано:has — 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 позволяет стилизовать <slot>, если в него был передан контент из Light DOM (то есть если слот не пустой и не использует значение по умолчанию). Даже если в слот передан только пробел или текстовый узел, псевдокласс сработает.
Это удобно для создания адаптивных компонентов, которые меняют внешний вид в зависимости от наличия пользовательского контента.
Подсказки
Скопировано💡 Работает только внутри CSS, размещённого в Shadow DOM.
💡 Если слот пустой или использует только значение по умолчанию, :has не применяется.
💡 Даже пробел или невидимый текст считаются контентом для этого псевдокласса.
💡 Для стилизации содержимого слота используйте также :.
- Chrome 134, поддерживается
- Edge 134, поддерживается
- Firefox 136, поддерживается
- Safari, не поддерживается