Cela devrait être simple, mais j'ai du mal à trouver les termes de recherche.
Disons que j'ai ceci:
<div class="a c">Foo</div>
<div class="b c">Bar</div>
En CSS, comment puis-je créer un sélecteur qui correspond à quelque chose qui correspond à "(.a ou .b) et .c"?
Je sais que je pourrais faire ceci:
.a.c,.b.c {
/* CSS stuff */
}
Mais, en supposant que je vais devoir faire beaucoup ce genre de logique, avec une variété de combinaisons logiques, y a-t-il une meilleure syntaxe?
html
css
css-selectors
Josh
la source
la source
Réponses:
L'
or
opérateur CSS (,
) n'autorise pas les regroupements. Il s'agit essentiellement de l'opérateur logique de priorité la plus basse dans les sélecteurs, vous devez donc l'utiliser.a.c,.b.c
.la source
Pas encore, mais il y a la
:matches()
fonction de pseudo-classe expérimentale qui fait exactement cela:Vous pouvez trouver plus d'informations à ce sujet ici et ici . Actuellement, la plupart des navigateurs prennent en charge sa version initiale
:any()
, qui fonctionne de la même manière, mais sera remplacée par:matches()
. Nous devons juste attendre un peu plus avant de l'utiliser partout (je le ferai sûrement).la source
:-moz-any()
et est:-webkit-any()
apparu bien avant que Mozilla ne le suggère pour Selectors 4 (menant à son incarnation actuelle comme:matches()
).Uncaught DOMException: Failed to execute 'querySelector' on 'Document': ':any(.a .b)' is not a valid selector.
erreur? 🤔Si vous avez ceci:
Et vous ne voulez sélectionner que les éléments qui ont
.x
et (.a
ou.b
), vous pouvez écrire:mais ce n'est pratique que lorsque vous avez trois "sous-classes" et que vous voulez en sélectionner deux.
Sélection d'une seule sous-classe (par exemple
.a
):.a.x
Sélection de deux sous-classes (par exemple
.a
et.b
):.x:not(.c)
Sélection des trois sous-classes:
.x
la source
a or b or c or d
est la même quenot(not(a) and not(b) and not(c) and not(d))
so 'ou' n'est en fait qu'une fonction de commodité. En théorie, il devrait être possible de s'en passer dans tous les cas. Dans le cas de l'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"]
. Le code n'est pas assez propre pour une lecture publique, sinon je le posterais. J'ai testé sur chrome, safari et un téléphone Android bas de gamme.Non. Le CSS standard ne fournit pas le genre de chose que vous recherchez.
Cependant, vous voudrez peut-être vous pencher sur LESS et SASS .
Ce sont deux projets qui visent à étendre la syntaxe CSS par défaut en introduisant des fonctionnalités supplémentaires, notamment des variables, des règles imbriquées et d'autres améliorations.
Ils vous permettent d'écrire du code CSS beaucoup plus structuré, et l'un ou l'autre résoudra presque certainement votre cas d'utilisation particulier.
Bien sûr, aucun des navigateurs ne prend en charge sa syntaxe étendue (d'autant plus que les deux projets ont chacun une syntaxe et des fonctionnalités différentes), mais ils fournissent un "compilateur" qui convertit votre code LESS ou SASS en CSS standard, que vous pouvez ensuite déployer sur votre site.
la source