Стилизация родителя в CSS по наличию дочернего элемента

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

JavaScript — это отличный инструмент для добавления классов к родительскому элементу, в зависимости от наличия у него определённых дочерних элементов. В приведённом ниже примере кода показано, как добавить класс .styled родительскому элементу, если у него присутствует потомок с конкретным селектором.

JS
Скопировать код
document.addEventListener('DOMContentLoaded', () => {
    const parent = document.querySelector('.parent');
    if (parent.querySelector('.child')) {
        parent.classList.add('styled');
    }
});

После этого определите стили для нового класса в CSS:

CSS
Скопировать код
.parent.styled {
    color: #007bff; // Пример стиля
}

Вуаля! Теперь у родительского элемента отобразятся стили, в случае обнаружения у него дочернего элемента.

Кинга Идем в IT: пошаговый план для смены профессии

JavaScript приходит на помощь

JavaScript — настоящий герой во вселенной DOM (Document Object Model), позволяющий динамически изменять стили на основании определённых условий.

Как JavaScript и CSS расширяют возможности друг друга

JavaScript способен не только проверять наличие дочерних элементов, но и вычислять их количество, после чего добавлять соответствующие CSS-классы к родительскому элементу.

JS
Скопировать код
const parent = document.querySelector('.parent');
if (parent.querySelectorAll('.child').length > 2) { // Если больше двух детей. 
    parent.classList.add('many-children'); // Применяем специальный стиль!
}

Теперь создайте в CSS правила для класса many-children.

CSS
Скопировать код
.parent.many-children {
    box-shadow: 0px 0px 15px rgba(0,0,0,0.2); // Добавляем тени!
}

CSS псевдокласс :has() – новые возможности... в будущем!

Псевдокласс :has() предоставляет новые способы для стилизации элементов на основе их потомков. Однако, его поддержка в браузерах на данный момент ограничена.

CSS
Скопировать код
.parent:has(> .important-child) {
    background-color: #ffeb3b; // Выделяем цветом при наличии важного потомка.
}

Визуализация

Считайте дочерние элементы факторами, влияющими на внешний вид родительского элемента.

Структура (родитель)
  |
  |--🔵 (потомок: при его наличии применяются стили)
  |--🔴 (потомок: другие стили при его наличии)

Для каждого условия существует соответствующее CSS-правило:

CSS
Скопировать код
.parent:has(> .child-blue) { border: 1px solid blue; }
.parent:has(> .child-red) { border: 1px solid red; }

Подобно оформлению рамы картины, которое зависит от выбранных цветов!

Работа с сложными DOM-структурами: глубокое погружение в jQuery

Когда CSS не в состоянии выполнить требуемые задачи, jQuery выручает с помощью своих мощных селекторов. Они позволяют стилизовать родительские элементы в зависимости от их потомков.

JS
Скопировать код
$('.parent:has(.special-child)') // Любой потомок с классом `.special-child`
    .addClass('highlight');

Затем определяем CSS для этого класса:

CSS
Скопировать код
.parent.highlight {
    outline: 2px dashed #4caf50; // Рамка для выделения!
}

Сравнение селекторов: CSS против jQuery

Рассмотрим подходы CSS и jQuery для различных случаев:

ВозможностьCSSjQuery
Прямой потомок.parent > .child$('.parent > .child')
Любой наследник.parent .child$('.parent .child')
Условная стилизация на основе потомка.parent:has(.child)*$('.parent:has(.child)')

*Функционал, которого мы ждём с нетерпением

Выбираем подходящий инструмент

CSS – Декларативность и простота

Используйте CSS, если отношение между родительским и дочерними элементами стабильно и известно заранее.

CSS
Скопировать код
.parent:hover > .child {
    display: block; // Дети, выходите на улицу!
}

JavaScript – Для работы в динамике

Если структура DOM или его состояние изменяются, вам пригодится JavaScript:

JS
Скопировать код
window.addEventListener('resize', () => {
    document.querySelectorAll('.parent').forEach(parent => {
        if (window.innerWidth > 768) {
            parent.classList.add('wide-screen'); // Просторный вид для широких экранов.
        } else {
            parent.classList.remove('wide-screen'); // Сузаем взгляд при уменьшении экрана.
        }
    });
});

jQuery – Инструмент для решения сложных задач

Пользуйтесь jQuery, когда необходимо управлять сложной структурой или условно применять стили:

JS
Скопировать код
$(window).on('load scroll', () => {
    $('.parent:has(.in-view)').each(function() {
        if ($(this).find('.child').visible()) {
            $(this).addClass('active'); // Если потомок в поле зрения, выделяем его!
        }
    });
});

Полезные материалы

  1. Селекторы CSS – MDN
  2. Selectors Level 4
  3. Существует ли в CSS родительский селектор? – Stack Overflow
  4. :has() – CSS-Tricks
  5. Поддержка функций в разных браузерах – Can I use
  6. Руководство по сложным CSS-селекторам – Smashing Magazine
  7. Использование пользовательских свойств в CSS (переменных) – MDN