Isso deve ser simples, mas estou tendo problemas para encontrar os termos de pesquisa.
Digamos que eu tenho isso:
<div class="a c">Foo</div>
<div class="b c">Bar</div>
No CSS, como posso criar um seletor que corresponda a algo que corresponda a "(.a ou .b) e .c"?
Eu sei que eu poderia fazer isso:
.a.c,.b.c {
/* CSS stuff */
}
Mas, supondo que eu tenha que fazer muito esse tipo de lógica, com uma variedade de combinações lógicas, existe uma sintaxe melhor?
html
css
css-selectors
Josh
fonte
fonte
Respostas:
Não. O
or
operador CSS ' (,
) não permite agrupamentos. É essencialmente o operador lógico de menor precedência nos seletores, então você deve usá-lo.a.c,.b.c
.fonte
Ainda não, mas existe a
:matches()
função pseudo-classe experimental que faz exatamente isso:Você pode encontrar mais informações aqui e aqui . Atualmente, a maioria dos navegadores suporta sua versão inicial
:any()
, que funciona da mesma maneira, mas será substituída por:matches()
. Nós apenas temos que esperar um pouco mais antes de usar isso em qualquer lugar (eu certamente o farei).fonte
:-moz-any()
e:-webkit-any()
apareceu muito antes da Mozilla sugerir para os seletores 4 (que antecederam sua encarnação atual como:matches()
).Uncaught DOMException: Failed to execute 'querySelector' on 'Document': ':any(.a .b)' is not a valid selector.
erro? 🤔Se você tem isso:
E você só deseja selecionar os elementos que possuem
.x
e (.a
ou.b
), você pode escrever:mas isso é conveniente apenas quando você tem três "subclasses" e deseja selecionar duas delas.
Selecionando apenas uma subclasse (por exemplo
.a
):.a.x
Selecionando duas subclasses (por exemplo
.a
e.b
):.x:not(.c)
Selecionando todas as três subclasses:
.x
fonte
a or b or c or d
é igualnot(not(a) and not(b) and not(c) and not(d))
a 'ou' é na verdade apenas uma função de conveniência. Em teoria, deve ser possível sobreviver sem ele em todos os casos. No caso do OP(.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"]
. O código ainda não está limpo o suficiente para leitura pública, caso contrário, eu o publicaria. Eu testei no chrome, safari e um telefone Android low-end.Não. O CSS padrão não fornece o tipo de coisa que você está procurando.
No entanto, você pode querer analisar o LESS e o SASS .
Estes são dois projetos que visam estender a sintaxe padrão do CSS introduzindo recursos adicionais, incluindo variáveis, regras aninhadas e outros aprimoramentos.
Eles permitem que você escreva códigos CSS muito mais estruturados, e qualquer um deles certamente resolverá seu caso de uso específico.
Obviamente, nenhum dos navegadores suporta sua sintaxe estendida (especialmente porque os dois projetos têm sintaxe e recursos diferentes), mas o que eles fazem é fornecer um "compilador" que converte seu código LESS ou SASS em CSS padrão, que você pode implantar no seu site.
fonte