Use imágenes en lugar de botones de radio


167

Si tengo un grupo de radio con botones:

Imagen 1

... ¿cómo puedo mostrar solo imágenes en la opción de selección en lugar de los botones, p. ej.

ingrese la descripción de la imagen aquí


¿Podemos ver un enlace en vivo o un jsFiddle para su código?
Nitesh

3
Cree un conjunto de botones de radio y colóquelos en un div oculto. Al hacer clic en la imagen, configure ese botón de radio en particular marcado significa en la primera imagen, haga clic en configurar su primer botón de radio marcado y de manera similar para los otros dos. Si no lo consiguió, también puedo explicarlo a través del código.
Chiragit007

No funciona aquí, ¿puede sugerir stackoverflow.com/questions/42736745/…
Código Guy

Respuestas:


387
  • Envuelva la radio y la imagen en<label>
  • Ocultar el botón de opción (no usar display:noneo visibility:hiddenya que esto afectará la accesibilidad)
  • Apunte la imagen al lado de la radio oculta usando el selector de hermano adyacente +

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

No olvide agregar una clase a sus etiquetas y en CSS use esa clase en su lugar.


Estilos personalizados y animaciones

Aquí hay una versión avanzada que usa el <i>elemento y el :afterpseudo:

Radio personalizada CSS y casilla de verificación

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 para el pseudo selector, creo que he usado JavaScript en el pasado para verificar si se seleccionó! Eso me enseñará ...
zik

3
la visibilidad oculta significa que no se puede hacer clic, y la posición absoluta lo saca del flujo de documentos
99 Problemas - La sintaxis no es una

1
Esta es una excelente respuesta. ¿Puedo agregar que también funciona con type="checkbox"lo mismo?
Wtower

ok esto es bueno ... funciona muy bien, aparentemente también funciona en IE, pero en realidad no lo es. la imagen se comporta correctamente pero cuando se envía el formulario, no hay selección de miniaturas. Supongo que estoy usando el nuevo IE que viene con Win 8.1. ¿Alguna idea?
Junaid Rehman

3
Tarde a la fiesta, pero ten cuidado con esto. Visibility:hiddenocultará las entradas del lector de pantalla y un gran no no desde el punto de vista de accesibilidad.
DPac

100

Ejemplo:

¡Aviso! Esta solución es solo CSS.

Selector de tarjeta de crédito, la tarjeta MasterCard en la demostración modificada está suspendida.

Le recomiendo que aproveche CSS3 para hacerlo, ocultando el botón de opción de entrada por defecto con las reglas CSS3:

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

Acabo de hacer un ejemplo hace unos días.


1
Esto fue genial! Lo integré a un formulario ASP.NET y funcionó
Gus

Este ejemplo no funciona en Firefox 49.0.2 bajo XUbuntu 16.04.1
Sergey Kudriavtsev

@SergeyKudriavtsev tal vez el código necesita y se actualiza (esta respuesta es de 2013). Afortunadamente, el código está abierto para que cualquiera pueda mejorarlo. Lo examinaré pronto. Salud.
Richard Cotrina

Funciona bien para mí en Firefox 60, Windows 10.
Trevor

Tengo esto trabajando para un conjunto de 3 caras sonrientes. Ahora necesito tener varias filas en una forma, cada una con su propio conjunto de caras sonrientes. Mi problema es que cuando se cambia una fila, todas cambian. ¿Alguna idea de qué parte necesita ser modificada para lograr esto?
dave317

19

Puedes usar CSS para eso.

HTML (solo para demostración, es personalizable)

<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

Mantenga los botones de opción ocultos y, al hacer clic en las imágenes, selecciónelas con JavaScript y aplique estilo a su imagen para que se vea como seleccionada. Aquí está el marcado:

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

y 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

Simplemente usando una clase para ocultar solo algunos ... basado en 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

Aquí hay una solución simple de jQuery UI basada en el ejemplo aquí:

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

Código modificado:

<!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 se encarga del fondo de la imagen para que sepa qué botón está marcado.

Cuidado: si desea configurar un botón para marcar o desmarcar a través de Javascript, debe llamar a la función de actualización:

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

0

Las imágenes se pueden colocar en lugar de botones de radio mediante el uso de elementos de etiqueta y 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>

El botón de radio debe estar oculto,

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

La imagen se puede dar en la etiqueta 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');
}

Para cambiar la imagen al hacer clic en el botón de opción, agregue el estado marcado a la etiqueta de entrada,

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

Si tiene alguna consulta, consulte el siguiente enlace. Como he tomado una solución del siguiente blog, http://frontendsupport.blogspot.com/2018/06/cool-radio-buttons-with-images.html


0

Aquí hay un ejemplo muy simple

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>

Demostración: http://jsfiddle.net/La8wQ/2471/

Este ejemplo basado en este truco: https://css-tricks.com/the-checkbox-hack/

Lo probé en: Chrome, Firefox, Safari

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.