CSS - Làm cách nào để tạo kiểu cho nhãn nút radio đã chọn?


139

Tôi muốn thêm kiểu vào nhãn đã chọn của nút radio:

HTML:

<div class="radio-toolbar">
 <label><input type="radio" value="all" checked>All</label>
 <label><input type="radio" value="false">Open</label>
 <label><input type="radio" value="true">Archived</label>
</div>

CSS

.radio-toolbar input[type="radio"] {display:none;}
.radio-toolbar label {
    background:Red;
    border:1px solid green;
    padding:2px 10px;
}
.radio-toolbar label + input[type="radio"]:checked { 
    background:pink !important;
}

Bất cứ ý tưởng những gì tôi đang làm sai?

Câu trả lời:


295

.radio-toolbar input[type="radio"] {
  display: none;
}

.radio-toolbar label {
  display: inline-block;
  background-color: #ddd;
  padding: 4px 11px;
  font-family: Arial;
  font-size: 16px;
  cursor: pointer;
}

.radio-toolbar input[type="radio"]:checked+label {
  background-color: #bbb;
}
<div class="radio-toolbar">
  <input type="radio" id="radio1" name="radios" value="all" checked>
  <label for="radio1">All</label>

  <input type="radio" id="radio2" name="radios" value="false">
  <label for="radio2">Open</label>

  <input type="radio" id="radio3" name="radios" value="true">
  <label for="radio3">Archived</label>
</div>

Trước hết, bạn có thể muốn thêm namethuộc tính trên các nút radio. Mặt khác, chúng không phải là một phần của cùng một nhóm và có thể kiểm tra nhiều nút radio.

Ngoài ra, vì tôi đã đặt các nhãn là anh chị em (của các nút radio), tôi phải sử dụng các thuộc tính idforđể liên kết chúng lại với nhau.


2
@ John John Điều đó đúng. IE8 không thực hiện :checkedbộ chọn.
Vidime Vidas

Nếu tôi muốn chọn không nhập [type = "radio"] hoặc đầu vào [type = "hộp kiểm"]. Đó là cú pháp đúng để thực hiện chỉ trong một quy tắc và tránh thực hiện: input [type = "radio"], input [type = "hộp kiểm"]
fabregas88

@ fabregas88 Bạn có thể thêm một lớp CSS cho các thành phần đó và sau đó.foo { ... }
Šime Vidas

4
Bạn vừa giết truy cập bàn phím! hy vọng tất cả người dùng của bạn có thể thân. ... bây giờ, nếu bạn chỉ giữ nút radio ở đó, không sử dụng display:none;thì các trình duyệt sẽ làm cho nó hoạt động tốt với bàn phím.
GCB

1
@gcb Câu hỏi là làm thế nào để ẩn các nút radio tiêu chuẩn. Tôi đã tạo nguyên mẫu này jsbin.com/miwati/edit?html,css,output . Các nút radio được đặt hoàn toàn phía sau nhãn. Có lẽ không phải là cách tiếp cận tốt nhất mặc dù.
Vidime Vidas

29

Nếu bạn thực sự muốn đặt các hộp kiểm bên trong nhãn, hãy thử thêm thẻ span, ví dụ:

HTML

<div class="radio-toolbar">
 <label><input type="radio" value="all" checked><span>All</span></label>
 <label><input type="radio" value="false"><span>Open</span></label>
 <label><input type="radio" value="true"><span>Archived</span></label>
</div>

CSS

.radio-toolbar input[type="radio"]:checked ~ * { 
    background:pink !important;
}

Điều đó sẽ đặt nền cho tất cả anh chị em của nút radio đã chọn.


2
Tôi thích cách tiếp cận này, mặc dù tôi đã sử dụng một bộ chọn khác ('+' như được đề cập dưới đây và trong câu hỏi này vì tôi muốn tạo kiểu cho mục đã chọn. Điều này cho phép tôi không lo lắng về các forthuộc tính.
brichins

6

Bạn đang sử dụng bộ chọn anh chị em liền kề ( +) khi các thành phần không phải là anh chị em. Nhãn là cha mẹ của đầu vào, không phải là anh chị em.

CSS không có cách nào để chọn một phần tử dựa trên hậu duệ của nó (cũng không có gì theo sau nó).

Bạn sẽ cần tìm đến JavaScript để giải quyết vấn đề này.

Ngoài ra, sắp xếp lại đánh dấu của bạn:

<input id="foo"><label for="foo"></label>

1

Bạn có thể thêm một khoảng vào html và css của bạn.

Đây là một ví dụ từ mã của tôi ...

HTML (JSX):

<input type="radio" name="AMPM" id="radiostyle1" value="AM" checked={this.state.AMPM==="AM"} onChange={this.handleChange}/>  
<label for="radiostyle1"><span></span> am  </label>

<input type="radio" name="AMPM" id="radiostyle2" value="PM" checked={this.state.AMPM==="PM"} onChange={this.handleChange}/>
<label for="radiostyle2"><span></span> pm  </label>

CSS để làm cho nút radio tiêu chuẩn biến mất trên màn hình và chồng hình ảnh nút tùy chỉnh:

input[type="radio"] {  
    opacity:0;                                      
}

input[type="radio"] + label {
    font-size:1em;
    text-transform: uppercase;
    color: white ;  
    cursor: pointer;
    margin:auto 15px auto auto;                    
}

input[type="radio"] + label span {
    display:inline-block;
    width:30px;
    height:10px;
    margin:1px 0px 0 -30px;                       
    cursor:pointer;
    border-radius: 20%;
}


input[type="radio"] + label span {
    background-color: #FFFFFF 
}


input[type="radio"]:checked + label span{
     background-color: #660006;  
}

0

Vì hiện tại không có giải pháp CSS nào để định kiểu cha mẹ, tôi sử dụng một jQuery đơn giản ở đây để thêm một lớp vào nhãn với đầu vào được kiểm tra bên trong nó.

$(document).on("change","input", function(){
 $("label").removeClass("checkedlabel");
 if($(this).is(":checked")) $(this).closest("label").addClass("checkedlabel");
});

Đừng quên để cung cấp cho nhãn trước kiểm tra đầu vào của lớp checkedlabelquá


0

Đây là một giải pháp dễ tiếp cận

label {
  position: relative;
}

label input {
  position: absolute;
  opacity: 0;
}

label:focus-within {
  outline: 1px solid orange;
}
<div class="radio-toolbar">
  <label><input type="radio" value="all" checked>All</label>
  <label><input type="radio" value="false">Open</label>
  <label><input type="radio" value="true">Archived</label>
</div>

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.