DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!
Die CSS-Eigenschaft :not() ist eine Negations-Pseudoklasse und akzeptiert einen einfachen Selektor oder eine Selektorliste als Argument. Sie wählt Elemente aus, die nicht durch das Argument repräsentiert werden. Das übergebene Argument darf keine zusätzlichen Selektoren oder Pseudo-Element-Selektoren enthalten.
Die Möglichkeit, eine Liste von Selektoren als Argument zu verwenden, gilt als experimentell, obwohl die Unterstützung zum Zeitpunkt des Schreibens wächst, einschließlich Safari (seit 2015), Firefox (seit Dezember 2020) und Chrome (seit Januar 2021).
/* the X argument can be replaced with any simple selectors */
:not(X) {
property: value;
}
In diesem Beispiel haben wir eine unsortierte Liste mit einer einzigen Klasse auf dem <li>
<ul>
<li></li>
<li class="different"></li>
<li></li>
</ul>
Unser CSS würde alle <li> -Elemente auswählen, mit Ausnahme derjenigen mit der Klasse .different.
/* Style everything but the .different class */
li:not(.different) {
font-size: 3em;
}
Sie könnten dasselbe auch mit Pseudoklassen tun, die als einfacher Selektor gelten.
p:not(:nth-child(2n+1)) {
font-size: 3em;
}
Wenn wir jedoch einen Pseudo-Element-Selektor als Argument verwenden, wird dies nicht das erwartete Ergebnis liefern.
:not(::first-line) { /* ::first-line is a pseudo element selector and not a simple selector */
color: white;
}
Komplexe Selektoren
Diese sind neuer als die grundlegenden :not()-Selektoren.
/* select all <p>s that are not descendants of <article> */
p:not(article *) {
}
Das kann mit etwas mehr Verschachtelung schon ein wenig verwirrend werden. Zum Beispiel
h2:not(:where(article *, section *)) {
...
}
/*
<article>
<h2> No match! </h2>
</article>
<section>
<h2> No Match! </h2>
</section>
<aside>
<h2> Match! </h2>
</aside>
*/
Visuelles Beispiel

:not()Spezifität
Die Spezifität der :not-Pseudoklasse entspricht der Spezifität ihres Arguments. Die :not()-Pseudoklasse fügt der Selektorspezifität keine Punkte hinzu, im Gegensatz zu anderen Pseudoklassen.
Negationen dürfen nicht verschachtelt werden, daher ist :not(:not(...)) niemals erlaubt. Autoren sollten auch beachten, dass Pseudo-Elemente nicht als einfacher Selektor gelten und daher nicht als Argument für :not(X) gültig sind. Seien Sie vorsichtig bei der Verwendung von Attributselektoren, da einige nicht so weit verbreitet unterstützt werden wie andere. Das Verketten von :not-Selektoren mit anderen :not-Selektoren ist zulässig.
Browser-Unterstützung
Die :not()-Pseudoklasse wurde in der CSS Selectors Level 4 Spezifikation aktualisiert, um eine Argumentliste zu erlauben. In CSS Selectors Level 3 konnte sie nur einen einzelnen einfachen Selektor akzeptieren. Daher ist die Browserunterstützung zwischen den Entwürfen von Level 3 und Level 4 etwas geteilt.
Einfache Selektoren
| IE | Edge | Firefox | Chrome | Safari | Opera |
|---|---|---|---|---|---|
| 9+ | Alle | Alle | Alle | 12.1+ | Alle |
| Android Chrome | Android Firefox | Android Browser | iOS Safari | Opera Mobile |
|---|---|---|---|---|
| Alle | Alle | Alle | Alle | Alle |
Selektorlisten
Diese Browser-Support-Daten stammen von Caniuse, wo Sie weitere Details finden. Eine Zahl gibt an, dass der Browser die Funktion ab dieser Version unterstützt.
Desktop
| Chrome | Firefox | IE | Edge | Safari |
|---|---|---|---|---|
| 88 | 84 | Nein | 88 | 9 |
Mobil / Tablet
| Android Chrome | Android Firefox | Android | iOS Safari |
|---|---|---|---|
| 127 | 127 | 127 | 9.0-9.2 |
Danke für die Abdeckung des :not()-Selektors, und wie immer mit nützlichen Beispielen!
Ich möchte jedoch darauf hinweisen, dass das im Bild dargestellte Beispiel von
p:not(:nth-child(2n+1))etwas mehrdeutig und möglicherweise irreführend ist, zumindest ohne ausdrücklichen Bezug. Das Beispiel stimmt, wenn man sich Ihre Demoseite ansieht, wo das erste Kind des<div class="f">-Blocks ein<header>-Element ist, aber jeder, der die Demoseite nicht sieht, wird wahrscheinlich erwarten, dass das zweite und vierte Element mit weißem Hintergrund ausgewählt/angezeigt werden – da der Beispielselektor wirklich sagt: wählen Sie jedes<p>-Element aus, das kein ungerades Kind ist, während das Bild genau die beiden ungeraden Elemente als ausgewählt zeigt.Sollten Sie auf dem Bild „Visuelle Darstellung der verschiedenen Verwendungszwecke von :not()“ nicht die 2. und 4. Box hervorheben?
2n+1 ist eine ungerade Zahl. Wenn Sie also sagen: :nicht(ungerade) sollte das Ergebnis sein, dass die geraden Zahlen gezählt werden.
Liege ich falsch?
Danke für den wunderbaren Artikel. Ich möchte jedoch wissen, ob es eine Möglichkeit gibt, ein einzelnes Element auf meiner HTML-Seite zu identifizieren, das die allgemeine Formatierung/CSS nicht „übernehmen“ würde? Was „nicht“ tut, ist, alle anderen Elemente zu spezifizieren und das im Argument zu „nicht“ spezifizieren. Ich möchte nur das Gegenteil.
<style>.div-class p{font-weight: bold;}
.div-class p:not(.no-style){font-weight: normal;}
</style>
<div class="div-class"><p>Dies sollte fett sein.</p>
<p class="no-style">Dies sollte nicht fett sein.</p>
</div>
Ich möchte, dass die „p“ mit der Klasse „no-style“ eine normale Schriftstärke hat. Aktuell ist es umgekehrt. Ich hoffe, ich habe mich klar ausgedrückt.
Vielen Dank,
@Pratip: verwenden Sie einfach direktes CSS
Sie wollen NICHT den Absatz mit dieser Klasse, aber Sie wollen den Absatz mit der Klasse no-style.
Eine Million Jahre später, aber Sie könnten einfach tun
p:not(.no-style) { font-weight: bold }Es ist erstaunlich, ich habe keine Ahnung, wie oft ich es verwenden werde.
Bezüglich der Gültigkeit von Klassen-Selektoren als „einfache Selektoren“ für ein not…
gelten Regex-Klassen-Selektoren als „einfach“?
Kann ich einen Selektor (mit welcher spezifischen, korrekten Syntax auch immer) wie folgt erstellen…
Beachten Sie, dass ich frage, weil diese angegebene Regel nicht funktioniert (schlägt fehl bei der SASS 3.3-Kompilierung)
Da CSS schon immer schlecht darin war, eine (ziemlich einfache) Regel-Engine zu spezifizieren, denke ich nicht… aber ich hielt es für die Frage wert.
.foo:not([class*=bar]){}; kann auch nützlich sein!
Ich wollte nur darauf hinweisen, dass
:notlaut Spezifikation tatsächlich verkettet werden kannhtml|*:not(:link):not(:visited)§6.6.7 http://www.w3.org/TR/css3-selectors/#negation
Ich benutze
Sollte es funktionieren?
Ja, es funktioniert.
.foo:not(.bar, .baz, .qux)
funktioniert nicht in CSS.
Sie verwenden wahrscheinlich SCSS/SASS, das es umwandelt in
.foo:not(.bar):not(.baz):not(.qux)
Und mein größtes Problem damit ist die Spezifität, die es jedes Mal gewinnt, wenn Sie ein :not hinzufügen.
Sie haben Recht, Bernard Skibinski!
Verwenden Sie Ihr Beispiel im einfachen Suchblog, nicht in der DB.
http://codepen.io/anon/pen/bdaaRm
Bitte entschuldigen Sie mein Englisch.
Verdammt… dieses :not-Pseudoelement wurde rückwärts erstellt…
dieses…
li::before{content:”●”}
li::before:not(.menu-item){content:none}
ist dasselbe wie…
li::before{content:”●”}
li.menu-item::before{content:none}
Ich dachte, dieses Element wäre gut gemacht… ein Beispiel unten
li::before, li::before:not(.menu-item) {content:”●”}
So müsste :not() funktionieren!
Das letzte Beispiel besagt… dass jedes li-Element {content:”●”} haben wird, außer .menu-item..
aber wir haben immer noch dasselbe, soweit ich sehen kann… Ich habe viele Wege ausprobiert, aber es hat nicht funktioniert… bitte beraten Sie mich, wenn ich falsch liege :)
Diese Regel
li::before, li::before:not(.menu-item) {content:”●”}
Sagt „Jedes li UND jedes li, das NICHT .menu-item ist, soll content ● haben“.
Ich denke, Sie wollen das
li::before:not(.menu-item) {content:”●”}
Danke für Ihre Hilfe, ich schätze das :) aber wie gesagt,
li::before:not(.menu-item) {content:”●”} (ist dasselbe wie)
li::before(.menu-item) {content:none} (und dieses ist kürzer)
Ich wollte tun, wie Sie zuerst sagten
„Jedes li UND jedes li, das NICHT .menu-item ist, soll content ● haben“
aber es funktioniert bei mir nicht…
Sehen Sie sich den Abschnitt „falsche Verwendungen“ hier an: http://callmenick.com/post/the-css-not-selector
Der :not()-Selektor funktioniert nicht bei Pseudo-Elementen wie :before. Versuchen Sie stattdessen, ihn so zu schreiben:
Das war gut, das habe ich glaube ich noch nicht probiert…
aber es hat auch nicht funktioniert, trotzdem danke :)
und schöner und einfacher Artikel übrigens!
Hallo, wie geht es Ihnen.
Mir geht es gut, danke.
Auf Wiedersehen
Ein weiterer nützlicher (besonders beim Einrichten von Standardwerten, die überschrieben werden sollen) ist :not([class]). Er formatiert das Element nur, wenn ihm überhaupt keine Klassen zugewiesen sind. :)
Etwas, das hier meiner Meinung nach übersehen wird, ist
Was ich kürzlich gelernt habe, ist, dass man durch diese Angelegenheit der „Argument-Spezifität-Vererbung“ tatsächlich in die Irre geführt werden kann
.foo:not(#bar)hat eine Spezifität von 0,1,1,0. Anders ausgedrückt haben Sie einer Klasse nun die Spezifität einer ID gegeben.
Es ist nicht *zu* wahrscheinlich, dass jemand dies tut. Ein Anwendungsfall, auf den ich heute gestoßen bin, war jedoch
Sie würden dieses Ergebnis überhaupt nicht erwarten. Zumindest ich nicht. Aber es ist passiert, weil
:not()die Spezifität *erbt*. Ich hatte also eine Regelmenge mit einer Spezifität von 0,0,2,0, die eine Regelmenge mit einer Spezifität von 0,0,1,3 überschrieb.Hier ist ein dokumentierter Beweis dafür in Aktion
http://codepen.io/paceaux/pen/mEoAxg
Die Moral der Geschichte ist: „Das Argument, das Sie in
:not()übergeben, sollte *weniger spezifisch* sein als das, womit es verkettet ist.“Ich verwende Code, der Links, die extern sind, ein Symbol hinzufügt.
Meine Frage ist
Wie ändere ich diesen Code, damit kein Link, der ein < img > umschließt, das externe Symbol anzeigt?
Dh: < a >< img >< /a >
@ ryan
Sie können das verwenden. Dies entspricht – jedem a-Tag mit einem href-Attribut, das auf „.jpg“, „.gif“, „.png“ endet. Fügen Sie einfach die gewünschten Bilddateitypen hinzu oder entfernen Sie sie.
Wie wende ich :not in folgender Situation an
Dies sollte fett sein.
Dies sollte fett sein.
Dies sollte fett sein.
Dies sollte nicht fett sein.
Ich möchte mit der Klasse .menu die gleiche Hintergrundfarbe einstellen, möchte aber gleichzeitig auch die gleiche Farbe nicht auf die Klasse .hidden-menu anwenden.
Vielen Dank,
Ich frage mich, warum
.container > *:not(.someclass:first-child){ background:red }
nicht funktioniert, während ..
.container > *:not(:first-child){ background:red }
funktioniert.
Ich habe es nur in FF versucht, aber das sollte funktionieren, oder?
Versuchen Sie container > *:not(.some class):not(:first-child), Sie sollten mit dem Verketten von Nots bessere Ergebnisse erzielen als mit dem Verketten von Selektoren innerhalb eines Nots.
Ich denke, der Selektor „:not()“ fügt Spezifität hinzu.
Das ist von der MDN-Seite 2020.
Das spiegelt sich auch im Inhalt wider. Es ist nicht so, dass die Spezifität unverändert bleibt, sondern die Spezifität wird durch die höchste Spezifität in ihrem Argument bestimmt.
Falls jemand kämpft, wie ich, hier ist ein Beispiel für Verkettung
Ich habe versucht, dies zu tun
Ich war mir nicht bewusst, dass kommagetrennte :not-Selektoren ungültig sind.
Dies sollte dem Abschnitt Spezifität des Artikels hinzugefügt werden.
Es ist gültiges CSS. Das hat mich schon früher verwirrt, aber Sie müssen wie CSS denken und es als
:not(.someClass)lesen, was technisch gesehen.anotherClasserlaubt, und dann weiter unten liest:not(.anotherClass), was.someClasserlaubt. Indem Sie es in einer Zeile kombinieren, sagen Sie „nicht .someClass UND nicht .anotherClass“, nicht das eine ODER das andere (was sich im Grunde gegenseitig aufhebt).Ein Punkt, der meiner Meinung nach selten angesprochen wird, ist die Nützlichkeit von
:not(): Sie können die ursprünglichen Stile des Elements beibehalten, deren Wert Sie möglicherweise nicht im Voraus kennen. Dies ist nützlich, wenn Sie Utility-Klassen auf Elemente anwenden, die jeden Display-Typ haben könnten.Im Grunde, anstatt dies…
…können wir stattdessen das Element ausblenden, wenn das übergeordnete Element NICHT gehovert wird, und wenn dies der Fall ist, wird die unten stehende Regel ungültig und das Element, an das sie angehängt ist, nimmt seinen normalen Anzeigewert an. Jetzt hat Ihre Tabelle nicht mehr
display:block, wie im obigen Beispiel. Ich habedisplay:blockin diesem Beispiel verwendet, da dies die häufigste Eigenschaft beim Ein-/Ausblenden eines Elements zu sein scheint (noneundblock).