Maquillando los input de tipos radio y checkbox.

Una de mis mayores obsesiones en la web son los campos de formulario. Son los elementos menos personalizables del html, ya que siempre nos obligan a utilizar javascript bien para reemplazar ese elemento o para implementar una funcionalidad que se pierde al utilizar css en un desplegable o en un campo de tipo file.

Los navegadores modernos (olvidaros de explorer) y las css avanzadas, nos permiten modificar – en este caso – y sin utilizar javascript, los input de tipo «checkbox» y «radio» con la ayuda de las etiquetas «label», pudiendo personalizarlos hasta límites inimaginables. Como siempre, el límite lo pone nuestra creatividad.

Esto lo conseguimos con esta estructura

1
2
<input id="check_01" type="checkbox" name="check_01" />
<label for="check_01">

Con una imagen similar a esta


Y estas pequeñas líneas de css

1
2
3
4
5
6
7
8
9
10
11
12
input[type=checkbox] {display: none;}
input[type=checkbox] + label {
background: #fff;
display: inline-block;
width: 16px;
height: 16px;
background: url(img/check_02.png) 0px 0px no-repeat;
text-indent: -1000em;
}
input[type=checkbox]:checked + label {
background: url(img/check_02.png) 0px -16px no-repeat;
}

Las cuales tienen una explicación muy sencilla.
input[type=checkbox] nos permite seleccionar todos los campos «input» de tipo «checkbox«.

input[type=checkbox] + label nos permite seleccionar todos los campos «input» de tipo «checkbox» y además, el elemento «label» que se encuentre a continuación. No debe haber ningún otro elemento depués del campo «input«.

input[type=checkbox]:checked + label, nos permite seleccionar todos los campos «input» de tipo «checkbox» cuyo atributo «checked» sea igual a «checked» y además, el elemento «label» que se encuentre a continuación.

De esta manera, podemos hacer cosas similares a las que he montado en un ejemplo.

[ ejemplo ] [ descargar ejemplo ]

18 comentarios.


  • 17 de marzo de 2011 a las 13:31
    Xaviju dice...
    Está muy bien, pero no funciona en versiones anteriores de CSS, como la 7.
    ¿Alguna idea?

  • 17 de marzo de 2011 a las 19:06
    cmacias dice...
    Hola Xaviju, para el resto de navegadores que no soportan estos CSS, tienes una alternativa en el javascript.

    Te paso - por si te interesa - un par de enlaces de librerías que te permiten realizar esto mismo en js.

    - http://lipidity.com/fancy-form/
    - http://www.no-margin-for-errors.com/projects/prettycheckboxes/documentation/

    Un saludo,
    Carlos.

  • 23 de agosto de 2011 a las 9:50
    marlene dice...
    muy buen ejemplo! ojalá fuera tan facil para los combos...

  • 23 de agosto de 2011 a las 13:08
    cmacias dice...
    Hola Marlene. Cierto. Ojalá para los combos fuera tan sencillo.
    De todas formas si te sirve, tienes este ejemplo https://www.cmacias.com/cambiando-el-aspecto-de-los-selectbox/ que pienso también es sencillo aunque tenga que usar algo de js

  • 18 de abril de 2012 a las 9:18
    Ana dice...
    Gracias por el aporte!
    Lo he probado en explorer y a partir del 7 funciona!!

  • 18 de abril de 2012 a las 11:12
    cmacias dice...
    Ana, un verdadero placer.

    Un saludo

  • 4 de septiembre de 2012 a las 19:02
    augalde dice...
    como crear dos input de diferente tamano a partir de loscss

  • 4 de septiembre de 2012 a las 21:49
    Carlos dice...
    Agualde, tendrías que añadirles dos nombres de clase distinto, y en función de esa clase darle un tamaño u otro.

  • 8 de octubre de 2012 a las 2:10
    asdasda@hotmail.es dice...
    Saludos Ana,

    No puede funcionar en Internet Explorer 7 ni 8 puesto que yo acabo de probar el ejemplo oficial recién descargado y no funciona en esos dos navegadores.

    En internet explorer 9 sí funciona, pero en anteriores no.

    Si tu has conseguido hacer que te funcione en 7 y 8 entonces y si no te importa explícanos que has hecho.

    Un saludo y gracias.

  • 8 de octubre de 2012 a las 7:43
    Carlos dice...
    No funciona en Explorer versiones 8 e inferiores porque las css usadas no son soportadas por estos navegadores.

    Sin embargo, si hay una forma de hacer que funcionen solo si accedemos desde un explorer 9, que es con el modo de documento en standard de ie9.

    De todas formas no deja de ser una forma "no válida", ya que es algo que no depende del programador sino del usuario que tendría que cambiar este parámetro, que por otra parte veo absurda, navegar en modo explorer 7 pero con modo de documento 9, no ?

  • 22 de noviembre de 2012 a las 23:18
    Anónimo dice...
    Muchas gracias, ha estado todo muy bien explicado y encima los diseños tienen una buena presentación.

  • 22 de noviembre de 2012 a las 23:27
    Carlos dice...
    Gracias a ti. Espero que te haya sido de utilidad :)

  • 12 de abril de 2013 a las 15:40
    kennedyperez dice...
    tengo una matriz de checkbox por lo cual todos se llaman igual como hago para que cuando seleccione cualquiera de ellos no cambie solo el estado del primero de todos

  • 24 de mayo de 2013 a las 13:22
    Luis Rodríguez dice...
    Muchas gracias por el aporte. ¿Sería posible integrarlo en Wordpress, de manera que funcionasen así solamente los checkbox que quisiéramos, y no todos los de los diferentes formularios que tengamos?

  • 24 de mayo de 2013 a las 14:55
    Carlos dice...
    @Luis, en principio con ese código en tu hoja de estilos debería funcionar sin problema alguno siempre que respetes la estructura de label+checkbox.

    Otra cosa es que quieras integrarlo en el admin de wordpress, por lo que tendrías que crear una hoja de estilos con las css necesarias y adjuntarla desde tu functions.php mediante "wp_enqueue_style".

    @Kennedyperez, tienes algún ejemplo donde ver el poqué de ese problema ?

  • 23 de octubre de 2013 a las 20:36
    Andres dice...
    Hola tu codigo no funciona con un control checkListBox en ASPX, alguna sugerencia ??? solo puedo conseguir que cargue la imagen pero no el texto, espero tu pronta ayuda

  • 23 de octubre de 2013 a las 23:37
    Carlos dice...
    Andres, con que navegador y versión del mismo lo estás probando ?

  • 19 de diciembre de 2013 a las 18:22
    antonio dice...
    Un ejemplo para ie
    coche.png





    Personnalisation des boutons radio


    label
    {
    padding-right : 3px;
    margin-right : 3px;
    background : #fc6;
    vertical-align : top;
    }

    #conteneurRadio p
    {
    position : relative;
    float : left;
    margin : 0;
    }

    #conteneurRadio input
    {
    opacity : 0; /* for !IE */
    filter : alpha(opacity=0); /* for IE */
    width : 20px;
    height : 20px;
    position : absolute;
    right : 0;
    top : 0;
    }


    /* <![CDATA[ */
    function turnImgRadio(objRadio)
    {
    var t_img = document.getElementById('conteneurRadio').getElementsByTagName('img');

    for (var i = 0; i */




    Personnalisation des boutons radio


    Mlle :




    Mme :





    Mr :








Deja tu comentario