Gibt es ein CSS, das nicht gleich Selektor ist?

116

Gibt es so etwas wie! = (Nicht gleich) in CSS? zB habe ich folgenden Code:

input {
 ... 
 ...
}

aber für einige Eingaben muss ich dies aufheben. Ich möchte dies tun, indem ich dem Eingabe-Tag die Klasse "reset" hinzufüge, z

<input class="reset" ... />

und überspringen Sie dann einfach dieses Tag aus CSS.

Wie kann ich das machen?

Die einzige Möglichkeit, die ich sehen kann, besteht darin, dem Eingabe-Tag eine Klasse hinzuzufügen und das CSS wie folgt neu zu schreiben:

input.mod {
 ...
 ...
}
Alex Ivasyuv
quelle
Sie haben Ihre Frage beantwortet, denke ich. Fügen Sie den Stil in input.mod ein und fügen Sie die Klasse 'mod' in das gewünschte Eingabe-Tag ein.
Nazmul

Antworten:

157

In CSS3 können Sie den :not()Filter verwenden, aber noch nicht alle Browser unterstützen CSS3 vollständig. Stellen Sie daher sicher, dass Sie wissen, was Sie tun, was jetzt von allen gängigen Browsern unterstützt wird (und das schon seit einiger Zeit; dies ist eine alte Antwort ...).

Beispiel:

<input type="text" value="will be matched" />
<input type="text" value="will not be matched" class="avoidme" />
<input type="text" value="will be matched" />

und das CSS

input:not(.avoidme) { background-color: green; }

Hinweis: Diese Problemumgehung sollte nicht mehr erforderlich sein. Ich lasse es hier für den Kontext.

Wenn Sie CSS3 nicht verwenden möchten, können Sie den Stil für alle Elemente festlegen und ihn dann mit einer Klasse zurücksetzen.

input { background-color: green; }
input.avoidme { background-color: white; }
Tomas Aschan
quelle
OMG ... ich wusste, dass es existiert :) Ja, das ist es! Vielen Dank.
Alex Ivasyuv
2
Die Unterstützung fehlt hauptsächlich in IE8 (und älteren Versionen). Wenn jemand an einer
Polyfüllung
1
@ Guru: Sie können mehrere :not()Selektoren verketten: input:not(.avoidme):not(.avoidmetoo)Vermeidet Elemente mit beiden Klassen, input:not(.avoidme.andme)vermeidet Elemente mit beiden Klassen.
Tomas Aschan
1
@TomasLycken, tatsächlich ist die Verwendung mehrerer Selektoren in CSS schwierig, z. B. :not(.this.that) { }KANN funktionieren, aber wenn Sie etwas tun, wie :not(.this, .that) { }Sie hinfallen, müssen Sie sie wie folgt verketten : :not(.this):not(.that). Ich verstehe, dass Sie das wahrscheinlich wissen, ich versuche zukünftigen Lesern zu helfen :)
Can O 'Spam
1
Hinterlassen Sie hier einen Kommentar für zukünftige Leser: Der Kommentar von @SamSwift still ist immer noch korrekt, aber die Unterstützung für Listen wird (möglicherweise) in Zukunft kommen . Derzeit werden jedoch nur einzelne Selektoren im Inneren unterstützt :not().
Tomas Aschan
24

Sie können dies auch tun, indem Sie die Änderungen an der Rücksetzklasse nur in CSS zurücksetzen.

INPUT { 
    padding: 0px;
}
INPUT.reset {
    padding: 4px;
}
AvatarKava
quelle
8

CSS3 hat :not(), aber es ist noch nicht in allen Browsern implementiert. Es ist jedoch in der IE9-Plattformvorschau implementiert.

input:not(.reset) { }

http://www.w3.org/TR/css3-selectors/#negation

In der Zwischenzeit müssen Sie sich an die altmodischen Methoden halten.

Andy E.
quelle
6

Sie können dies auch erreichen, indem Sie auf ein Attribut wie das folgende abzielen:

input:not([type=checkbox]){ width:100%; }

In diesem Fall haben alle Eingaben, die nicht vom Typ "Kontrollkästchen" sind, eine Breite von 100%.

Dylan Auty
quelle
4

Interessanterweise habe ich dies gerade für die Auswahl des DOM-Elements mit JQuery versucht und es funktioniert! :) :)

$("input[class!='bad_class']");

Diese Seite hat 168 Divs, die keine Klasse 'Kommentar-Kopie' haben.

$("div[class!='comment-copy']").length => 168
$("div[class!='.comment-copy']").length => 168
Naveed
quelle
11
[attr!="value"]ist ein jQuery-only- Selektor api.jquery.com/attribute-not-equal-selector
xec
Was hat das mit CSS zu tun?
Devlin Carnate
@devlincarnate "CSS" -Selektoren sind in JS ( ca. 2013 ) eingedrungen, sodass die Leute danach suchen.
Nick T
0

Anstelle von class = "reset" können Sie die Logik umkehren, indem Sie class = "valid" haben. Sie können dies standardmäßig hinzufügen und die Klasse entfernen, um den Stil zurückzusetzen.

Also aus deinem Beispiel und Tomas '

input.valid {
 ... 
 ...
}

und

<input type="text" value="will be matched" class="valid"/>
<input type="text" value="will not be matched" />
<input type="text" value="will be matched" class="valid"/>
Qazzian
quelle
2
Ich denke, die ganze Idee, durch Anwenden auf eine Klasse "zurücksetzen" zu können, war, dass die Anzahl der Elemente, die nicht den Standardstil haben sollten, die Anzahl der Elemente, die sollte, weit überstieg, so dass das OP keine Klasse anwenden wollte die Mehrheit der Elemente.
Tomas Aschan