859 Stimmen

Kann die Pseudoklasse :not() mehrere Argumente haben?

Ich versuche zu wählen input Elemente von allen type s außer radio y checkbox .

Viele Leute haben gezeigt, dass man mehrere Argumente in :not sondern mit type scheint nicht zu funktionieren, egal wie ich es versuche.

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

Irgendwelche Ideen?

25 Stimmen

"Viele Leute haben gezeigt, dass man mehrere Argumente in :not einfügen kann." Entweder haben diese Leute einen bestimmten Artikel zitiert, auf den häufig verwiesen wird, der aber schwer irreführend ist, oder sie haben über jQuery und nicht über CSS gesprochen. Beachten Sie, dass der angegebene Selektor tatsächlich in jQuery gültig ist, aber nicht in CSS. Ich habe ein Q&A geschrieben, in dem die Unterschiede beschrieben werden: stackoverflow.com/questions/10711730/ (in der Antwort wird dieser Artikel auch am Rande erwähnt)

13 Stimmen

Herzlichen Glückwunsch! Sie haben erfolgreich gültiges CSS4.0 in Ihrem obigen Beispiel geschrieben, 2 Jahre bevor die offizielle Ausgabe herauskam.

2 Stimmen

@Jack Giffin: Auf welche "offizielle Ausgabe" beziehen Sie sich? Diese Frage ist nur 5 Monate älter als die FPWD von selectors-4, und die Spezifikation ist noch lange nicht fertig: w3.org/TR/2011/WD-selectors4-20110929/#negation Und sie ist älter als die erste Umsetzung durch 4 und ein halbes Jahr : stackoverflow.com/questions/35993727/

1699voto

Felix Kling Punkte 751464

Warum :nicht einfach zwei verwenden :not :

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

<em>Ja, das ist beabsichtigt</em>

10 Stimmen

Dies hat eine hohe Spezifität.

103 Stimmen

Für diejenigen, die den Humor nicht verstehen: Er sagte "Warum nicht..." mit dem : Charakter.

0 Stimmen

Können wir das für Eltern tun? z.B. h1:not(body.home &) ?

61voto

Pieter Meiresone Punkte 1648

Ab CSS Selectors 4 wird die Verwendung mehrerer Argumente in der :not Selektor möglich wird ( siehe hier ).

In CSS3 lässt der Selektor :not nur 1 Selektor als Argument zu. In Selektoren der Stufe 4 kann er eine Selektorliste als Argument verwenden.

Beispiel:

/* 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;
}

Leider ist die Browserunterstützung ziemlich neu .

8 Stimmen

Denken Sie daran, dass es sich um CSS Selectors Level 4 handelt, nicht um CSS 4, denn so etwas wie CSS 4 gibt es nicht und wird es wahrscheinlich auch nie geben.

5 Stimmen

Sie funktioniert jetzt in allen gängigen Browsern. Dies sollte die akzeptierte Antwort ab 2021 sein.

1 Stimmen

@dreamLo wohl ab Juni 2022, wenn der IE offiziell abgeschafft wird.

53voto

Daniel Tonon Punkte 7885

Wenn Sie SASS in Ihrem Projekt verwenden, habe ich dieses Mixin erstellt, damit es so funktioniert, wie wir es alle wollen:

@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;
    }
}

Es kann auf 2 Arten verwendet werden:

Option 1: Auflistung der ignorierten Elemente inline

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

Option 2: zuerst die ignorierten Elemente in einer Variablen auflisten

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

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

Ausgegebenes CSS für beide Optionen

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

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

10 Stimmen

Ist das nicht in etwa so, als würde man einen Holzfäller bitten, stattdessen in den Baumarkt zu gehen, um sein Holz zu holen?

0 Stimmen

Was? Sie würden also lieber .selector:not(.one):not(.two):not(.three):not(.four) { ... } als .selector { @include not('.one','.two','.three','.four') { ... } } ?

2 Stimmen

Was die Effizienz betrifft: ja. Viel weniger ' Zeichen und imo effizienteren Code.

10voto

eatCasserole Punkte 109

Ich hatte einige Probleme damit, und die Methode "X:not():not()" hat bei mir nicht funktioniert.

Ich habe schließlich zu dieser Strategie gegriffen:

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

Es macht nicht annähernd so viel Spaß, aber für mich hat es funktioniert, als :not() kampflustig war. Es ist nicht ideal, aber es ist solide.

6voto

Daniel Tonon Punkte 7885

Wenn Sie Installieren Sie das Plugin "cssnext" für Post-CSS können Sie ohne Bedenken die Syntax verwenden, die Sie jetzt verwenden möchten.

Die Verwendung von cssnext wird dies ändern:

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

Hier hinein:

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

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

0 Stimmen

Würde gerne dem Link folgen und das hier beworbene "Plugin" kaufen, aber (un)glücklicherweise scheint die Zielseite nicht mehr verfügbar zu sein.

0 Stimmen

Danke für den Hinweis, dass der Link defekt war. CSS Next hat seine URL geändert, seit ich meine Antwort gepostet habe. Ich habe die Links jetzt korrigiert. Du hättest aber nicht so frech sein müssen. Es handelt sich um ein kostenloses Open-Source-Plugin für Post-CSS. Wären Sie auch so frech, wenn ich einen Link zu etwas wie Lodash oder Bootstrap gepostet hätte?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X