Dies sollte einfach sein, aber ich habe Probleme, die Suchbegriffe dafür zu finden.
Nehmen wir an, ich habe Folgendes:
<div class="a c">Foo</div>
<div class="b c">Bar</div>
Wie kann ich in CSS einen Selektor erstellen, der mit etwas übereinstimmt, das mit "(.a oder .b) und .c" übereinstimmt?
Ich weiß, dass ich das tun kann:
.a.c,.b.c {
/* CSS stuff */
}
Aber unter der Annahme, dass ich diese Art von Logik mit einer Vielzahl von logischen Kombinationen häufig ausführen muss, gibt es eine bessere Syntax?
html
css
css-selectors
Josh
quelle
quelle
Antworten:
Nein. CSS '
or
operator (,
) erlaubt keine Gruppierungen. Es ist im Wesentlichen der logische Operator mit der niedrigsten Priorität in Selektoren, daher müssen Sie ihn verwenden.a.c,.b.c
.quelle
Noch nicht, aber es gibt die experimentelle
:matches()
Pseudoklassenfunktion, die genau das tut:Weitere Informationen dazu finden Sie hier und hier . Derzeit unterstützen die meisten Browser die ursprüngliche Version
:any()
, die auf die gleiche Weise funktioniert, jedoch durch ersetzt wird:matches()
. Wir müssen nur ein bisschen länger warten, bevor wir dies überall verwenden (ich werde es sicherlich tun).quelle
:-moz-any()
und:-webkit-any()
tauchte lange auf, bevor Mozilla es für Selectors 4 vorschlug (was zu seiner aktuellen Inkarnation als führte:matches()
).Uncaught DOMException: Failed to execute 'querySelector' on 'Document': ':any(.a .b)' is not a valid selector.
? 🤔Wenn Sie dies haben:
Und Sie möchten nur die Elemente auswählen, die
.x
und (.a
oder.b
) haben, die Sie schreiben könnten:Dies ist jedoch nur dann praktisch, wenn Sie drei "Unterklassen" haben und zwei davon auswählen möchten.
Auswahl nur einer Unterklasse (zum Beispiel
.a
):.a.x
Auswahl von zwei Unterklassen (zum Beispiel
.a
und.b
):.x:not(.c)
Auswahl aller drei Unterklassen:
.x
quelle
a or b or c or d
ist dieselbe wienot(not(a) and not(b) and not(c) and not(d))
'oder' ist eigentlich nur eine Komfortfunktion. Theoretisch sollte es in allen Fällen möglich sein, ohne auszukommen. Im Fall des 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"]
. Der Code ist noch nicht sauber genug für die öffentliche Einsicht, sonst würde ich ihn posten. Ich habe auf Chrome, Safari und einem Low-End-Android-Handy getestet.Nein. Standard-CSS bietet nicht das, wonach Sie suchen.
Möglicherweise möchten Sie jedoch WENIGER und SASS untersuchen .
Dies sind zwei Projekte, die darauf abzielen, die Standard-CSS-Syntax durch Einführung zusätzlicher Funktionen zu erweitern, darunter Variablen, verschachtelte Regeln und andere Verbesserungen.
Mit ihnen können Sie viel strukturierteren CSS-Code schreiben, und beide lösen mit ziemlicher Sicherheit Ihren speziellen Anwendungsfall.
Natürlich unterstützt keiner der Browser seine erweiterte Syntax (zumal die beiden Projekte jeweils unterschiedliche Syntax und Funktionen haben), aber sie bieten einen "Compiler", der Ihren LESS- oder SASS-Code in Standard-CSS konvertiert, was Sie dann können auf Ihrer Site bereitstellen.
quelle