В это статье мы рассмотрим довольно симпатичную форму регистрации, которая создана на jQuery. В этой форме все странички переключаются скольжением, а незаполненные поля выделяются.
HTML
HTML-часть включает в себя Wrapper’a, в котором находятся сменяющиеся поля.
[sourcecode language=’HTML’]Fancy Sliding Form with jQuery
Пока навигация скрыта, но будет показана при помощи JavaScript. Далее рассмотрим CSS.
CSS
CSS листающихся контейнеров и Wrapper’а имеет следующий вид.
[sourcecode language=’css’]#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;
}[/sourcecode]
Преобразуем навигацию:
[sourcecode language=’css’]#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;
}[/sourcecode]
CSS3-градиент будет фоном для ссылок:
[sourcecode language=’css’]#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;
}[/sourcecode]
Добавляем span, который определяет ошибки, или span, который отображает, что все нормально:
[sourcecode language=’css’]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;
}[/sourcecode]
Определяем стиль элементов формы:
[sourcecode language=’css’]#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;
}
[/sourcecode]
JavaScript
В JavaScript все это имеет следующий вид:
[sourcecode language=’JavaScript’](function() {/*
номер полей fieldsets
*/
var fieldsetCount = $(‘#formElem’).children().length;
	    /*
	    Текущая позиция поля fieldset / ссылки в  менню навигации
		*/
	    var current     = 1;
	    /*
	    Суммируем и сохраняем длину каждого поля с формами fieldset
	    Задать сумму как окончательную длину листающегося элемента
	    */
	    var stepsWidth  = 0;
	    var widths      = new Array();
	    $(‘#steps .step’).each(function(i){
	        var $step       = $(this);
	        widths[i]       = stepsWidth;
	        stepsWidth      += $step.width();
	    });
	    $(‘#steps’).width(stepsWidth);
	    /*
	    Во избежание проблем с IE, фокусируем первый input формы
	    */
	    $(‘#formElem’).children(‘:first’).find(‘:input:first’).focus();
	    /*
	    покажем навигацию
	    */
	    $(‘#navigation’).show();
	    /*
	    когда кликаем на ссылку в  навигацию
	    форма слайдится к соответствующему этому пункту меню полю
	    */
	    $(‘#navigation a’).bind(‘click’,function(e){
	        var $this   = $(this);
	        var prev    = current;
	        $this.closest(‘ul’).find(‘li’).removeClass(‘selected’);
	        $this.parent().addClass(‘selected’);
	        /*
	        сохраняем позицию ссылки в переменной current
	        */
	        current = $this.parent().index() + 1;
	        /*
	        анимируем / скользим к следующему или к соответствующему полю.
	        Значение полей навигации должно соответствовать значению поля с формами.
	        Теперь ,после скольжения, мы триггерим фокус на первом input-элементе нового поля.
	        ЕСли мы нажимаем на последнюю ссылку (подтверждение), то производится проверка всех полей,
			,либо мы проверяем одно предыдущее перед тем как форма будет слользить
	        */
	        $(‘#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();
	    });
	    /*
	    Кликаем на поле табуляции (последнее в каждом поле),
		создаёт скольжение формы к  следующему этапу
	    */
	    $(‘#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();
	                /*усилим размытость для проверки */
	                $(this).blur();
	                e.preventDefault();
	            }
	        });
	    });
	    /*
	    ПРоверяем все ошибки
	   Зписываем все ошибки в $(‘#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);
	    }
 
	    /*
	    Проверям поле
		И возвращаем -1 если есть ошибки, и 1 , если их нет.
	    */
	    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';
	        }
	        $('‘).insertAfter($link);
	        return error;
	    }
	    /*
	    Если ошибок не найдено, отправляем данные пользователя.
	    */
	    $(‘#registerButton’).bind(‘click’,function(){
	        if($(‘#formElem’).data(‘errors’)){
	            alert(‘Please correct the errors in the Form’);
	            return false;
	        }
	    });
	});[/sourcecode]
