CSS “và” và “hoặc”


113

Tôi đã gặp rắc rối khá lớn, vì tôi cần tính toán từ việc tạo kiểu một số kiểu đầu vào. Tôi đã có một cái gì đó như:

.registration_form_right input:not([type="radio")
{
 //Nah.
}

Nhưng tôi cũng không muốn tạo kiểu cho các hộp kiểm.

Tôi đã thử:

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

Cách sử dụng &&? Và tôi sẽ cần sử dụng ||sớm, và tôi nghĩ rằng cách sử dụng sẽ như nhau.

Cập nhật:
Tôi vẫn chưa biết cách sử dụng ||&&chính xác. Tôi không thể tìm thấy bất kỳ thứ gì trong tài liệu W3.


17
"anathematise" Rất tiếc. Bạn muốn đe dọa những người đang cố gắng tạo kiểu hộp kiểm bằng sự trừng phạt tàn nhẫn? (Bạn có thể có nghĩa là "miễn" hoặc tương tự, ví dụ: "Tôi cần phải miễn một số loại đầu vào khỏi quy tắc tạo kiểu.")
TJ Crowder

3
Chà, tôi không thể tìm thấy bản dịch tốt cho cụm động từ từ ngôn ngữ của tôi;)
Misiur

4
Tôi nghĩ @TJ Crowder có lẽ đã hiểu điều đó. Nhưng nó = D buồn cười ... đặc biệt là sự trớ trêu của lỗi chính tả của ông 'thần thánh'
David nói Khôi phục Monica

Ngram tuyệt vời , mặc dù. ; ^)
ruffin

Câu trả lời:


141

&& hoạt động bằng cách xâu chuỗi nhiều bộ chọn lại với nhau như vậy:

<div class="class1 class2"></div>

div.class1.class2
{
  /* foo */
}

Một vi dụ khac:

<input type="radio" class="class1" />

input[type="radio"].class1
{
  /* foo */
}

|| hoạt động bằng cách tách nhiều bộ chọn bằng dấu phẩy tương tự như vậy:

<div class="class1"></div>
<div class="class2"></div>

div.class1,
div.class2
{
  /* foo */
}

1
Ok, cảm ơn ánh sáng. Tôi ghét các biểu mẫu tạo kiểu, nhưng đó là nhiệm vụ của tôi và trang web không phải của tôi. Tôi sẽ áp dụng các lớp học cho đầu vào.
Misiur

5
Đây là biểu đồ hữu ích về những gì Internet Explorer hỗ trợ: msdn.microsoft.com/en-us/library/cc351024(VS.85).aspx#selectors
geofflee

12
Ai đang sử dụng IE bây giờ :)
Tarun

2
notdường như hoạt động từ IE9 trở đi (nhờ biểu đồ do @geofflee cung cấp).
SharpC

1
Chúng tôi có thực sự vẫn lo lắng về việc hỗ trợ các phiên bản IE cũ hơn vào năm 2018 không? Ngay cả Microsoft cũng không.
Bất thường

48

VÀ ( &&):

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

HOẶC ( ||):

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

Không, thất bại quá. Nó sẽ áp dụng 1 đến 2 và 2 đến 1
Misiur

@KennyTM: Nhìn kìa. Việc sử dụng dấu phẩy sẽ thực hiện một việc như sau: .registration_form_right input: not ([type = "radio"]) sẽ áp dụng cho mọi thứ bao gồm cả hộp kiểm và .registration_form_right input: not ([type = "checkbox"]) sẽ áp dụng cho mọi thứ, bao gồm radio
Misiur

@Misiur: Tất nhiên. Thứ hai dành cho trường hợp "OR" (hay còn gọi là ||). Cập nhật để làm rõ.
kennytm

1
@KennyTM: Điều Misiur đang cố gắng nói là… "||" của bạn ví dụ là đúng về mặt cú pháp, nhưng nếu bạn đơn giản hóa biểu thức, nó sẽ chỉ trở thành ".registration_form_right input" bởi vì sự kết hợp của hai bộ chọn bao gồm tất cả các đầu vào.
geofflee

@geo, @Mis: xem này, câu hỏi được hỏi "Tôi sẽ cần sử dụng || sớm", vì vậy đây là một cách để xây dựng một ||trong số các ví dụ. Tất nhiên nó sẽ trở thành .registration_form_right inputsau khi đơn giản hóa, nhưng bản chất là bạn sử dụng ,như|| . Bạn có thể sử dụng input:not([type="radio"]), input:not([name="foo"])cho một ví dụ quan trọng.
kennytm

16

Để chọn thuộc tính abcủa một Xphần tử:

X[a][b]

Để chọn thuộc tính aHOẶC bcủa một Xphần tử:

X[a],X[b]

4

Lớp :notgiả không được IE hỗ trợ. Thay vào đó, tôi muốn một thứ như thế này:

.registration_form_right input[type="text"],
.registration_form_right input[type="password"],
.registration_form_right input[type="submit"],
.registration_form_right input[type="button"] {
  ...
}

Một số trùng lặp ở đó, nhưng đó là một cái giá nhỏ để trả cho khả năng tương thích cao hơn.


2

Bằng cách nào đó, bạn có thể tái tạo hành vi của "OR" bằng cách sử dụng & và: không.

SomeElement.SomeClass [data-statement="things are getting more complex"]  :not(:not(A):not(B))     {
    /* things aren't so complex for A or B */
}

2
Xin lỗi,: not (: not) không phải là cú pháp CSS hợp lệ. Nó hoạt động với jQuery.
Serge Profafilecebook

1

Tôi đoán bạn ghét phải viết nhiều bộ chọn hơn và chia chúng bằng dấu phẩy?

.registration_form_right input:not([type="radio"]),  
.registration_form_right input:not([type="checkbox"])  
{  
}

và BTW cái này

not([type="radio" && type="checkbox"])  

đối với tôi giống như "đầu vào không có cả hai loại này" :)


2
Điều đó sẽ không hoạt động, bởi vì bộ chọn đầu tiên sẽ chọn tất cả không radio, (nhưng sẽ chọn checkbox) và bộ chọn thứ hai sẽ làm ngược lại. Sự kết hợp của cả hai sẽ chứa cả hai checkbox radio .
Eric

Ví dụ đầu tiên đó sẽ không && chúng cùng nhau, nó sẽ kích hoạt cho các đầu vào không phải là radio cho bộ chọn đầu tiên, các đầu vào VÀ không phải là hộp kiểm, có nghĩa là tất cả các đầu vào :-)
Dan F

Bạn sai rồi. Sau đó, cái đầu tiên sẽ áp dụng cho thứ hai và thứ hai, cho thứ nhất.
Misiur

1

Đề phòng nếu có ai bị kẹt như mình. Sau khi đi qua bài viết và một số hit và thử nghiệm, điều này đã làm việc cho tôi.

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

1

Một lời cảnh báo. Việc xâu notchuỗi một số bộ chọn lại với nhau làm tăng tính cụ thể của bộ chọn kết quả, khiến việc ghi đè khó hơn: về cơ bản bạn sẽ cần tìm bộ chọn có tất cả các ký hiệu và sao chép-dán nó vào bộ chọn mới của mình.

Một not(X or Y)bộ chọn sẽ rất tốt để tránh làm tăng tính cụ thể, nhưng tôi đoán chúng ta sẽ phải kết hợp các mặt đối lập, như trong câu trả lời này .

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.