Можно ли определить стиль CSS для элемента, который применяется, только если соответствующий элемент содержит определенный элемент (как прямой дочерний элемент)?
Я думаю, что это лучше всего объяснить на примере.
Примечание : я пытаюсь стилизовать родительский элемент , в зависимости от того, какие дочерние элементы он содержит.
<style>
/* note this is invalid syntax. I'm using the non-existing
":containing" pseudo-class to show what I want to achieve. */
div:containing div.a { border: solid 3px red; }
div:containing div.b { border: solid 3px blue; }
</style>
<!-- the following div should have a red border because
if contains a div with class="a" -->
<div>
<div class="a"></div>
</div>
<!-- the following div should have a blue border -->
<div>
<div class="b"></div>
</div>
Примечание 2 : я знаю, что могу добиться этого с помощью javascript, но мне просто интересно, возможно ли это с помощью некоторых неизвестных (для меня) функций CSS.
ol < li:nth-child(n+10) { margin-left: 2rem; } ol < li:nth-child(n+100) { margin-left: 3rem; } ol < li:nth-child(n+1000) { margin-left: 4rem; }
в идеальном мире это увеличило бы пределol
зависимости от количества содержащихся в немli
дочерних элементов, так что поле слева было бы таким же широким, как оно. нужно быть.Ответы:
Насколько я знаю, стилизация родительского элемента на основе дочернего элемента не является доступной функцией CSS. Вам, вероятно, понадобятся сценарии для этого.
Было бы замечательно, если бы вы могли сделать что-то подобное
div[div.a]
илиdiv:containing[div.a]
как вы сказали, но это невозможно.Вы можете рассмотреть вопрос о просмотре jQuery . Его селекторы очень хорошо работают с «содержащими» типами. Вы можете выбрать div на основе его дочернего содержимого, а затем применить класс CSS к родительскому элементу в одной строке.
Если вы используете jQuery, что-то вроде этого может работать (не проверено, но теория есть):
или
в сочетании с классом CSS:
Вот документация для селектора jQuery .
источник
:has
селектора рекомендуется использовать.has()
метод ( api.jquery.com/has ) =>, примененный к текущему вопросу, который он даст, например$('div').has('div.a').css('border', '1px solid red');
:has
селектор может работать, но он в черновой версии, и ни один браузер его не поддерживает.В основном нет. Следующее было бы то, что вы были в теории:
К сожалению, этого не существует.
Есть несколько рецензий по линии «почему, черт возьми, нет». Хорошо разработанный Шоном Инманом очень хорош:
http://www.shauninman.com/archive/2008/05/05/css_qualified_selectors
источник
:has()
псевдокласса, но мы будем использовать его только в CSS4. На данный момент (конец 2019 года) JS по-прежнему является единственным способом достижения этой функциональности.Поверх ответа @ kp:
Я имею дело с этим, и в моем случае я должен показать дочерний элемент и соответствующим образом исправить высоту родительского объекта (автоматическое определение размера не работает в заголовке начальной загрузки по какой-то причине у меня нет времени на отладку) ,
Но вместо того, чтобы использовать javascript для изменения родительского элемента, я думаю, что я буду динамически добавлять класс CSS к родительскому элементу и соответствующим образом избирательно показывать дочерние элементы CSS. Это будет поддерживать решения в логике, а не на основе состояния CSS.
ТЛ; др; применять
a
иb
стили к родителю<div>
, а не ребенка (конечно, не все будут в состоянии сделать это. то есть угловые компоненты , принимающие решения своих собственных).источник
В моем случае мне пришлось изменить заполнение ячеек элемента, который содержал флажок ввода для таблицы, которая динамически отображается с помощью DataTables:
После реализации следующего строкового кода в функции initComplete я смог создать правильный отступ, который исправил отображение строк с аномально большой высотой
Теперь вы можете видеть, что к родительскому элементу применяются правильные стили:
По сути, этот ответ является расширением ответа @ KP, но чем больше сотрудничества в реализации этого, тем лучше. Подводя итог, я надеюсь, что это помогает кому-то еще, потому что это работает! Наконец, большое спасибо @KP за то, что вы направили меня в правильном направлении!
источник