CSS3: lớp giả không được chọn


108

Tôi biết có một :checkedlớp giả CSS3 chính thức , nhưng có một :uncheckedlớp giả không và chúng có hỗ trợ cùng một trình duyệt không?

Tài liệu tham khảo của Sitepoint không đề cập đến một, tuy nhiên thông số kỹ thuật whatwg này (bất cứ điều gì đó là) thực hiện.

Tôi biết các kết quả tương tự có thể đạt được khi :checked:not()pseudo-classes được kết hợp, nhưng tôi vẫn tò mò:

input[type="checkbox"]:not(:checked) {
    /* styles */
}

Biên tập:

W3c đề xuất kỹ thuật tương tự

Một hộp kiểm không được chọn có thể được chọn bằng cách sử dụng lớp giả phủ định:

:not(:checked)

Câu trả lời:


104

:unchecked không được xác định trong thông số kỹ thuật Cấp 3 của Bộ chọn hoặc CSS UI, cũng như chưa xuất hiện trong cấp 4 của Bộ chọn.

Trên thực tế, trích dẫn từ W3C được lấy từ thông số kỹ thuật của Bộ chọn 4 . Vì Bộ chọn 4 khuyến nghị sử dụng :not(:checked), nên có thể an toàn khi cho rằng không có :uncheckedgiả tương ứng . Trình duyệt hỗ trợ :not():checkedgiống hệt nhau, vì vậy đó không phải là vấn đề.

Điều này có vẻ không nhất quán với các trạng thái :enabled:disabled, đặc biệt là vì một phần tử có thể không kích hoạt hay vô hiệu hóa (tức là ngữ nghĩa hoàn toàn không phù hợp), tuy nhiên có vẻ như không được bất kỳ lời giải thích cho sự mâu thuẫn này.

( :indeterminatekhông tính, bởi vì một phần tử tương tự có thể không được bỏ chọn, không được kiểm tra hoặc không xác định được vì ngữ nghĩa không áp dụng.)


Chỉ để thêm vào câu trả lời này rằng lựa chọn: not (: đã chọn) hoạt động hoàn hảo trên Chrome, nhưng nó không hoạt động trên IE (được thử nghiệm trên 9 và 11).
Bruno Finger

@Bruno Finger:: đã kiểm tra và: không (: đã kiểm tra) đều hoạt động trên IE, ngoại trừ cả hai đều bị ảnh hưởng như nhau bởi một lỗi trong đó việc thay đổi trạng thái đã kiểm tra không cập nhật kiểu của các phần tử đang được nhắm mục tiêu liên quan đến kiểm tra / không kiểm tra thành phần.
BoltClock

35

Tôi nghĩ bạn đang cố gắng làm phức tạp hóa mọi thứ. Một giải pháp đơn giản là chỉ tạo kiểu cho hộp kiểm của bạn theo mặc định với các kiểu không được chọn và sau đó thêm các kiểu trạng thái đã chọn.

input[type="checkbox"] {
  // Unchecked Styles
}
input[type="checkbox"]:checked {
  // Checked Styles
}

Tôi xin lỗi vì đã đưa ra một chủ đề cũ nhưng cảm thấy nó có thể sử dụng một câu trả lời tốt hơn.

CHỈNH SỬA (3/3/2016):

Thông số kỹ thuật của W3C nêu rằng đó :not(:checked)là ví dụ của chúng để chọn trạng thái không được chọn. Tuy nhiên, đây rõ ràng là trạng thái không được chọn và sẽ chỉ áp dụng các kiểu đó cho trạng thái không được chọn. Điều này rất hữu ích để thêm kiểu chỉ cần thiết ở trạng thái không được chọn và sẽ cần được xóa khỏi trạng thái đã chọn nếu được sử dụng trên input[type="checkbox"]bộ chọn. Xem ví dụ dưới đây để làm rõ.

input[type="checkbox"] {
  /* Base Styles aka unchecked */
  font-weight: 300; // Will be overwritten by :checked
  font-size: 16px; // Base styling
}
input[type="checkbox"]:not(:checked) {
  /* Explicit Unchecked Styles */
  border: 1px solid #FF0000; // Only apply border to unchecked state
}
input[type="checkbox"]:checked {
  /* Checked Styles */
  font-weight: 900; // Use a bold font when checked
}

Nếu không sử dụng :not(:checked)trong ví dụ trên, :checkedbộ chọn sẽ cần phải sử dụng a border: none;để đạt được ảnh hưởng tương tự.

Sử dụng input[type="checkbox"]tạo kiểu cho cơ sở để giảm sự trùng lặp.

Sử dụng input[type="checkbox"]:not(:checked)cho các kiểu không được chọn rõ ràng mà bạn không muốn áp dụng cho trạng thái đã chọn.


Có công dụng khác của selectors css nơi nó rất hữu ích / biểu cảm mặc dù: javascript, thử nghiệm trình duyệt tự động
nruth

2
Điều này không phải lúc nào cũng có thể. Các phần tử biểu mẫu đặc biệt nổi tiếng là không cho phép bạn hoàn nguyên chúng về giao diện mặc định của chúng thông qua các quy tắc xếp tầng. (Mặc dù lý do tại sao ai đó lại muốn từ bỏ chỉ kiểm tra hoặc chỉ đầu vào được kiểm soát giao diện tùy chỉnh cảm giác khi rời khỏi bạc hà khác là ngoài tôi.)
BoltClock

Một trường hợp khác không thể thực hiện được: Nhiều hơn 2 nút radio. Ví dụ: bạn có thể muốn một kiểu khi tùy chọn số 1 là: được chọn và kiểu khác khi bất kỳ thứ gì khác là: được chọn. Giải pháp là:not(:checked)
Navin

Nếu bạn đã muốn chỉ muốn những người cụ thể theo kiểu, tại sao không sử dụng một :first-child, :last-childhoặc :nth-childchọn kết hợp với :checked. :not(:checked)sẽ không bao gồm tình huống bạn đã chỉ định trừ khi tôi hiểu sai ý kiến ​​của bạn.
Michael Stramel

@MichaelStramel đặt thứ tự của htmls vào css? nope nhờ
inetphantom

3

Không có: lớp giả không được chọn, tuy nhiên nếu bạn sử dụng: lớp giả đã kiểm tra và bộ chọn anh chị em, bạn có thể phân biệt giữa cả hai trạng thái. Tôi tin rằng tất cả các trình duyệt mới nhất đều hỗ trợ: lớp giả đã kiểm tra, bạn có thể tìm thêm thông tin từ tài nguyên này: http://www.whatstyle.net/articles/18/pretty_form_controls_with_css

Bạn sẽ nhận được hỗ trợ trình duyệt tốt hơn với jquery ... bạn có thể sử dụng chức năng nhấp chuột để phát hiện khi nhấp chuột xảy ra và nếu nó được chọn hay không, sau đó bạn có thể thêm một lớp hoặc xóa một lớp khi cần thiết ...


-2

Cách tôi xử lý điều này là chuyển đổi Tên lớp của nhãn dựa trên một điều kiện. Bằng cách này, bạn chỉ cần một nhãn và bạn có thể có các lớp khác nhau cho các trạng thái khác nhau ... Hy vọng điều đó sẽ hữu ích!

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.