Subscribe to RSS Feed

Forms

Hola que tal a todos, pues la verdad no había tenido tiempo de escribir en mi blog, y ahorita que tengo un pequeño tiempo libre he decidido invertirle unos minutos, en esta ocasión hablaré de cómo hacer un checkbox personalizado; Como en muchas veces el cliente habla de más y dice “Quiero que los checkbox se vean bonitos”, lo que implica un poco de trabajo extra, con este pequeño ejemplo y gracias a jQuery esto será cosa de unos minutos.

Lo primero que necesitamos es una imágen que agregar ( ya que como sabemos el checkbox como tal no es estilizable ), yo siempre recomiendo que los dos estados del checkbox se encuentren en el mismo archivo, para evitar volver a cargar la imágen y por un segundo la pimera vez se vea la ausencia de esta.


En este caso yo usaré esta imágen , la cual tiene unas dimensiones de 15×29 ( imágen diseñada por ACIDminds )

Suponiendo que tenemos un html de esta forma.

<form id="form-1" method="post" action="action.php">
<fieldset>
<legend>Elige parientes</legend>
<ul>
<li>
<input type="checkbox" name="animales" id="animales1" value="perro" />
<label for="animales1">Perro</label>
</li>
<li>
<input type="checkbox" name="animales" id="animales2" value="gato" />
<label for="animales2">Gato</label>
</li>
<li>
<input type="checkbox" name="animales" id="animales3" value="conejo" />
<label for="animales3">conejo</label>
</li>
<li>
<input type="checkbox" name="animales" id="animales4" value="caballo" />
<label for="animales4">Caballo</label>
</li>
<li>
<input type="checkbox" name="animales" id="animales5" value="Burro" class="uncheckeable" />
<label for="animales5">Burro</label>
</li>
</ul>
</fieldset>
</form>

Lo primero que necesitamos es hacer estilos a manera que sepamos como queremos que queden acomodado nuestro formulario.

#form-1{
font-family: Verdana, Arial;
}

#form-1 legend{
font-size: 20px;
padding: 5px 10px;
}

#form-1 ul {
float: left;
width: 310px;
}

#form-1 li{
float: left;
list-style: none;
padding: 5px 0;
width: 50%;
}

#form-1 li input{
float: left;
height: auto;
margin-right: 3px;
vertical-align: middle;
width: auto;
}

#form-1 label{
clear: none;
display: inline-block;
float: left;
height: auto;
vertical-align: middle;
width: auto;
zoom: 1;
*display: inline;
}

Quedando de la siguiente manera:

Elige parientes

Lo siguiente es etener los estilos del elementos que actuarán como nuestros checkbox.

/**
* Se comienza a asignar el tamaño que se quiere que tenga el checkbox Falso así como la imágen que lo tendrá
*/
#form-1 .footage-checkbox {
background: url("http://edmundoretama.com/imagenes/Ratio_Btn.jpg") no-repeat scroll 0 0 transparent;
cursor: pointer;
display: block;
float: left;
height: 14px;
margin-right: 6px;
width: 15px;
}

/*
* Es aquí donde a manera de sprite cuando el checkbox ficticio tenga la clase "checked" solo se recorrerá la imágen hacia arriba para dar el aspecto deseado
*/
#form-1 .footage-checkbox.checked {
background-position: 0 -15px !important;
}

Ahora imaginense estar asignando a todos los ckeckbox, por eso esta acción se realizará por javascript con las siguientes líneas gracias a jQuery.

/*Cuando el DOM esté listo*/
$(document).ready( function(){
//se obtienen en este caso todos los elementos de tipo checkbox que se encuentren
checkButtons = $(‘input’);

/*En donde se encuentre algún checkbox este se ocultará, y al mismo tiempo se creará un elemento span, con la clase del checkbox false*/
checkButtons.each( function(){
$(this).after(‘<span rel="’ + this.id + ‘" class="footage-checkbox"></span>’).css(‘display’,'none’);
});

checkButtons.change( function(){
/*primero se compara en el evento change el estado que se encuentre para convertirlo en el opuesto*/
this.checked = ( this.checked ) ? false:true;

//dependiendo del estado del se asigna o se elimin
if( this.checked )
$(‘span.footage-checkbox’).addClass(‘checked’);
else
$(‘span.footage-checkbox’).removeClass(‘checked’);
});

//aquí mandamos hacempos que al darle click al checkbox ficticio , cambie el real
$(‘span.footage-checkbox’).click( function(){
tempChk = $(‘input#’+$(this).attr(‘rel’)).change();
});

//aqui se asigna el cambio del estado de los checkbox en el label, para respetar la semántica de este
$(‘label’).click( function(){
tempChk = $(‘input#’+$(this).attr(‘for’)).change();
});

});

dejándonos finalmente algo como esto:

Elige parientes

Quedando nuestro html final algo como esto:

<!DOCTYPE html>
<html>
<head>
<title>Checkbox</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<!–>
<script type="text/javascript" src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<!–>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script type="text/javascript">
/*Cuando el DOM esté listo*/
$(document).ready( function(){
//se obtienen en este caso todos los elementos de tipo checkbox que se encuentren
checkButtons = $(‘input’);

/*En donde se encuentre algún checkbox este se ocultará, y al mismo tiempo se creará un elemento span, con la clase del checkbox false*/
checkButtons.each( function(){
$(this).after(‘<span rel="’ + this.id + ‘" class="footage-checkbox"></span>’).css(‘display’,'none’);
});

checkButtons.change( function(){
/*primero se compara en el evento change el estado que se encuentre para convertirlo en el opuesto*/
this.checked = ( this.checked ) ? false:true;

//dependiendo del estado del se asigna o se elimin
if( this.checked )
$(‘span.footage-checkbox’).addClass(‘checked’);
else
$(‘span.footage-checkbox’).removeClass(‘checked’);
});

//aquí mandamos hacempos que al darle click al checkbox ficticio , cambie el real
$(‘span.footage-checkbox’).click( function(){
tempChk = $(‘input#’+$(this).attr(‘rel’)).change();
});

//aqui se asigna el cambio del estado de los checkbox en el label, para respetar la semántica de este
$(‘label’).click( function(){
tempChk = $(‘input#’+$(this).attr(‘for’)).change();
});

});
</script>

<style type="text/css">
/*Se le asigna a todo el form un estilo de fuente Verdana*/
#form-1{
font-family: Verdana, Arial;
}

#form-1 legend{
font-size: 20px;
padding: 5px 10px;
}

#form-1 ul {
float: left;
width: 310px;
}

#form-1 li{
float: left;
list-style: none;
padding: 5px 0;
width: 50%;
}

#form-1 li input{
float: left;
height: auto;
margin-right: 3px;
vertical-align: middle;
width: auto;
}

#form-1 label{
clear: none;
display: inline-block;
float: left;
height: auto;
vertical-align: middle;
width: auto;
zoom: 1;
*display: inline;
}

/**
* Se comienza a asignar el tamaño que se quiere que tenga el checkbox Falso así como la imágen que lo tendrá
*/
#form-1 .footage-checkbox {
background: url("http://edmundoretama.com/imagenes/Ratio_Btn.jpg") no-repeat scroll 0 0 transparent;
cursor: pointer;
display: block;
float: left;
height: 14px;
margin-right: 6px;
width: 15px;
}

/*
* Es aquí donde a manera de sprite cuando el checkbox ficticio tenga la clase "checked" solo se recorrerá la imágen hacia arriba para dar el aspecto deseado
*/
#form-1 .footage-checkbox.checked {
background-position: 0 -15px !important;
}

</style>

</head>
<body>
<form id="form-1" method="post" action="action.php">
<fieldset>
<legend>Elige parientes</legend>
<ul>
<li>
<input type="checkbox" name="animales" id="animales1" value="perro" />
<label for="animales1">Perro</label>
</li>
<li>
<input type="checkbox" name="animales" id="animales2" value="gato" />
<label for="animales2">Gato</label>
</li>
<li>
<input type="checkbox" name="animales" id="animales3" value="conejo" />
<label for="animales3">conejo</label>
</li>
<li>
<input type="checkbox" name="animales" id="animales4" value="caballo" />
<label for="animales4">Caballo</label>
</li>
<li>
<input type="checkbox" name="animales" id="animales5" value="Burro" class="uncheckeable" />
<label for="animales5">Burro</label>
</li>
</ul>
</fieldset>
</form>
</body>
</html>

Continue Reading »
3 Comments

Stay in Tune

  • Alliance High Rollers transfered ownership of the system F-TQWO (Malpais) from Funk Soul Brothers to Confederate... http://t.co/wZAzRZyP
  • RT @latts16: Fielded 4 calls today from kids invited to WHL camps but want to maintain eligibility. Here's the need-to-know info: http://t.co/xMLBwtQK
  • @BrittaneDaBUTT_ oh naaa....I need to come by there an collect my money from you
  • RT @SayAyyeRayRay_: Boys From New Orleans>>> I Love Their Accents.
Twitter

Follow Me on Twitter!