Это должно быть просто, но у меня возникли проблемы с поиском поисковых запросов.
Допустим, у меня есть это:
<div class="a c">Foo</div>
<div class="b c">Bar</div>
В CSS, как я могу создать селектор, который соответствует чему-то, что соответствует "(.a или .b) и .c"?
Я знаю, что мог сделать это:
.a.c,.b.c {
/* CSS stuff */
}
Но, если предположить, что мне придется много заниматься такой логикой с различными логическими комбинациями, есть ли лучший синтаксис?
html
css
css-selectors
мистифицировать
источник
источник
Ответы:
Нет. CSS '
or
operator (,
) не разрешает группировки. По сути, это логический оператор самого низкого приоритета в селекторах, поэтому вы должны его использовать.a.c,.b.c
.источник
Пока нет, но есть экспериментальная
:matches()
функция псевдокласса, которая делает именно это:Вы можете найти больше информации об этом здесь и здесь . В настоящее время большинство браузеров поддерживают его первоначальную версию
:any()
, которая работает аналогичным образом, но будет заменена на:matches()
. Нам просто нужно немного подождать, прежде чем использовать это везде (я, конечно, буду).источник
:-moz-any()
и:-webkit-any()
появился задолго до того, как Mozilla предложила его для Селекторов 4 (что привело к его нынешнему воплощению как:matches()
).Uncaught DOMException: Failed to execute 'querySelector' on 'Document': ':any(.a .b)' is not a valid selector.
ошибку? 🤔Если у вас есть это:
И вы хотите только выбрать элементы, которые имеют
.x
и (.a
или.b
), вы можете написать:но это удобно только тогда, когда у вас есть три «подкласса» и вы хотите выбрать два из них.
Выбор только одного подкласса (например
.a
):.a.x
Выбор двух подклассов (например
.a
и.b
):.x:not(.c)
Выбор всех трех подклассов:
.x
источник
a or b or c or d
такое же, какnot(not(a) and not(b) and not(c) and not(d))
«или», на самом деле это просто вспомогательная функция. Теоретически, во всех случаях можно обойтись без него . В случае ОП(.a or .b) and .c
->:not(:not(.a):not(.b)).c
:not(:not([data-status="ACT"]):not([data-status="ISS"]):not([data-status="COR"]))[data-month="08"]
. Код недостаточно чистый для публичного ознакомления, в противном случае я бы его опубликовал. Я тестировал на Chrome, Safari и Android-телефоне низкого уровня.Нет. Стандартный CSS не обеспечивает то, что вы ищете.
Тем не менее, вы можете захотеть посмотреть на LESS и SASS .
Это два проекта, целью которых является расширение синтаксиса CSS по умолчанию путем введения дополнительных функций, включая переменные, вложенные правила и другие улучшения.
Они позволяют вам писать гораздо более структурированный код CSS, и любой из них почти наверняка решит ваш конкретный вариант использования.
Конечно, ни один из браузеров не поддерживает их расширенный синтаксис (тем более, что оба проекта имеют разный синтаксис и функции), но они предоставляют «компилятор», который преобразует ваш код LESS или SASS в стандартный CSS, который вы затем можете развернуть на своем сайте.
источник