Usa le immagini invece dei pulsanti di opzione


167

Se ho un gruppo radio con pulsanti:

Immagine 1

... come posso mostrare solo le immagini nell'opzione di selezione invece dei pulsanti, ad es

inserisci qui la descrizione dell'immagine


Possiamo vedere un collegamento live o un jsFiddle per il tuo codice?
Nitesh,

3
Crea un set di pulsanti di opzione e inseriscili in un div nascosto. Al clic sull'immagine, impostare quel particolare pulsante di opzione selezionato significa che alla prima immagine fare clic, impostare il primo pulsante di opzione selezionato e allo stesso modo per gli altri due. Se non hai capito, posso spiegarlo anche tramite codice.
Chiragit007,

Qui non funziona puoi suggerire stackoverflow.com/questions/42736745/…
Codice Guy

Risposte:


387
  • Avvolgere la radio e immagine in<label>
  • Nascondi pulsante di opzione (Non utilizzare display:noneo visibility:hiddenpoiché ciò influirà sull'accessibilità)
  • Puntare l'immagine accanto alla radio nascosta usando il selettore di fratelli adiacenti +

/* 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>

Non dimenticare di aggiungere una classe alle etichette e nei CSS utilizzare quella classe .


Stili e animazioni personalizzate

Ecco una versione avanzata che utilizza l' <i>elemento e lo :afterpseudo:

Radio e casella di controllo personalizzate CSS

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 per lo pseudo-selettore, penso di aver usato JavaScript in passato per verificare la selezione! Questo mi insegnerà ...
zik,

3
visibilità nascosta significa che non è possibile fare clic, e la posizione assoluta lo elimina dal flusso del documento
99 Problemi - La sintassi non è un

1
Questa è una risposta eccellente Posso aggiungere che funziona anche lo stesso type="checkbox".
Wtower,

ok questo è carino .. funziona benissimo, a quanto pare funziona anche su IE, ma in realtà non lo è. l'immagine si comporta correttamente ma quando il modulo viene inviato, non è disponibile alcuna selezione di miniature. Immagino che sto usando il nuovo IE fornito con Win 8.1. Qualche idea?
Junaid Rehman,

3
In ritardo alla festa, ma fai attenzione. Visibility:hiddennasconderà gli input dal lettore di schermo e un grande no dal punto di vista dell'accessibilità.
DPac,

100

Esempio:

Dritta! Questa soluzione è solo CSS.

Selettore di carte di credito, la MasterCard sulla demo modificata è sospesa.

Ti consiglio di sfruttare CSS3 per farlo, nascondendo il pulsante di opzione per impostazione predefinita con le regole CSS3:

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

Faccio solo un esempio qualche giorno fa.


1
Questo è stato fantastico! L'ho integrato in un modulo ASP.NET e ha funzionato come un fascino :)
Gus

Questo esempio non funziona in Firefox 49.0.2 con XUbuntu 16.04.1
Sergey Kudriavtsev

@SergeyKudriavtsev forse il codice necessita e si aggiorna (questa risposta è del 2013). Per fortuna il codice è aperto a chiunque per migliorarlo. Ci darò un'occhiata presto. Saluti.
Richard Cotrina,

Funziona bene per me in Firefox 60, Windows 10.
Trevor

Ho questo lavoro per un set di 3 faccine. Ora ho bisogno di avere più righe su un modulo, ognuna con il proprio set di faccine. Il mio problema è che quando si cambia una riga, cambiano tutte. Qualche idea su quale parte debba essere modificata per raggiungere questo obiettivo?
dave317,

19

Puoi usare CSS per questo.

HTML (solo per demo, è personalizzabile)

<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

Tieni nascosti i pulsanti di opzione e, facendo clic sulle immagini, selezionali utilizzando JavaScript e dai stile alla tua immagine in modo che appaia selezionata. Ecco il markup -

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

e 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

Basta usare una classe per nasconderne solo ... in base a 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

Ecco una semplice soluzione di interfaccia utente jQuery basata sull'esempio qui:

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

Codice modificato:

<!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 si occupa dello sfondo dell'immagine in modo da sapere quale pulsante è selezionato.

Attenzione: se si desidera impostare un pulsante su spuntato o deselezionato tramite Javascript, è necessario chiamare la funzione di aggiornamento:

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

0

Le immagini possono essere posizionate al posto dei pulsanti di opzione utilizzando gli elementi etichetta e 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>

Il pulsante di opzione deve essere nascosto,

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

L'immagine può essere fornita nel tag 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');
}

Per modificare l'immagine facendo clic sul pulsante di opzione, aggiungi lo stato selezionato al tag di input,

.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');
}

Se hai domande, fai riferimento al seguente link, come ho preso la soluzione dal blog qui sotto, http://frontendsupport.blogspot.com/2018/06/cool-radio-buttons-with-images.html


0

Ecco un esempio molto semplice

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/

Questo esempio basato su questo trucco: https://css-tricks.com/the-checkbox-hack/

L'ho provato su: Chrome, Firefox, Safari

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.