Esto debería ser simple, pero tengo problemas para encontrar los términos de búsqueda.
Digamos que tengo esto:
<div class="a c">Foo</div>
<div class="b c">Bar</div>
En CSS, ¿cómo puedo crear un selector que coincida con algo que coincida con "(.a o .b) y .c"?
Sé que podría hacer esto:
.a.c,.b.c {
/* CSS stuff */
}
Pero, suponiendo que voy a tener que hacer mucho este tipo de lógica, con una variedad de combinaciones lógicas, ¿hay una mejor sintaxis?
html
css
css-selectors
Josh
fuente
fuente
Respuestas:
No. El
or
operador CSS (,
) no permite agrupaciones. Es esencialmente el operador lógico de precedencia más baja en los selectores, por lo que debe usarlo.a.c,.b.c
.fuente
Todavía no, pero existe la función experimental de
:matches()
pseudo-clase que hace exactamente eso:Puedes encontrar más información aquí y aquí . Actualmente, la mayoría de los navegadores admiten su versión inicial
:any()
, que funciona de la misma manera, pero será reemplazada por:matches()
. Solo tenemos que esperar un poco más antes de usar esto en todas partes (seguramente lo haré).fuente
:-moz-any()
y:-webkit-any()
apareció mucho antes de que Mozilla lo sugiriera para los Selectores 4 (lo que lleva a su encarnación actual como:matches()
).Uncaught DOMException: Failed to execute 'querySelector' on 'Document': ':any(.a .b)' is not a valid selector.
error? 🤔Si tienes esto:
Y solo desea seleccionar los elementos que tienen
.x
y (.a
o.b
), podría escribir:pero eso es conveniente solo cuando tiene tres "subclases" y desea seleccionar dos de ellas.
Seleccionando solo una subclase (por ejemplo
.a
):.a.x
Seleccionar dos subclases (por ejemplo
.a
y.b
):.x:not(.c)
Selección de las tres subclases:
.x
fuente
a or b or c or d
es la misma quenot(not(a) and not(b) and not(c) and not(d))
'o' en realidad es solo una función de conveniencia. En teoría, debería ser posible sobrevivir sin él en todos los casos. En el caso del 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"]
. El código no es lo suficientemente limpio para la lectura pública, sin embargo, de lo contrario lo publicaría. Probé en Chrome, Safari y un teléfono Android de gama baja.No. CSS estándar no proporciona el tipo de cosas que estás buscando.
Sin embargo, es posible que desee mirar MENOS y SASS .
Estos son dos proyectos que tienen como objetivo extender la sintaxis CSS predeterminada mediante la introducción de características adicionales, que incluyen variables, reglas anidadas y otras mejoras.
Le permiten escribir código CSS mucho más estructurado, y cualquiera de ellos seguramente resolverá su caso de uso particular.
Por supuesto, ninguno de los navegadores admite su sintaxis extendida (especialmente porque los dos proyectos tienen diferentes sintaxis y características), pero lo que hacen es proporcionar un "compilador" que convierte su código MENOS o SASS en CSS estándar, que luego puede implementar en su sitio.
fuente