Кратко
СкопированоПсевдокласс :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, поддерживается