Может ли псевдокласс: not () иметь несколько аргументов?

Я пытаюсь выбрать input элементы все types кроме radio и checkbox.

многие люди показали, что вы можете поместить несколько аргументов в :not, но через type Кажется, не работает, так или иначе, я пробую.

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

какие идеи?

5 ответов


почему :не просто использовать два :not:

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

Да, это намеренное


если вы используете SASS в своем проекте, я построил этот миксин, чтобы он работал так, как мы все хотим:

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

его можно использовать 2 способами:

Вариант 1: перечислите игнорируемые элементы inline

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

Вариант 2: сначала перечислите игнорируемые элементы в переменной

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

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

выведенный CSS для любого варианта

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

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

начиная с CSS 4, используя несколько аргументов в :not селектор становится возможным (посмотреть здесь).

в CSS3 селектор :not допускает только 1 селектор в качестве аргумента. В селекторах уровня 4 в качестве аргумента может использоваться список селекторов.

пример:

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

к сожалению, поддержка браузеров ограниченный. Пока он работает только в Safari.


У меня были некоторые проблемы с этим, и метод" X:not():not () " не работал для меня.

Я в конечном итоге прибегнул к этой стратегии:

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

это не так весело, но это сработало для меня, когда :not() был драчливым. Она не идеальна, но прочна.


Если вы установите плагин Cssnext Post CSS, то вы смело можете начать использовать синтаксис, который вы хотите использовать прямо сейчас.

использование cssnext превратит это:

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

в:

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

http://cssnext.io/features/#not-pseudo-class