CSS - jak stylizować etykietę wybranych przycisków radiowych?


141

Chcę dodać styl do wybranej etykiety przycisku radiowego:

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

Jakieś pomysły, co robię źle?

Odpowiedzi:


296

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

Przede wszystkim prawdopodobnie chcesz dodać nameatrybut do przycisków opcji. W przeciwnym razie nie należą do tej samej grupy i można zaznaczyć wiele przycisków opcji.

Ponadto, ponieważ umieściłem etykiety jako rodzeństwo (przycisków radiowych), musiałem użyć atrybutów idi, foraby powiązać je ze sobą.


2
@Johncl To prawda. IE8 nie implementuje :checkedselektora.
Šime Vidas

Jeśli nie chcę wybrać ani input [type = "radio"], ani input [type = "checkbox"]. Jaka jest poprawna składnia, aby zrobić to tylko w jednej regule i nie robić: input [type = "radio"], input [type = "checkbox"]
fabregas88

@ fabregas88 Możesz dodać klasę CSS do tych elementów, a następnie.foo { ... }
Šime Vidas

4
Właśnie zabiłeś dostęp do klawiatury! miej nadzieję, że wszyscy twoi użytkownicy są w stanie wytrzymać. ... teraz, jeśli po prostu zatrzymasz tam przycisk opcji, bez użycia, display:none;przeglądarki sprawią, że będzie dobrze działać z klawiaturą.
gcb

1
@gcb Pytanie brzmiało, jak ukryć standardowe przyciski opcji. Zrobiłem ten prototyp jsbin.com/miwati/edit?html,css,output . Przyciski opcji są absolutnie umieszczone za etykietami. Prawdopodobnie nie jest to jednak najlepsze podejście.
Šime Vidas

29

Jeśli naprawdę chcesz umieścić pola wyboru wewnątrz etykiety, spróbuj dodać dodatkowy tag span, np.

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

Spowoduje to ustawienie tła dla całego rodzeństwa wybranego przycisku opcji.


2
Wolałem to podejście, chociaż kiedyś inny selektor ( „+” jak wspomniano poniżej i w tej kwestii . Jak chciałem stylu tylko wybrany element To pozwoliło mi nie martwić się o foratrybutach.
brichins

6

Używasz sąsiedniego selektora rodzeństwa ( +), gdy elementy nie są rodzeństwem. Etykieta jest rodzicem wejścia, a nie rodzeństwem.

CSS nie ma możliwości wybrania elementu na podstawie jego elementów potomnych (ani niczego, co po nim następuje).

Aby rozwiązać ten problem, musisz spojrzeć na JavaScript.

Alternatywnie zmień rozmieszczenie znaczników:

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

1

Możesz dodać zakres do html i css.

Oto przykład z mojego kodu ...

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, aby standardowy przycisk opcji zniknął na ekranie i nałożył niestandardowy obraz przycisku:

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

Ponieważ obecnie nie ma rozwiązania CSS do stylizacji rodzica, używam tutaj prostego jQuery, aby dodać klasę do etykiety z zaznaczonymi danymi wejściowymi w niej.

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

Nie zapomnij podać etykietę wstępnie sprawdzane wejście w klasie checkedlabelzbyt


0

Oto dostępne rozwiązanie

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>

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.