Lớp giả: not () giả có thể có nhiều đối số không?


746

Tôi đang cố gắng chọn inputcác yếu tố của tất cả typengoại trừ radiocheckbox.

Nhiều người đã chỉ ra rằng bạn có thể đưa nhiều đối số vào :not, nhưng sử dụng typedường như không hoạt động dù sao tôi cũng thử.

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

Có ý kiến ​​gì không?


24
"Nhiều người đã chỉ ra rằng bạn có thể đưa nhiều đối số vào: không" Hoặc là những người đó đã trích dẫn một bài viết nào đó được tham chiếu phổ biến nhưng gây hiểu lầm nghiêm trọng hoặc họ đang nói về jQuery, không phải CSS. Lưu ý rằng bộ chọn đã cho thực tế là hợp lệ trong jQuery, nhưng không phải trong CSS. Tôi đã viết một câu hỏi và trả lời chi tiết về sự khác biệt: stackoverflow.com/questions/10711730/ (câu trả lời cũng đề cập đến bài viết đó ở bên cạnh)
BoltClock

10
Xin chúc mừng! Bạn đã viết thành công CSS4.0 hợp lệ trong ví dụ của bạn trên 2 năm trước khi phiên bản chính thức ra mắt.
Jack Giffin

1
@Jack Giffin: "Phiên bản chính thức" mà bạn đang đề cập đến là gì? Câu hỏi này chỉ có trước ngày FPWD của bộ chọn-4 trước 5 tháng và thông số kỹ thuật vẫn chưa hoàn thành: w3.org/TR/2011/WD-selector4-20110929/#negation Và trước ngày triển khai đầu tiên 4 năm rưỡi : stackoverflow.com/questions/35993727/iêu
BoltClock

Câu trả lời:


1537

Tại sao: không chỉ sử dụng hai :not:

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

Vâng, đó là cố ý


4
Điều này có tính đặc hiệu cao.
Hủy bỏ

63
Đối với những người không có được sự hài hước: anh ấy nói "Tại sao không ..." với :nhân vật.
totymedli 8/12/2015

11
Như một lưu ý phụ, nếu bạn làm một cái gì đó giống như input:not('.c1'), input:not('c2')bạn kết thúc với một tình huống "và" trong đó cả hai lớp sẽ phải ở đầu vào cho nó khớp.
Cloudkiller

3
@BoltClock Trì hoãn, nhưng, do đó, mong muốn cho :not([attr],[attr])định dạng CSV cũng vậy :-P
TylerH

3
@Cloudkiller không có điều đó sẽ chọn bất kỳ yếu tố đầu vào nào -> "đầu vào mà không có lớp c1 HOẶC đầu vào mà không có lớp c2"
David Callanan

48

Nếu bạn đang sử dụng SASS trong dự án của mình, tôi đã tạo ra mixin này để làm cho nó hoạt động theo cách mà tất cả chúng ta muốn nó:

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

nó có thể được sử dụng theo 2 cách:

Tùy chọn 1: liệt kê các mục bị bỏ qua nội tuyến

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

Tùy chọn 2: liệt kê các mục bị bỏ qua trong một biến đầu tiên

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

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

CSS xuất ra cho một trong hai tùy chọn

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

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

6
Chẳng phải điều đó giống như yêu cầu một người thợ xẻ gỗ đi đến cửa hàng phần cứng thay vào đó để lấy gỗ của anh ta sao?
osirisgothra

Gì? vì vậy bạn thà viết .selector: not (.one): not (.two): not (.three): not (.four) {...} than .selector {@include not ('. one', ' .hai ba bốn') { ... } } ?
Daniel Tonon

2
Về mặt hiệu quả: có. Cách ít 'ký tự và mã imo hiệu quả hơn.
Daan

:not()= 6 ký tự cho mỗi mục; '',= 3 ký tự cho mỗi mục. @includenên được gán cho một phím nóng để tôi sẽ tính đó là một ký tự (về cách gõ nó). Về mặt kỹ thuật tôi không nghĩ bạn thậm chí cần sử dụng các dấu ngoặc đơn trong danh sách nếu bạn ghét chúng nhiều như vậy. Mặc dù vậy, chúng giúp ngăn chặn các biên tập viên. Dựa vào đó, tôi vẫn nghĩ rằng cách của tôi là cách viết hiệu quả hơn.
Daniel Tonon

2
@DaanHeskes cũng viết rằng tất cả các trường hợp: not () không cho phép bạn sử dụng một biến để liệt kê chúng.
plong0

30

Bắt đầu từ CSS Selector 4 bằng cách sử dụng nhiều đối số trong :notbộ chọn trở nên khả thi ( xem tại đây ).

Trong CSS3, bộ chọn: not chỉ cho phép 1 bộ chọn làm đối số. Trong bộ chọn mức 4, nó có thể lấy danh sách bộ chọn làm đối số.

Thí dụ:

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

Thật không may, hỗ trợ trình duyệt bị hạn chế . Hiện tại, nó chỉ hoạt động trong Safari.


3
theo caniuse.com , nó vẫn chỉ được Safari hỗ trợ
slanden

8
Hãy ghi nhớ CSS Selector Cấp 4, không phải CSS 4, không có thứ gì như CSS 4 và có lẽ nó sẽ không bao giờ tồn tại.
Edu Ruiz

8

Tôi đã gặp một số rắc rối với điều này và phương thức "X: not (): not ()" không hiệu quả với tôi.

Cuối cùng tôi đã dùng đến chiến lược này:

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

Nó gần như không vui, nhưng nó hoạt động với tôi khi: không () đang tỏ ra hăng hái. Nó không lý tưởng, nhưng nó vững chắc.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.