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

594

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

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

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

Любые идеи?

  • 23
    «Многие люди показали, что вы можете ввести несколько аргументов: не». Либо эти люди цитировали определенную статью, на которую часто ссылаются, но серьезно вводят в заблуждение, либо они говорили о jQuery, а не о CSS. Обратите внимание, что данный селектор действительно действителен в jQuery, но не в CSS. Я написал вопросы и ответы, подробно описывающие различия: stackoverflow.com/questions/10711730/… (ответ также упоминает эту статью на стороне)
  • 8
    Поздравляем! Вы успешно написали верный CSS4.0 в своем примере за 2 года до выхода официальной версии.
Теги:
css-selectors

5 ответов

1262
Лучший ответ

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

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

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

  • 41
    @sircapsalot: Это сработает, но не так, как вы ожидаете: он соответствует элементу, который не является обоими атрибутами, но в этом случае он все равно не имеет смысла.
  • 9
    @sircapsalot Тогда мы не сможем исключить элементы с обоими атрибутами, что иногда может оказаться очень полезным.
Показать ещё 9 комментариев
37

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

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

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

Вариант 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*/
}
  • 6
    это не то же самое, что попросить дровосека пойти в хозяйственный магазин вместо того, чтобы получить дрова?
  • 0
    Какие? поэтому лучше написать .selector: not (.one): not (.two): not (.three): not (.four) {...} чем .selector {@include not ('. one', ' .two ','. three ','. four ') {...}}?
Показать ещё 4 комментария
12

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

В CSS3: неселектор разрешает только 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.

  • 0
    В Chrome работает последняя версия (март 2018)
  • 2
    согласно caniuse.com , это все еще поддерживается только Safari
Показать ещё 2 комментария
5

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

В итоге я прибегал к этой стратегии:

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

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

0

Если вы устанавливаете плагин "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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню