Existe-t-il un sélecteur CSS not equals?

116

Y a-t-il quelque chose comme! = (Différent) dans CSS? par exemple, j'ai le code suivant:

input {
 ... 
 ...
}

mais pour certaines entrées, je dois annuler cela. Je voudrais faire cela en ajoutant la classe "reset" à la balise d'entrée, par exemple

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

puis ignorez simplement cette balise de CSS.

Comment puis-je faire ça?

La seule façon dont je peux voir serait d'ajouter une classe à la balise d'entrée et de réécrire le CSS comme suit:

input.mod {
 ...
 ...
}
Alex Ivasyuv
la source
Vous avez répondu à votre question, je pense. Mettez le style dans input.mod et ajoutez la classe 'mod' dans la balise d'entrée souhaitée.
Nazmul

Réponses:

157

Dans CSS3, vous pouvez utiliser le :not()filtre, mais tous les navigateurs ne prennent pas encore totalement en charge CSS3, alors assurez-vous de savoir ce que vous faites, ce qui est maintenant pris en charge par tous les principaux navigateurs (et ce depuis un certain temps; c'est une vieille réponse ...).

Exemple:

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

et le CSS

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

Remarque: cette solution de contournement ne devrait plus être nécessaire; Je le laisse ici pour le contexte.

Si vous ne souhaitez pas utiliser CSS3, vous pouvez définir le style sur tous les éléments, puis le réinitialiser avec une classe.

input { background-color: green; }
input.avoidme { background-color: white; }
Tomas Aschan
la source
OMG ... je savais que ça existait :) Ouais, ça l'est! Merci.
Alex Ivasyuv
2
Le support manque principalement d'IE8 (et d'anciennes versions). Si quelqu'un est intéressé par un polyfill: selectivizr.com
franzlorenzon
1
@Guru: Vous pouvez enchaîner plusieurs :not()sélecteurs: input:not(.avoidme):not(.avoidmetoo)évitera les éléments avec l'une ou l'autre classe, input:not(.avoidme.andme)évitera les éléments avec les deux classes.
Tomas Aschan
1
@TomasLycken, en fait, l' utilisation de plusieurs sélecteurs est une question délicate en CSS, par exemple le :not(.this.that) { }travail peut, mais si vous faites quelque chose comme :not(.this, .that) { }vous allez tomber vers le bas, vous devez les daisy chain tels que: :not(.this):not(.that). Je comprends que vous le savez probablement, j'essaie d'aider les futurs lecteurs :)
Can O 'Spam
1
Laisser un commentaire ici pour les futurs lecteurs: le commentaire de @SamSwift 웃 est toujours exact, mais le support des listes arrive (peut-être) dans le futur . Pour l'instant, cependant, seuls les sélecteurs uniques sont pris en charge à l'intérieur :not().
Tomas Aschan
24

Vous pouvez également le faire en "annulant" les modifications de la classe de réinitialisation uniquement en CSS.

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

CSS3 l'a fait :not(), mais il n'est pas encore implémenté dans tous les navigateurs. Cependant, il est implémenté dans l'aperçu de la plate-forme IE9.

input:not(.reset) { }

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

En attendant, vous devrez vous en tenir aux méthodes à l'ancienne.

Andy E
la source
6

Vous pouvez également aborder cela en ciblant un attribut comme celui-ci:

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

Dans ce cas, toutes les entrées qui ne sont pas de type «case à cocher» auront une largeur de 100%.

Dylan Auty
la source
4

Intéressant vient d'essayer ceci pour sélectionner l'élément DOM en utilisant JQuery et cela fonctionne! :)

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

Cette page contient 168 divs qui n'ont pas de classe 'comment-copy'

$("div[class!='comment-copy']").length => 168
$("div[class!='.comment-copy']").length => 168
Naveed
la source
11
[attr!="value"]est un sélecteur jQuery uniquement api.jquery.com/attribute-not-equal-selector
xec
Qu'est-ce que cela a à voir avec CSS?
devlin carnate
@devlincarnate Les sélecteurs "CSS" ont saigné dans JS ( vers 2013 ) afin que les gens le recherchent.
Nick T
0

au lieu de class = "reset", vous pouvez inverser la logique en ayant class = "valid". Vous pouvez l'ajouter par défaut et supprimer la classe pour réinitialiser le style.

Donc à partir de votre exemple et de celui de Tomas

input.valid {
 ... 
 ...
}

et

<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
la source
2
Je pense que l'idée même de pouvoir "réinitialiser" en appliquant à une classe était que le nombre d'éléments qui ne devraient pas avoir le style par défaut dépassait largement ceux qui le devraient, donc l'OP ne voulait appliquer aucune classe à la majorité des éléments.
Tomas Aschan