Mastercafe S.L.
Dirección:
Pl. Puerta de Europa 2 - 1D
Oviedo Asturias
33011
Telefonos de contacto:
Oficina: +34 627 531 764
Tel: 985 11 3939
Fax: 985 11 5780
Correo electronico:
info@mastercafe.com
admin@mastercafe.com

Creación de un formulario en etapas utilizando un deslizamiento lateral de cada una de ellas e incorporando un bloque de validación de campos rellenos, mostrando alertas de estado de cada etapa.
Nuestro código base consiste en un bloque principal DIV que vamos a llamar "wrapper" donde vamos a poner nuestro formulario en etapas a base de fieldset. Cada uno de los "fieldset" se convertirá en un nuevo paso del formulario:
<h1>Fancy Sliding Form with jQuery</h1> <div id="wrapper"> <div id="steps"> <form id="formElem" name="formElem" action="" method="post"> <fieldset class="step"> <legend>Account</legend> <p> <label for="username">User name</label> <input id="username" name="username" /> </p> <p> <label for="email">Email</label> <input id="email" name="email" type="email" /> </p> <p> <label for="password">Password</label> <input id="password" name="password" type="password" /> </p> </fieldset> <fieldset> ... </fieldset> </form> </div> <div id="navigation" style="display:none;"> <ul> <li class="selected"> <a href="#">Account</a> </li> <li> <a href="#">Personal Details</a> </li> <li> <a href="#">Payment</a> </li> <li> <a href="#">Settings</a> </li> <li> <a href="#">Confirm</a> </li> </ul> </div> </div>
La navegación con todos los pasos se crea bajo una lista desordenada al final del formulario y vamos a iniciarla oculta. Mas tarde vermos que será el javascript quien se encarga de gestionarla.
Vamos con la hoja de estilos.
El bloque principal "wrapper" y el bloque de pasos "steps" tendrán este estilo:
#wrapper{
-moz-box-shadow:0px 0px 3px #aaa;
-webkit-box-shadow:0px 0px 3px #aaa;
box-shadow:0px 0px 3px #aaa;
-moz-border-radius:10px;
-webkit-border-radius:10px;
border-radius:10px;
border:2px solid #fff;
background-color:#f9f9f9;
width:600px;
overflow:hidden;
}
#steps{
width:600px;
overflow:hidden;
}
.step{
float:left;
width:600px;
}
La clase step se asigna a cada fieldset. Vamos con el estilo de la navegación:
#navigation{
height:45px;
background-color:#e9e9e9;
border-top:1px solid #fff;
-moz-border-radius:0px 0px 10px 10px;
-webkit-border-bottom-left-radius:10px;
-webkit-border-bottom-right-radius:10px;
border-bottom-left-radius:10px;
border-bottom-right-radius:10px;
}
#navigation ul{
list-style:none;
float:left;
margin-left:22px;
}
#navigation ul li{
float:left;
border-right:1px solid #ccc;
border-left:1px solid #ccc;
position:relative;
margin:0px 2px;
}
El elemento único de link que tenemos lo personalizamos con CSS3 y fondos con degradados:
#navigation ul li a{
display:block;
height:45px;
background-color:#444;
color:#777;
outline:none;
font-weight:bold;
text-decoration:none;
line-height:45px;
padding:0px 20px;
border-right:1px solid #fff;
border-left:1px solid #fff;
background:#f0f0f0;
background:
-webkit-gradient(
linear,
left bottom,
left top,
color-stop(0.09, rgb(240,240,240)),
color-stop(0.55, rgb(227,227,227)),
color-stop(0.78, rgb(240,240,240))
);
background:
-moz-linear-gradient(
center bottom,
rgb(240,240,240) 9%,
rgb(227,227,227) 55%,
rgb(240,240,240) 78%
)
}
#navigation ul li a:hover,
#navigation ul li.selected a{
background:#d8d8d8;
color:#666;
text-shadow:1px 1px 1px #fff;
}
Cuando un paso es validado, vamos a agregar un span indicando si esta correcto o no, para ello asignamos las imágenes a mostrar en cada clase:
span.checked{
background:transparent url(../images/checked.png) no-repeat top left;
position:absolute;
top:0px;
left:1px;
width:20px;
height:20px;
}
span.error{
background:transparent url(../images/error.png) no-repeat top left;
position:absolute;
top:0px;
left:1px;
width:20px;
height:20px;
}
Los estilos de cada elemento se mostrarán así:
#steps form fieldset{
border:none;
padding-bottom:20px;
}
#steps form legend{
text-align:left;
background-color:#f0f0f0;
color:#666;
font-size:24px;
text-shadow:1px 1px 1px #fff;
font-weight:bold;
float:left;
width:590px;
padding:5px 0px 5px 10px;
margin:10px 0px;
border-bottom:1px solid #fff;
border-top:1px solid #d9d9d9;
}
#steps form p{
float:left;
clear:both;
margin:5px 0px;
background-color:#f4f4f4;
border:1px solid #fff;
width:400px;
padding:10px;
margin-left:100px;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px;
-moz-box-shadow:0px 0px 3px #aaa;
-webkit-box-shadow:0px 0px 3px #aaa;
box-shadow:0px 0px 3px #aaa;
}
#steps form p label{
width:160px;
float:left;
text-align:right;
margin-right:15px;
line-height:26px;
color:#666;
text-shadow:1px 1px 1px #fff;
font-weight:bold;
}
#steps form input:not([type=radio]),
#steps form textarea,
#steps form select{
background: #ffffff;
border: 1px solid #ddd;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
outline: none;
padding: 5px;
width: 200px;
float:left;
}
#steps form input:focus{
-moz-box-shadow:0px 0px 3px #aaa;
-webkit-box-shadow:0px 0px 3px #aaa;
box-shadow:0px 0px 3px #aaa;
background-color:#FFFEEF;
}
#steps form p.submit{
background:none;
border:none;
-moz-box-shadow:none;
-webkit-box-shadow:none;
box-shadow:none;
}
#steps form button {
border:none;
outline:none;
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
border-radius: 10px;
color: #ffffff;
display: block;
cursor:pointer;
margin: 0px auto;
clear:both;
padding: 7px 25px;
text-shadow: 0 1px 1px #777;
font-weight:bold;
font-family:"Century Gothic", Helvetica, sans-serif;
font-size:22px;
-moz-box-shadow:0px 0px 3px #aaa;
-webkit-box-shadow:0px 0px 3px #aaa;
box-shadow:0px 0px 3px #aaa;
background:#4797ED;
}
#steps form button:hover {
background:#d8d8d8;
color:#666;
text-shadow:1px 1px 1px #fff;
}
Y ahora vamos con el script que pone en marcha todo el formulario!
En nuestra funcion primero tendremos cuidado de mostrar el slider. Para ello necesitamos calcular el ancho de los elementos contenidos. Necesitaremos tambien tener cuidado con el deslizamiento cuando pasamos de un campo a otro en distintas etapas. Cuando el usuario toca en un tabs saltamos a la etapa correspondiente y a su primer campo disponible. Es importante el control de paso entre campos para toda la navegación del formulario.
La validación del formulario está basada en entradas de campo requeridas, no obstante podremos personalizar los campos que realmente necesitamos cambiando parcialmente esa parte. Si pasamos el siquiente campo y no hemos cumplimentado el anterior pasando de un fieldset a otro, vamos a mostrar la alerta correspondiente a la clase. Si todos los elementos están correctamente cargados mostraremos la otra clase que indica la imagen verde. No vamos a permitir al usuario que pulse Enviar hasta que esté completamente cargado y conforme el formulario, es decir sin campos vacios en este caso.
$(function() {
/*
numero de fieldsets
*/
var fieldsetCount = $('#formElem').children().length;
/*
posicion actual de fieldset / navigation link
*/
var current = 1;
/*
suma y guarda el ancho de cada uno de los fieldsets
fija la suma final como el total ancho de todos los pasos de elementos
*/
var stepsWidth = 0;
var widths = new Array();
$('#steps .step').each(function(i){
var $step = $(this);
widths[i] = stepsWidth;
stepsWidth += $step.width();
});
$('#steps').width(stepsWidth);
/*
para evitar problemas con IE, hacemos un focus del primer elemento de entrada en el formulario
*/
$('#formElem').children(':first').find(':input:first').focus();
/*
mostramos el navigation barra
*/
$('#navigation').show();
/*
cuando hacemos click sobre el link de navegación
el formulario se desliza hasta el correspondiente fieldset
*/
$('#navigation a').bind('click',function(e){
var $this = $(this);
var prev = current;
$this.closest('ul').find('li').removeClass('selected');
$this.parent().addClass('selected');
/*
almacenamos la posicional del link
en la variable current
*/
current = $this.parent().index() + 1;
/*
animate / slide al siguiente o al correspondiente
fieldset. El orden de los links en la navegación
es el orden de los fieldset.
Por otro lado, despues de deslizar, lanzamos un evento de focus sobre el primer
elemento input de el nuevo fieldset
Si hacemos click sobre el ultimo (confirmation), entonces validamos todos los fieldset
si no validaremos solo los previos al que tenemos
antes de que el formulario se deslice
*/
$('#steps').stop().animate({
marginLeft: '-' + widths[current-1] + 'px'
},500,function(){
if(current == fieldsetCount)
validateSteps();
else
validateStep(prev);
$('#formElem').children(':nth-child('+ parseInt(current) +')').find(':input:first').focus();
});
e.preventDefault();
});
/*
haciendo click en el tab (sobre la ultima entrada de cada fieldset), hacemos que el form
deslice al siguiente paso
*/
$('#formElem > fieldset').each(function(){
var $fieldset = $(this);
$fieldset.children(':last').find(':input').keydown(function(e){
if (e.which == 9){
$('#navigation li:nth-child(' + (parseInt(current)+1) + ') a').click();
/* force the blur for validation */
$(this).blur();
e.preventDefault();
}
});
});
/*
validamos errores sobre todos los campos de los fieldsets
y recuperamos si tiene errores en $('#formElem').data()
*/
function validateSteps(){
var FormErrors = false;
for(var i = 1; i < fieldsetCount; ++i){
var error = validateStep(i);
if(error == -1)
FormErrors = true;
}
$('#formElem').data('errors',FormErrors);
}
/*
validamos un fieldset
y retornamos -1 si encontramos errores o 1 si es correcto
*/
function validateStep(step){
if(step == fieldsetCount) return;
var error = 1;
var hasError = false;
$('#formElem').children(':nth-child('+ parseInt(step) +')').find(':input:not(button)').each(function(){
var $this = $(this);
var valueLength = jQuery.trim($this.val()).length;
if(valueLength == ''){
hasError = true;
$this.css('background-color','#FFEDEF');
}
else
$this.css('background-color','#FFFFFF');
});
var $link = $('#navigation li:nth-child(' + parseInt(step) + ') a');
$link.parent().find('.error,.checked').remove();
var valclass = 'checked';
if(hasError){
error = -1;
valclass = 'error';
}
$('<span class="'+valclass+'"></span>').insertAfter($link);
return error;
}
/*
si hay errores no permitimos al usuario enviar
*/
$('#registerButton').bind('click',function(){
if($('#formElem').data('errors')){
alert('Please correct the errors in the Form');
return false;
}
});
});
Este sería el aspecto de nuestro formulario insertado en una caja de MBC:
Web creada con MBC Diseño y desarrollo web © Mastercafe SL - Alojamiento web trafico ilimitado hosting ISPActivo | Nota legal | Nota técnica