intermediate

:has selector

Используйте relational selectors для parent-state styling, состояний форм, замены фич и осознания стоимости селекторов.

`:has()` — реляционный pseudo-class: элемент совпадает, если содержит (или следует за) другим подходящим элементом. Даёт parent-state styling, для которого раньше нужны были JavaScript или лишние классы.

					.form-group:has(:invalid) {
  border-color: var(--danger);
}
.card:has(img) {
  grid-template-columns: 8rem 1fr;
}
nav:has(+ main > h1) {
  margin-block-end: 0;
}
				

Держите селекторы в рамках — карточка с изображением понятна; половина DOM от одного :has — нет. Проверяйте поддержку браузеров и progressive enhancement.

На интервью: сценарии parent selection, progressive enhancement и стоимость селекторов.

Типовые ошибки: слишком широкие :has; замена логики состояния приложения, которая должна быть в JS или ARIA.

Компромисс: меньше разметки против графа селекторов, который труднее понимать.

Чеклист:

  • :has в границах компонента.
  • Визуальное состояние, не скрытая логика приложения.
  • Fallbacks при жёстких требованиях к поддержке.
  • Производительность селекторов на больших деревьях.