Кратко
СкопированоПсевдокласс :state используется для кастомных HTML-элементов и позволяет применять стили в зависимости от их пользовательского состояния.
Пример
Скопировано
<toggle-box>Нажми меня</toggle-box>
<toggle-box>Нажми меня</toggle-box>
class ToggleBox extends HTMLElement { constructor() { super() this._internals = this.attachInternals() this.addEventListener('click', () => { if (this._internals.states.has('active')) { this._internals.states.delete('active') } else { this._internals.states.add('active') } }) }}customElements.define('toggle-box', ToggleBox)
class ToggleBox extends HTMLElement {
constructor() {
super()
this._internals = this.attachInternals()
this.addEventListener('click', () => {
if (this._internals.states.has('active')) {
this._internals.states.delete('active')
} else {
this._internals.states.add('active')
}
})
}
}
customElements.define('toggle-box', ToggleBox)
toggle-box:state(active) { color: green;}
toggle-box:state(active) {
color: green;
}
Как пишется
Скопировано
:host(:state(<состояние>)) { /* Стили, когда у компонента установлено состояние */}
:host(:state(<состояние>)) {
/* Стили, когда у компонента установлено состояние */
}
// Внутри кастомного элементаconst internals = this.attachInternals();internals.states.add('active'); // Устанавливаем состояниеinternals.states.delete('active'); // Удаляем состояние
// Внутри кастомного элемента
const internals = this.attachInternals();
internals.states.add('active'); // Устанавливаем состояние
internals.states.delete('active'); // Удаляем состояние
Для работы с состояниями кастомного элемента нужно получить объект internals через this. Только после этого можно использовать internals для управления состояниями.
Как понять
СкопированоСелектор :state применяется к компоненту, если у него установлено внутреннее состояние через CustomState, доступный по свойству internals внутри кастомного элемента. Такие состояния не отображаются в виде атрибутов или классов и не видны в DOM. Управлять ими можно только из JavaScript. Механизм работает только для компонентов, зарегистрированных через custom. Для компонентов с Shadow DOM можно использовать :host.
Подсказки
Скопировано💡 Можно задавать несколько состояний и применять к ним разные стили.
💡 Используйте :state для логики типа «открыт/закрыт», «активен/неактивен» без необходимости менять классы или атрибуты.
- Chrome 125, поддерживается
- Edge 125, поддерживается
- Firefox 126, поддерживается
- Safari 17.4, поддерживается