Có bộ chọn CSS không bằng không?


116

Có cái gì đó giống như! = (Không bằng) trong CSS không? ví dụ: tôi có mã sau:

input {
 ... 
 ...
}

nhưng đối với một số đầu vào, tôi cần phải loại bỏ điều này. Tôi muốn làm điều đó bằng cách thêm lớp "đặt lại" vào thẻ đầu vào, ví dụ:

<input class="reset" ... />

và sau đó chỉ cần bỏ qua thẻ này khỏi CSS.

Làm thế nào tôi có thể làm điều đó?

Cách duy nhất tôi có thể thấy là thêm một số lớp vào thẻ đầu vào và viết lại CSS như sau:

input.mod {
 ...
 ...
}

Bạn đã trả lời câu hỏi của bạn, tôi nghĩ. Đặt kiểu vào input.mod và thêm class 'mod' vào thẻ đầu vào mong muốn.
Nazmul

Câu trả lời:


157

Trong CSS3, bạn có thể sử dụng :not()bộ lọc, nhưng không phải tất cả các trình duyệt đều hỗ trợ đầy đủ CSS3, vì vậy hãy đảm bảo rằng bạn biết mình đang làm gì , hiện đã được hỗ trợ bởi tất cả các trình duyệt chính (và đã khá lâu rồi; đây là một câu trả lời ...).

Thí dụ:

<input type="text" value="will be matched" />
<input type="text" value="will not be matched" class="avoidme" />
<input type="text" value="will be matched" />

và CSS

input:not(.avoidme) { background-color: green; }

Lưu ý: cách giải quyết này sẽ không cần thiết nữa; Tôi để nó ở đây cho ngữ cảnh.

Nếu bạn không muốn sử dụng CSS3, bạn có thể đặt kiểu trên tất cả các phần tử, sau đó đặt lại nó bằng một lớp.

input { background-color: green; }
input.avoidme { background-color: white; }

OMG ... Tôi biết rằng nó tồn tại :) Đúng vậy! Cảm ơn.
Alex Ivasyuv

2
Thiếu hỗ trợ chủ yếu từ IE8 (và các phiên bản cũ hơn). Nếu bất cứ ai đang quan tâm đến một polyfill: selectivizr.com
franzlorenzon

1
@Guru: Bạn có thể xâu chuỗi nhiều :not()bộ chọn: input:not(.avoidme):not(.avoidmetoo)sẽ tránh các phần tử với một trong hai lớp, input:not(.avoidme.andme)sẽ tránh các phần tử có cả hai lớp.
Tomas Aschan

1
@TomasLycken, trên thực tế, sử dụng nhiều bộ chọn là một trong những khó khăn trong CSS, ví dụ như :not(.this.that) { }có thể làm việc, nhưng nếu bạn làm điều gì đó như :not(.this, .that) { }bạn sẽ rơi xuống, bạn phải chuỗi daisy họ như: :not(.this):not(.that). Tôi hiểu bạn có thể biết điều này, tôi đang cố gắng để bạn đọc giúp đỡ trong tương lai :)
Can O' Spam

1
Để lại nhận xét ở đây cho những độc giả trong tương lai: Nhận xét của @SamSwift 웃 vẫn chính xác, nhưng hỗ trợ cho các danh sách (có thể) sẽ đến trong tương lai . Tuy nhiên, hiện tại, chỉ có bộ chọn duy nhất được hỗ trợ bên trong :not().
Tomas Aschan

24

Bạn cũng có thể làm điều đó bằng cách 'hoàn nguyên' các thay đổi trên lớp đặt lại chỉ trong CSS.

INPUT { 
    padding: 0px;
}
INPUT.reset {
    padding: 4px;
}

8

CSS3 có :not(), nhưng nó chưa được triển khai trên tất cả các trình duyệt. Tuy nhiên, nó được triển khai trong Bản xem trước nền tảng IE9.

input:not(.reset) { }

http://www.w3.org/TR/css3-selectors/#negation

Trong khi chờ đợi, bạn sẽ phải tuân theo các phương pháp cổ điển.


6

Bạn cũng có thể tiếp cận điều này bằng cách nhắm mục tiêu một thuộc tính như sau:

input:not([type=checkbox]){ width:100%; }

Trong trường hợp này, tất cả các đầu vào không phải là loại 'hộp kiểm' sẽ có chiều rộng là 100%.


4

Điều thú vị là vừa thử điều này để chọn phần tử DOM bằng JQuery và nó hoạt động! :)

$("input[class!='bad_class']");

Trang này có 168 div không có lớp 'comment-copy'

$("div[class!='comment-copy']").length => 168
$("div[class!='.comment-copy']").length => 168

11
[attr!="value"]là một jQuery chỉ chọn api.jquery.com/attribute-not-equal-selector
XEC

Điều này có liên quan gì đến CSS?
Devlin carnate

Bộ chọn @devlincarnate "CSS" đã được đưa vào JS ( khoảng năm 2013 ) để mọi người tìm kiếm nó.
Nick T

0

thay vì class = "reset", bạn có thể đảo ngược logic bằng cách đặt class = "valid". Bạn có thể thêm lớp này theo mặc định và xóa lớp để đặt lại kiểu.

Vì vậy, từ ví dụ của bạn và Tomas '

input.valid {
 ... 
 ...
}

<input type="text" value="will be matched" class="valid"/>
<input type="text" value="will not be matched" />
<input type="text" value="will be matched" class="valid"/>

2
Tôi nghĩ rằng toàn bộ ý tưởng về việc có thể "đặt lại" bằng cách áp dụng cho một lớp là số lượng phần tử không nên có kiểu mặc định vượt quá nhiều so với những phần tử nên có, vì vậy OP không muốn áp dụng bất kỳ lớp nào cho phần lớn các yếu tố.
Tomas Aschan
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.