
Что такое :has() в CSS?
:has() — это CSS селектор нового поколения, который называют «parent selector».
Он позволяет выбирать элементы, основываясь на том, что находится внутри них или рядом с ними.
Раньше в CSS мы могли выбирать дочерние элементы (.card img {}), но не могли стилизовать родителя, если у него внутри есть что-то конкретное. :has() решает эту проблему.
Можно использовать как замену JS в некоторых случаях (например, стилизация родителя при активном дочернем).
Синтаксис
element:has(selector) {
/* стили */
}
element— элемент, к которому применяем правило.selector— условие, что должно находиться внутри.
Реальный пример
.article:has(h2, h3) {
padding-top: 2rem;
}
Если в статье есть подзаголовки, добавляем дополнительный отступ.
Синтаксис использования has() с не сколькими условиями
В CSS можно использовать :has() с несколькими условиями — это мощная возможность, которая делает CSS гораздо более “умным” и контекстно-зависимым. Поддержка :has() появилась в большинстве современных браузеров.
Селектор :has() может принимать одно или несколько условий, разделённых запятыми или логическими операторами:
ИЛИ (A, B) — работает как “или”
article:has(h1, h2) { border: 1px solid red; }Применит стиль к <article>, если внутри есть либо h1, либо h2, либо оба.
И (A:has(B):has(C)) — работает как “и”
Чтобы задать несколько условий одновременно, нужно вложить :has() друг в друга:
div:has(h1):has(p) { background: lightgreen; }Применит стиль к <div>, если он содержит и h1, и p.
Сложные условия с вложенностью
section:has(article:has(img)) { outline: 2px dashed blue; }Применит стиль к <section>, если внутри есть <article>, а в нём — <img>.
Комбинирование с псевдоклассами
form:has(input:invalid) { border: 2px solid red; }Применит стиль к <form>, если в ней есть хотя бы один невалидный <input>.
N.B.
Селекторы с :has() могут быть тяжёлыми для производительности, особенно если использовать их на больших страницах. Браузеру приходится просматривать внутренности каждого элемента, чтобы понять, применять ли к нему стиль.