Как посредством css выделить объект, у которого есть дочерние элементы?
Сабж в вопросе. Если стилизировать детей можно банальным X>Y, то вопрос стилизации только тех родителей, у которых есть дети, неожиданно поставил в тупик.
Сабж в вопросе. Если стилизировать детей можно банальным X>Y, то вопрос стилизации только тех родителей, у которых есть дети, неожиданно поставил в тупик.
Вообще, можно выбрать непустые элементы (содержащие дочерние элементы, текст или пробелы).
С помощью псевдоклассов :empty
и :not
. Вот так:
.parent:not(:empty) {
/* ... */
}
Не уверен, что вам это подходит на 100%, но в CSS правилах указать на родительский элемент через его дочерние элементы невозможно.
Тем не менее, вы можете добиться желаемого эффекта другим способом.
Допустим, есть такая разметка:
<span class="parent">
<span class="child">1</span>
</span>
<span class="parent">
<span class="child">1</span>
<span class="child">2</span>
</span>
С помощью псевдокласса :only-child мы можем найти единственный дочерний элемент у родителя, а дальше с помощью абсолютного позиционирования и z-index
стилизовать такого родителя.
.parent {
border: 1px solid #333; /* По умолчанию граница у родителя серая */
padding: 5px;
position: relative;
}
.child {
background: lightgray; /* По умолчанию фон у дочерних элементов светло-серый */
padding: 2px 5px;
}
.child:only-child {
background: yellow; /* У единственного потомка фон желтый */
}
.child:only-child::before {
border: 1px solid cyan; /* Перекрываем серую границу родителя бирюзовой */
content: '';
display: block;
/* Клики будут проходить сквозь псевдоэлемент */
pointer-events: none;
position: absolute;
/* Исправляем смещение, получившееся из-за границы родителя */
top: -1px;
left: -1px;
/* Растягиваем элемент на всю ширину и высоту родителя */
height: 100%;
width: 100%;
}
Получится вот что:
Дополнительно почитайте вот эту статью (она на английском):
Стилизация дочерних элементов на основе их количества
Выдержка из нее:
/* один элемент */
li:first-child:nth-last-child(1) {
width: 100%;
}
/* два элемента */
li:first-child:nth-last-child(2),
li:first-child:nth-last-child(2) ~ li {
width: 50%;
}
/* три элемента */
li:first-child:nth-last-child(3),
li:first-child:nth-last-child(3) ~ li {
width: 33.3333%;
}
/* четыре элемента */
li:first-child:nth-last-child(4),
li:first-child:nth-last-child(4) ~ li {
width: 25%;
}