В это статье мы рассмотрим довольно симпатичную форму регистрации, которая создана на 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]