841 votes

La pseudo-classe :not() peut-elle avoir plusieurs arguments ?

J'essaie de sélectionner input éléments de tous les type sauf radio et checkbox .

De nombreuses personnes ont montré qu'il est possible de mettre plusieurs arguments en :not mais en utilisant type ne semble pas fonctionner de toutes les façons que j'essaie.

form input:not([type="radio"], [type="checkbox"]) {
  /* css here */
}

Des idées ?

25 votes

"De nombreuses personnes ont montré qu'il est possible de mettre plusieurs arguments dans :not" Soit ces personnes citaient un certain article qui est populairement référencé mais gravement trompeur, soit elles parlaient de jQuery, pas de CSS. Notez que le sélecteur donné est en fait valide en jQuery, mais pas en CSS. J'ai écrit un Q&A détaillant les différences : stackoverflow.com/questions/10711730/ (la réponse mentionne également cet article sur le côté)

13 votes

Félicitations ! Vous avez réussi à écrire du CSS4.0 valide dans votre exemple ci-dessus 2 ans avant la sortie de l'édition officielle.

2 votes

@Jack Giffin : A quelle "édition officielle" faites-vous référence ? Cette question ne précède que de 5 mois le FPWD de selectors-4, et la spécification est toujours loin d'être achevée : w3.org/TR/2011/WD-selectors4-20110929/#negation Et il est antérieur à la première mise en œuvre par 4 ans et demi : stackoverflow.com/questions/35993727/

1671voto

Felix Kling Points 247451

Pourquoi : ne pas simplement utiliser deux :not :

input:not([type="radio"]):not([type="checkbox"])

<em>Oui, c'est intentionnel</em>

9 votes

Cela a une grande spécificité.

91 votes

Pour ceux qui ne saisissent pas l'humour : il a dit "Pourquoi pas..." avec les : caractère.

0 votes

Peut-on faire ça pour les parents ? h1:not(body.home &) ?

53voto

Dan T Points 121

Si vous utilisez SASS dans votre projet, j'ai créé ce mixin pour qu'il fonctionne comme nous le souhaitons tous :

@mixin not($ignorList...) {
    //if only a single value given
    @if (length($ignorList) == 1){
        //it is probably a list variable so set ignore list to the variable
        $ignorList: nth($ignorList,1);
    }
    //set up an empty $notOutput variable
    $notOutput: '';
    //for each item in the list
    @each $not in $ignorList {
        //generate a :not([ignored_item]) segment for each item in the ignore list and put them back to back
        $notOutput: $notOutput + ':not(#{$not})';
    }
    //output the full :not() rule including all ignored items
    &#{$notOutput} {
        @content;
    }
}

il peut être utilisé de 2 façons :

Option 1 : lister les éléments ignorés en ligne

input {
  /*non-ignored styling goes here*/
  @include not('[type="radio"]','[type="checkbox"]'){
    /*ignored styling goes here*/
  }
}

Option 2 : lister d'abord les éléments ignorés dans une variable

$ignoredItems:
  '[type="radio"]',
  '[type="checkbox"]'
;

input {
  /*non-ignored styling goes here*/
  @include not($ignoredItems){
    /*ignored styling goes here*/
  }
}

CSS en sortie pour l'une ou l'autre des options

input {
    /*non-ignored styling goes here*/
}

input:not([type="radio"]):not([type="checkbox"]) {
    /*ignored styling goes here*/
}

51voto

Pieter M. Points 138

À partir de la version 4 de CSS Selectors, l'utilisation d'arguments multiples dans la balise :not devient possible ( voir ici ).

En CSS3, le sélecteur :not n'accepte qu'un seul sélecteur comme argument. Dans les sélecteurs de niveau 4, il peut prendre une liste de sélecteurs comme argument.

Exemple :

/* In this example, all p elements will be red, except for 
   the first child and the ones with the class special. */

p:not(:first-child, .special) {
  color: red;
}

Malheureusement, le support des navigateurs est limitée . Pour l'instant, il ne fonctionne que dans Safari.

10voto

eatCasserole Points 11

J'avais quelques problèmes avec ça, et la méthode "X:not():not()" ne fonctionnait pas pour moi.

J'ai fini par recourir à cette stratégie :

INPUT {
    /* styles */
}
INPUT[type="radio"], INPUT[type="checkbox"] {
    /* styles that reset previous styles */
}

C'est loin d'être aussi amusant, mais ça a marché pour moi quand :not() était pugnace. Ce n'est pas idéal, mais c'est solide.

6voto

Dan T Points 121

Si vous installez le plugin "cssnext" Post CSS vous pouvez alors commencer à utiliser la syntaxe que vous souhaitez utiliser dès maintenant.

L'utilisation de cssnext transformera cela :

input:not([type="radio"], [type="checkbox"]) {
  /* css here */
}

Dans ça :

input:not([type="radio"]):not([type="checkbox"]) {
  /* css here */
}

https://cssnext.github.io/features/#not-pseudo-class

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X