Los formularios son una de las razones de porque el mundo corporativo entró a Internet: captura de datos de usuarios. Es la forma más fácil y rápida de obtener ese ansiado contacto, con el cual puedo convertir a ese usuario en mi cliente. Para los fabricantes de browsers, la visualización de los campos de formularios no ha sido normalizada y cada uno lo hace a su criterio, incluso con diferencias entre el mismo browser pero en diferentes plataformas.

Checkboxes across browsers

Técnica 1: CSS + JavaScript (IE8+)

Para darle un diseño mejor y uniforme entre browsers/plataformas acudimos a un pequeño truco que involucra CSS y una pizca de JavaScript para el manejo de clases.

Para un simple y sencillo formulario con algunos input de tipo checkbox (el uso de la class=“check” es para diferenciarlo de otros campos puedan existir en el mismo formulario):

<fieldset><br />
  <label class="check" for="check1"><br />
    <input type="checkbox" checked="checked" id="check1"><br />
    Check 1<br />
  </label><br />
  <label class="check" for="check2"><br />
    <input type="checkbox" id="check2"><br />
    Check 2<br />
  </label><br />
  <label class="check" for="check3"><br />
    <input type="checkbox" id="check3"><br />
    Check 3<br />
  </label><br />
</fieldset>

La técnica consiste en envolver el input=“checkbox” dentro del label, con tal de hacerlo completo clickeable. Así, escondemos con CSS el campo y trabajamos sólo con el label, habilitando al click en cada uno la inyección de una class=“c_on” cuando el checkbox está siendo seleccionado.

label.check {<br />
  display: block;<br />
  cursor: pointer;<br />
  padding-left: 26px;<br />
  background: url('check_off.png') left center no-repeat;<br />
}<br />
label.check input {<br />
  position: absolute;<br />
  left: -9999px;<br />
}<br />
label.check.c_on {<br />
  background: url('check_on.png')  left center no-repeat;<br />
}

Finalmente acudimos a JavaScript para hacer el cambio de clase para mostrar tal o cual imagen:

var input = document.querySelectorAll("label.check input");<br />
if(input !== null) {<br />
  [].forEach.call(input, function(el) {<br />
    if(el.checked) {<br />
      el.parentNode.classList.add('c_on');<br />
    }<br />
    el.addEventListener("click", function(event) {<br />
      event.preventDefault();<br />
      el.parentNode.classList.toggle('c_on');<br />
    }, false);<br />
  });<br />
}

Técnica 2: CSS3 (IE9+)

Para esta técnica reordenamos el HTML ya que trabajaremos con [selectores avanzados de atributos][1] (siblings):

<fieldset><br />
  <input type="checkbox" id="check1" checked="checked"><br />
  <label for="check1">Check 1</label><br />
  <input type="checkbox" id="check2"><br />
  <label for="check2">Check 2</label><br />
  <input type="checkbox" id="check3"><br />
  <label for="check3">Check 3</label><br />
</fieldset>

El CSS es extenso, ya que se trabaja con pseudo-clases :checked y :not(:checked), además de pseudo-elemento :after como se lee a continuación:

[type="checkbox"] {<br />
  position: absolute;<br />
  left: -9999px;<br />
}<br />
[type="checkbox"] + label:after {<br />
  content: '';<br />
  position: absolute;<br />
}<br />
[type="checkbox"] + label {<br />
  display: block;<br />
  position: relative;<br />
  padding-left: 26px;<br />
  cursor: pointer;<br />
  line-height: 36px;<br />
  font-size: 28px;<br />
  color: #e74c3c;<br />
  text-shadow: #2c3e50 2px 2px 1px;<br />
  transition: color .3s;<br />
}<br />
[type="checkbox"] + label:after {<br />
  width: 30px; <br />
  height: 30px;<br />
  transition: all .2s;<br />
  top: 0; <br />
  left: 0;<br />
}<br />
/* OFF */<br />
[type="checkbox"]:not(:checked) + label:after {<br />
  background: url('check_off.png') left center no-repeat;<br />
}<br />
/* ON */<br />
[type="checkbox"]:checked + label {<br />
  color: #fff;<br />
}<br />
[type="checkbox"]:checked + label:after {<br />
  background: url('check_on.png') left center no-repeat;<br />
}

[1]: http://www.csslab.cl/2007/12/06/la-descendencia-del-css/ “Enlace en CSSLab a “La descendencia del CSS””