Użyj obrazów zamiast przycisków opcji


167

Jeśli mam grupę radiową z przyciskami:

Zdjęcie 1

... jak mogę wyświetlać tylko obrazki w opcji zaznaczania zamiast przycisków np

wprowadź opis obrazu tutaj


Czy możemy zobaczyć link na żywo lub plik jsFiddle dla twojego kodu?
Nitesh

3
Utwórz zestaw przycisków radiowych i umieść je w ukrytym div. Po kliknięciu obrazu ustaw ten konkretny przycisk opcji zaznaczony oznacza, że ​​przy pierwszym kliknięciu obrazu ustaw pierwszy zaznaczony przycisk opcji i podobnie dla pozostałych dwóch. Jeśli nie masz, mogę również wyjaśnić za pomocą kodu.
Chiragit007

To nie działa tutaj, czy możesz zasugerować stackoverflow.com/questions/42736745/ ...
Code Guy

Odpowiedzi:


387
  • Wrap radiowy i obraz w<label>
  • Ukryj przycisk opcji (nie używaj display:nonelub visibility:hiddenponieważ wpłynie to na dostępność)
  • Wyceluj w obrazek obok ukrytego radia, używając selektora sąsiadującego rodzeństwa +

/* HIDE RADIO */
[type=radio] { 
  position: absolute;
  opacity: 0;
  width: 0;
  height: 0;
}

/* IMAGE STYLES */
[type=radio] + img {
  cursor: pointer;
}

/* CHECKED STYLES */
[type=radio]:checked + img {
  outline: 2px solid #f00;
}
<label>
  <input type="radio" name="test" value="small" checked>
  <img src="http://placehold.it/40x60/0bf/fff&text=A">
</label>

<label>
  <input type="radio" name="test" value="big">
  <img src="http://placehold.it/40x60/b0f/fff&text=B">
</label>

Nie zapomnij dodać klasy do swoich etykiet iw CSS zamiast tego użyj tej klasy .


Niestandardowe style i animacje

Oto zaawansowana wersja wykorzystująca <i>element i :afterpseudo:

Niestandardowe radio CSS i pole wyboru

body{color:#444;font:100%/1.4 sans-serif;}


/* CUSTOM RADIO & CHECKBOXES
   http://stackoverflow.com/a/17541916/383904 */
.rad,
.ckb{
  cursor: pointer;
  user-select: none;
  -webkit-user-select: none;
  -webkit-touch-callout: none;
}
.rad > input,
.ckb > input{ /* HIDE ORG RADIO & CHECKBOX */
  position: absolute;
  opacity: 0;
  width: 0;
  height: 0;
}
/* RADIO & CHECKBOX STYLES */
/* DEFAULT <i> STYLE */
.rad > i,
.ckb > i{ 
  display: inline-block;
  vertical-align: middle;
  width:  16px;
  height: 16px;
  border-radius: 50%;
  transition: 0.2s;
  box-shadow: inset 0 0 0 8px #fff;
  border: 1px solid gray;
  background: gray;
}
/* CHECKBOX OVERWRITE STYLES */
.ckb > i {
  width: 25px;
  border-radius: 3px;
}
.rad:hover > i{ /* HOVER <i> STYLE */
  box-shadow: inset 0 0 0 3px #fff;
  background: gray;
}
.rad > input:checked + i{ /* (RADIO CHECKED) <i> STYLE */
  box-shadow: inset 0 0 0 3px #fff;
  background: orange;
}
/* CHECKBOX */
.ckb > input + i:after{
  content: "";
  display: block;
  height: 12px;
  width:  12px;
  margin: 2px;
  border-radius: inherit;
  transition: inherit;
  background: gray;
}
.ckb > input:checked + i:after{ /* (RADIO CHECKED) <i> STYLE */
  margin-left: 11px;
  background:  orange;
}
<label class="rad">
  <input type="radio" name="rad1" value="a">
  <i></i> Radio 1
</label>
<label class="rad">
  <input type="radio" name="rad1" value="b" checked>
  <i></i> Radio 2
</label>

<br>

<label class="ckb">
  <input type="checkbox" name="ckb1" value="a" checked>
  <i></i> Checkbox 1
</label>
<label class="ckb">
  <input type="checkbox" name="ckb2" value="b">
  <i></i> Checkbox 2
</label>


10
+1 dla pseudo selektora, myślę, że w przeszłości używałem JavaScript do sprawdzania wybranych! To mnie nauczy ...
zik

3
Widoczność ukryta oznacza, że ​​nie można jej kliknąć, a pozycja bezwzględna usuwa ją z przepływu dokumentu
99 problemów - Składnia to nie jedna

1
To doskonała odpowiedź. Dodam, że to samo działa type="checkbox"też.
Wtower

ok to jest fajne .. działa świetnie, podobno działa też na IE, ale tak naprawdę nie jest. obraz zachowuje się poprawnie, ale po przesłaniu formularza nie ma wyboru miniatury. Myślę, że używam nowego IE, który jest dostarczany z Win 8.1. Dowolny pomysł?
Junaid Rehman

3
Spóźniony na przyjęcie, ale uważaj z tym. Visibility:hiddenukryje dane wejściowe przed czytnikiem ekranu i duże „nie” z punktu widzenia ułatwień dostępu.
DPac

100

Przykład:

Heads-up! To rozwiązanie dotyczy tylko CSS.

Selektor karty kredytowej, karta MasterCard w zmodyfikowanej wersji demonstracyjnej jest zakryta.

Zalecam skorzystanie z CSS3, aby to zrobić, ukrywając domyślny przycisk opcji wejścia za pomocą reguł CSS3:

.options input{
    margin:0;padding:0;
    -webkit-appearance:none;
       -moz-appearance:none;
            appearance:none;
}

Podaję przykład kilka dni temu.


1
To było świetne! Zintegrowałem go z formularzem ASP.NET i zadziałało jak marzenie :)
Gus

Ten przykład nie działa w przeglądarce Firefox 49.0.2 pod XUbuntu 16.04.1
Sergey Kudriavtsev

@SergeyKudriavtsev być może kod wymaga aktualizacji (ta odpowiedź pochodzi z 2013 roku). Na szczęście kod jest otwarty dla każdego, kto może go ulepszyć. Wkrótce się tym przyjrzę. Twoje zdrowie.
Richard Cotrina,

U mnie działa dobrze w przeglądarce Firefox 60, Windows 10.
Trevor

Mam to działające dla zestawu 3 buźek. Teraz muszę mieć wiele wierszy w jednym formularzu, każdy z własnym zestawem uśmiechniętych twarzy. Mój problem polega na tym, że zmiana jednego wiersza powoduje zmianę wszystkich. Jakieś pomysły, która część musi zostać zmodyfikowana, aby to osiągnąć?
dave317

19

Możesz do tego użyć CSS.

HTML (tylko do wersji demonstracyjnej, można go dostosować)

<div class="button">
    <input type="radio" name="a" value="a" id="a" />
    <label for="a">a</label>
</div>
<div class="button">
    <input type="radio" name="a" value="b" id="b" />
    <label for="b">b</label>
</div>
<div class="button">
    <input type="radio" name="a" value="c" id="c" />
    <label for="c">c</label>
</div>
...

CSS

input[type="radio"] {
    display: none;
}
input[type="radio"]:checked + label {
    border: 1px solid red;
}

jsFiddle


6

Pozostaw przyciski opcji ukryte, a po kliknięciu obrazów zaznacz je za pomocą JavaScript i nadaj swojemu obrazowi styl tak, aby wyglądał jak wybrany. Oto znaczniki -

<div id="radio-button-wrapper">
    <span class="image-radio">
        <input name="any-name" style="display:none" type="radio"/>
        <img src="...">
    </span>
    <span class="image-radio">
        <input name="any-name" style="display:none" type="radio"/>
        <img src="...">
    </span>
</div>

i JS

 $(".image-radio img").click(function(){
     $(this).prev().attr('checked',true);
 })

CSS

span.image-radio input[type="radio"]:checked + img{
    border:1px solid red;
}

4

Po prostu używając klasy, aby ukryć tylko niektóre ... na podstawie https://stackoverflow.com/a/17541916/1815624

/* HIDE RADIO */
.hiddenradio [type=radio] { 
  position: absolute;
  opacity: 0;
  width: 0;
  height: 0;
}

/* IMAGE STYLES */
.hiddenradio [type=radio] + img {
  cursor: pointer;
}

/* CHECKED STYLES */
.hiddenradio [type=radio]:checked + img {
  outline: 2px solid #f00;
}
<div class="hiddenradio">
<label>
  <input type="radio" name="test" value="small" checked>
  <img src="http://placehold.it/40x60/0bf/fff&text=A">
</label>

<label>
  <input type="radio" name="test" value="big">
  <img src="http://placehold.it/40x60/b0f/fff&text=B">
</label>
</div>

<div class="">
<label>
  <input type="radio" name="test" value="small" checked>
  <img src="http://placehold.it/40x60/0bf/fff&text=A">
</label>

<label>
  <input type="radio" name="test" value="big">
  <img src="http://placehold.it/40x60/b0f/fff&text=B">
</label>
</div>


1

Oto proste rozwiązanie interfejsu użytkownika jQuery oparte na poniższym przykładzie:

http://jqueryui.com/button/#radio

Zmodyfikowany kod:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>jQuery UI Button - Radios</title>
  <link rel="stylesheet" href="//code.jquery.com/ui/1.11.3/themes/smoothness/jquery-ui.css">
  <script src="//code.jquery.com/jquery-1.10.2.js"></script>
  <script src="//code.jquery.com/ui/1.11.3/jquery-ui.js"></script>
  <link rel="stylesheet" href="/resources/demos/style.css">
  <script>
  $(function() {
    $( "#radio" ).buttonset();
  });
  </script>
</head>
<body>

<form>
  <div id="radio">
    <input type="radio" id="radio1" name="radio"><label for="radio1"><img src="image1.gif" /></label>
    <input type="radio" id="radio2" name="radio" checked="checked"><label for="radio2"><img src="image2.gif" /></label>
    <input type="radio" id="radio3" name="radio"><label for="radio3"><img src="image3.gif" /></label>
  </div>
</form>

</body>
</html>

jQueryUI dba o tło obrazu, dzięki czemu wiesz, który przycisk jest zaznaczony.

Uwaga: jeśli chcesz ustawić przycisk tak, aby był zaznaczony lub odznaczony przez Javascript, musisz wywołać funkcję odświeżania:

        $('#radio3').prop('checked', true).button("refresh");

0

Obrazy można umieszczać w miejsce przycisków opcji za pomocą elementów label i span.

   <div class="customize-radio">
        <label>Favourite Smiley</label><br>
        <label for="hahaha">
        <input type="radio" name="smiley" id="hahaha">
        <span class="haha-img"></span>
        HAHAHA
        </label>
        <label for="kiss">
        <input type="radio" name="smiley" id="kiss">
        <span class="kiss-img"></span>
        Kiss
        </label>
        <label for="tongueOut">
        <input type="radio" name="smiley" id="tongueOut">
        <span class="tongueout-img"></span>
        TongueOut
        </label>
    </div>

Przycisk radiowy powinien być ukryty,

.customize-radio label > input[type = 'radio'] {
    visibility: hidden;
    position: absolute;
}

Obraz można podać w tagu span,

.customize-radio label > input[type = 'radio'] ~ span{
    cursor: pointer;
    width: 27px;
    height: 24px;
    display: inline-block;
    background-size: 27px 24px;
    background-repeat: no-repeat;
}
.haha-img {
    background-image: url('hahabefore.png');
}

.kiss-img{
    background-image: url('kissbefore.png');
}
.tongueout-img{
    background-image: url('tongueoutbefore.png');
}

Aby zmienić obraz po kliknięciu przycisku opcji, dodaj zaznaczony stan do tagu wejściowego,

.customize-radio label > input[type = 'radio']:checked ~ span.haha-img{
     background-image: url('haha.png');
}
.customize-radio label > input[type = 'radio']:checked ~ span.kiss-img{
    background-image: url('kiss.png');
}
.customize-radio label > input[type = 'radio']:checked ~ span.tongueout-img{
        background-image: url('tongueout.png');
}

Jeśli masz jakieś pytania, skorzystaj z następującego łącza, ponieważ znalazłem rozwiązanie z poniższego bloga, http://frontendsupport.blogspot.com/2018/06/cool-radio-buttons-with-images.html


0

Oto bardzo prosty przykład

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

input[type="radio"] + label
{
    background-image:url(http://www.clker.com/cliparts/c/q/l/t/l/B/radiobutton-unchecked-sm-md.png);
    background-size: 100px 100px;
    height: 100px;
    width: 100px;
    display:inline-block;
    padding: 0 0 0 0px;
    cursor:pointer;
}

input[type="radio"]:checked + label
{
    background-image:url(http://www.clker.com/cliparts/M/2/V/6/F/u/radiobutton-checked-sm-md.png);
}
<div>
  <input type="radio" id="shipadd1" value=1 name="address" />
  <label for="shipadd1"></label>
  value 1
</div>

<div>
  <input type="radio" id="shipadd2" value=2 name="address" />
  <label for="shipadd2"></label>
  value 2
</div>

Demo: http://jsfiddle.net/La8wQ/2471/

Ten przykład oparty na tej sztuczce: https://css-tricks.com/the-checkbox-hack/

Przetestowałem to na: Chrome, Firefox, Safari

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.