CSS - Bagaimana Menata Label Tombol Radio yang Dipilih?

146

Saya ingin menambahkan gaya ke label pilihan tombol 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;
}

Ada ide apa yang saya lakukan salah?

AnApprentice
sumber

Jawaban:

308

.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>

Pertama-tama, Anda mungkin ingin menambahkan nameatribut pada tombol radio. Jika tidak, mereka bukan bagian dari grup yang sama, dan beberapa tombol radio dapat dicentang.

Juga, karena saya menempatkan label sebagai saudara (dari tombol radio), saya harus menggunakan atribut iddan foruntuk mengaitkannya bersama.

Šime Vidas
sumber
2
@Club Itu benar. IE8 tidak menerapkan :checkedpemilih.
Šime Vidas
Jika saya tidak ingin memilih input [type = "radio"] atau input [type = "checkbox"]. Manakah sintaks yang benar untuk melakukannya hanya dalam satu aturan dan hindari melakukan: input [type = "radio"], input [type = "checkbox"]
fabregas88
@ fabregas88 Anda dapat menambahkan kelas CSS ke elemen tersebut, dan kemudian.foo { ... }
Šime Vidas
4
Anda baru saja mematikan akses keyboard! berharap semua pengguna Anda berbadan sehat. ... sekarang, jika Anda hanya menyimpan tombol radio di sana, tanpa menggunakan display:none;maka browser akan membuatnya bekerja dengan keyboard dengan baik.
gcb
1
@gcb Pertanyaannya adalah bagaimana menyembunyikan tombol radio standar. Saya telah membuat prototipe ini jsbin.com/miwati/edit?html,css,output . Tombol radio benar-benar diposisikan di belakang label. Mungkin bukan pendekatan terbaik.
Šime Vidas
30

Jika Anda benar-benar ingin meletakkan kotak centang di dalam label, coba tambahkan tag span ekstra, mis.

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;
}

Itu akan mengatur latar belakang untuk semua saudara dari tombol radio yang dipilih.

iainbeeston
sumber
2
Saya lebih suka pendekatan ini, meskipun saya menggunakan selektor yang berbeda ('+' seperti yang disebutkan di bawah dan dalam pertanyaan ini karena saya ingin memberi gaya hanya pada item yang dipilih. Ini memungkinkan saya untuk tidak mengkhawatirkan foratributnya.
brichins
6

Anda menggunakan pemilih saudara yang berdekatan ( +) jika elemen bukan saudara kandung. Label adalah induk dari input, bukan saudara kandungnya.

CSS tidak memiliki cara untuk memilih elemen berdasarkan turunannya (atau apapun yang mengikutinya).

Anda harus melihat ke JavaScript untuk menyelesaikan ini.

Atau, atur ulang markup Anda:

<input id="foo"><label for="foo"></label>
Quentin
sumber
1

Anda dapat menambahkan span ke html dan css Anda.

Ini contoh dari kode saya ...

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 untuk menghilangkan tombol radio standar di layar dan menambahkan gambar tombol kustom:

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;  
}
Praveena Janakiraman
sumber
0

Karena saat ini tidak ada solusi CSS untuk memberi gaya pada orang tua, saya menggunakan jQuery sederhana di sini untuk menambahkan kelas ke label dengan input yang dicentang di dalamnya.

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

Jangan lupa untuk memberi label pada input yang sudah diperiksa sebelumnya kelas checkedlabeljuga

Fanky
sumber
0

Inilah solusi yang dapat diakses

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>

WofWca
sumber