Bộ chọn CSS cho nhãn của nút radio đã kiểm tra


221

Có thể áp dụng kiểu css (3) cho nhãn của nút radio đã kiểm tra không?

Tôi có đánh dấu sau:

<input type="radio" id="rad" name="radio"/>
<label for="rad">A Label</label>

Điều tôi đã hy vọng là

label:checked { font-weight: bold; }

sẽ làm một cái gì đó, nhưng than ôi nó không (như tôi mong đợi).

Có một bộ chọn có thể đạt được loại chức năng này? Bạn có thể bao quanh với div, v.v. nếu điều đó có ích, nhưng giải pháp tốt nhất sẽ là sử dụng thuộc tính nhãn '' cho ''.

Cần lưu ý rằng tôi có thể chỉ định các trình duyệt cho ứng dụng của mình, vì vậy tốt nhất là lớp css3, v.v.

Câu trả lời:


361

thử +biểu tượng: Đó là tổ hợp anh chị em liền kề. Nó kết hợp hai chuỗi các bộ chọn đơn giản có cùng cha mẹ và cái thứ hai phải đến NGAY LẬP TỨC sau cái đầu tiên.

Như vậy:

input[type="radio"]:checked+label{ font-weight: bold; } 
 //a label that immediately follows an input of type radio that is checked 

hoạt động rất độc đáo cho đánh dấu sau:

<input id="rad1" type="radio" name="rad"/><label for="rad1">Radio 1</label>
<input id="rad2" type="radio" name="rad"/><label for="rad2">Radio 2</label>

... và nó sẽ hoạt động cho mọi cấu trúc, có hoặc không có div, v.v miễn là nhãn tuân theo đầu vào radio.

Thí dụ:

input[type="radio"]:checked+label { font-weight: bold; }
<input id="rad1" type="radio" name="rad"/><label for="rad1">Radio 1</label>
<input id="rad2" type="radio" name="rad"/><label for="rad2">Radio 2</label>


11
Có cách nào để làm điều này không, nhưng với nhãn là yếu tố trước EG:<label for="rad1">Radio 1</label><input id="rad1" type="radio" name="rad">
Nathan Koop

17
Bạn có thể sử dụng tilda ~để chọn các yếu tố anh chị em không nhất thiết phải liền kề. css-tricks.com/child-and-sibling-selector
Martin

1
Cảm ơn, điều này chỉ giúp tôi tạo ra "nút radio hình ảnh" không có JS.
KillerX

9
Điều đáng chú ý là điều này sẽ không hoạt động trong IE 8, vì :checkedbộ chọn không được hỗ trợ .
Mark Amery

2
@Martin Chỉ trong trường hợp bạn đang tự hỏi, Điều này sẽ không thực sự hoạt động trong trường hợp của bạn, vì nhãn vẫn cần phải tuân theo đầu vào. Sự khác biệt giữa '+' và '~' là nhãn có liền kề trực tiếp hay nói chung là tùy ý : nhãn có phải là thành phần tiếp theo hay chỉ là một trong các yếu tố tiếp theo .
Njord

127

Tôi biết đây là một câu hỏi cũ, nhưng nếu bạn muốn có <input>một đứa trẻ <label>thay vì tách chúng ra, đây là một cách CSS thuần túy mà bạn có thể thực hiện nó:

:checked + span { font-weight: bold; }

Sau đó, chỉ cần bọc văn bản với một <span>:

<label>
   <input type="radio" name="test" />
   <span>Radio number one</span>
</label>

Xem nó trên JSFiddle .


Thông minh. Điều này rất hữu ích khi xử lý tình huống dao cạo <label>@Html.RadioButtonFor(..) someText<label>, tôi đã ném <span>xung quanh "someText" và nó hoạt động như một lá bùa. Cảm ơn bạn!
S1r-Lanzelot

Đẹp! Không nghĩ về điều này.
Matthew Dean

Đúng thứ tôi cần! Cảm ơn.
Ryan

Điều gì nếu bạn muốn tạo kiểu: nhãn hoạt động với: đã chọn? Đây không thực sự là một giải pháp.
Maciej Krawchot

2
@MaciejKrawchot Đó không phải là giải pháp cho bạn vì trường hợp sử dụng của bạn hoàn toàn khác. Nếu bạn muốn tạo kiểu: nhãn hoạt động, bạn có thể thực hiện label:active { font-weight: bold; }. Xem: jsfiddle.net/Gbq8Z/608 (wow tôi không thể tin rằng fiddle đã bị rẽ nhánh 608 lần).
Mike

22

Tôi quên nơi tôi lần đầu tiên nhìn thấy nó được đề cập nhưng bạn thực sự có thể nhúng nhãn của bạn vào một thùng chứa ở nơi khác miễn là bạn có bộ for=thuộc tính. Vì vậy, hãy kiểm tra một mẫu trên SO:

* {
  padding: 0;
  margin: 0;
  background-color: #262626;
  color: white;
}

.radio-button {
  display: none;
}

#filter {
  display: flex;
  justify-content: center;
}

.filter-label {
  display: inline-block;
  border: 4px solid green;
  padding: 10px 20px;
  font-size: 1.4em;
  text-align: center;
  cursor: pointer;
}

main {
  clear: left;
}

.content {
  padding: 3% 10%;
  display: none;
}

h1 {
  font-size: 2em;
}

.date {
  padding: 5px 30px;
  font-style: italic;
}

.filter-label:hover {
  background-color: #505050;
}

#featured-radio:checked~#filter .featured,
#personal-radio:checked~#filter .personal,
#tech-radio:checked~#filter .tech {
  background-color: green;
}

#featured-radio:checked~main .featured {
  display: block;
}

#personal-radio:checked~main .personal {
  display: block;
}

#tech-radio:checked~main .tech {
  display: block;
}
<input type="radio" id="featured-radio" class="radio-button" name="content-filter" checked="checked">
<input type="radio" id="personal-radio" class="radio-button" name="content-filter" value="Personal">
<input type="radio" id="tech-radio" class="radio-button" name="content-filter" value="Tech">

<header id="filter">
  <label for="featured-radio" class="filter-label featured" id="feature-label">Featured</label>
  <label for="personal-radio" class="filter-label personal" id="personal-label">Personal</label>
  <label for="tech-radio" class="filter-label tech" id="tech-label">Tech</label>
</header>

<main>
  <article class="content featured tech">
    <header>
      <h1>Cool Stuff</h1>
      <h3 class="date">Today</h3>
    </header>

    <p>
      I'm showing cool stuff in this article!
    </p>
  </article>

  <article class="content personal">
    <header>
      <h1>Not As Cool</h1>
      <h3 class="date">Tuesday</h3>
    </header>

    <p>
      This stuff isn't nearly as cool for some reason :(;
    </p>
  </article>

  <article class="content tech">
    <header>
      <h1>Cool Tech Article</h1>
      <h3 class="date">Last Monday</h3>
    </header>

    <p>
      This article has awesome stuff all over it!
    </p>
  </article>

  <article class="content featured personal">
    <header>
      <h1>Cool Personal Article</h1>
      <h3 class="date">Two Fridays Ago</h3>
    </header>

    <p>
      This article talks about how I got a job at a cool startup because I rock!
    </p>
  </article>
</main>

Phù Đó là rất nhiều cho một "mẫu" nhưng tôi cảm thấy nó thực sự mang lại hiệu quả và quan điểm: chúng tôi chắc chắn có thể chọn nhãn cho một điều khiển đầu vào được kiểm tra mà không phải là anh chị em. Bí mật nằm ở việc giữ các inputthẻ một đứa trẻ chỉ là những gì chúng cần (trong trường hợp này - chỉ bodyphần tử) .

labelphần tử không thực sự sử dụng :checkedbộ chọn giả, nên các nhãn được lưu trữ trong header. Nó có thêm lợi ích là vì headerlà phần tử anh chị em, chúng ta có thể sử dụng ~bộ chọn anh chị em chung để di chuyển từ input[type=radio]:checkedphần tử DOM sang vùng headerchứa và sau đó sử dụng bộ chọn con cháu / con để truy cập vào labelchính chúng, cho phép khả năng tạo kiểu cho chúng khi chúng hộp radio / hộp kiểm tương ứng được chọn .

Chúng tôi không chỉ có thể tạo kiểu cho các nhãn mà còn tạo kiểu cho các nội dung khác có thể là hậu duệ của một thùng chứa anh chị em so với tất cả các inputs. Và bây giờ là lúc mà tất cả các bạn đang chờ đợi, JSFIDDLE ! Đến đó, chơi với nó, làm cho nó hoạt động cho bạn, tìm hiểu lý do tại sao nó hoạt động, phá vỡ nó, làm những gì bạn làm!

Hy vọng rằng tất cả có ý nghĩa và trả lời đầy đủ câu hỏi và có thể bất kỳ theo dõi nào có thể mọc lên.


2
Đây là câu trả lời cho câu hỏi này. Những cái khác trong khi chính xác là cơ bản siêu. Trong khi điều này giải quyết một cái gì đó phức tạp và thú vị hơn, người ta sẽ bị cám dỗ để lấy js cho.
thái

Câu trả lời được chấp nhận cho câu hỏi này có> 30 lần như nhiều người ủng hộ mặc dù áp đặt một giới hạn mà câu trả lời này hoàn toàn phản đối. Không giống như nhiều bài viết được thổi phồng tương tự có mục đích thông tin gây sốc, điều này thực sự mang lại yêu cầu. Công việc tuyệt vời, cảm ơn rất nhiều.
naughtilus

1
@naughtilus - câu trả lời này hoàn toàn làm hạn chế giới hạn của câu trả lời đơn giản, bởi vì nó xác định rõ ràng các kiểu cho mỗi tùy chọn. tức là Mine ràng buộc bạn phải có một quy ước cấu trúc; điều này hạn chế bạn viết css cho mỗi nút radio và kết quả.
Stephen

@morphles Simple! = "super basic": giải pháp này phức tạp, thú vị và mạnh mẽ hơn - đối với mã chính xác này; Của tôi sẽ hoạt động trên tất cả các trang sau 1 hội nghị
Stephen

1

Nếu đầu vào của bạn là một yếu tố con của labelvà bạn có nhiều nhãn, bạn có thể kết hợp thủ thuật của @ Mike với Flexbox+ order.

nhập mô tả hình ảnh ở đây

html
<label class="switchLabel">
  <input type="checkbox" class="switch"/>
  <span class="left">Left</span>
  <span class="right">Right</span>
</label>
css
label.switchLabel {
  display: flex;
  justify-content: space-between;
  width: 150px;
}
.switchLabel .left   { order: 1; }
.switchLabel .switch { order: 2; }
.switchLabel .right  { order: 3; }

/* sibling selector ~ */
.switchLabel .switch:not(:checked) ~ span.left { color: lightblue }
.switchLabel .switch:checked ~ span.right { color: lightblue }

Xem nó trên JSFiddle .

lưu ý: Bộ chọn anh chị em chỉ hoạt động trong cùng một cha mẹ. Để khắc phục điều này, bạn có thể ẩn đầu vào ở cấp cao nhất bằng cách sử dụng hack @Nathan Blair .


-1

Bạn có thể sử dụng một chút jQuery:

$('input:radio').click(function(){
    $('label#' + $(this).attr('id')).toggleClass('checkedClass'); // checkedClass is defined in your CSS
});

Bạn cần đảm bảo rằng các nút radio đã kiểm tra của bạn cũng có lớp chính xác khi tải trang.


3
Vâng ... tất nhiên có thể làm điều này thông qua javascript (khung), nhưng nó không đơn giản như nó có vẻ. Điều gì xảy ra nếu một cái gì đó khác đã kiểm tra hộp? Kịch bản nào sẽ loại bỏ lớp này nếu một đài phát thanh khác trong cùng nhóm được chọn? Nó trở nên quá phức tạp thực sự nhanh chóng. Tôi muốn sử dụng chức năng form + css tích hợp của trình duyệt bởi vì nó sẽ hoạt động mọi lúc.
Stephen

4
Công cụ chọn của bạn phải là$('label[for="' + $(this).attr('id') + '"]').toggleClass();
Wesley Murch

-3

CẬP NHẬT:

Điều này chỉ làm việc cho tôi vì html được tạo hiện tại của chúng tôi rất kỳ quặc, tạo labels cùng với radios và cung cấp cho cả hai checkedthuộc tính.

Đừng bận tâm, và những nỗ lực lớn cho Brilliand vì đã đưa nó lên!

Nếu nhãn của bạn là anh chị em của hộp kiểm (thường là trường hợp này), bạn có thể sử dụng ~bộ chọn anh chị em và label[for=your_checkbox_id]để giải quyết nó ... hoặc cung cấp cho nhãn một id nếu bạn có nhiều nhãn (như trong ví dụ này trong đó tôi sử dụng nhãn cho các nút)


Đến đây để tìm kiếm tương tự - nhưng cuối cùng đã tìm thấy câu trả lời của tôi trong các tài liệu .

một labelyếu tố với checkedthuộc tính có thể được chọn như vậy:

label[checked] {
  ...
}

Tôi biết đó là một câu hỏi cũ, nhưng có lẽ nó giúp được ai đó ngoài kia :)


5
Và làm thế nào là nhãn được cho là được kiểm tra?
Brilliand

2
Này, bắt tốt. Nó không. Rõ ràng chúng ta có một số mã khá kỳ quặc tạo nhãn cùng với các nút radio và thêm thuộc tính "đã kiểm tra" cho cả hai khi tạo html. Nhưng nó không thực sự hợp lệ ... Vì vậy, điều này là hoàn toàn không thể sử dụng được. Tôi sẽ chỉnh sửa câu trả lời, tôi không biết tại sao tôi lại nhận được những lời khen ngợi cho nó. Cảm ơn!
người họ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.