Главная » Файлы » Прочие скрипты » jQuery

Классная поэтапная форма регистрации на jQuery
22.06.14, 20:21:37

Скачать файл






В данном уроке мы разберем задачу создания проскальзывающей в сторону формы для ввода информации, которая также проводит проверку данных пользователя на каждом шаге. Такая форма сохраняет много места и проста в исполнении. Ее работа основана на принципе слайдшоу, только вместо изображений используются формы с набором полей ввода.

Для начала посмотрите ДЕМО

Далее переходим к самой установке:

HTML состоит из контейнера в который помещаются формы с набором полей ввода. Каждый набор полей ввода является этапом в проскальзывающей форме:
Код
<h1>Проскальзывающая форма ввода информации на основе jQuery</h1>  
  <div id="wrapper">  
  <div id="steps">  
  <form id="formElem" name="formElem" action="" method="post">  
  <fieldset class="step">  
  <legend>Учетная запись</legend>  
   

   
  <label for="username">Имя пользователя</label>  
  <input id="username" name="username" />  
  </p>  
   

   
  <label for="email">Email</label>  
  <input id="email" name="email" type="email" />  
  </p>  
   

   
  <label for="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="#">Учетная запись</a>  
  </li>  
  <li>  
  <a href="#">Персональные данные</a>  
  </li>  
  <li>  
  <a href="#">Платеж</a>  
  </li>  
  <li>  
  <a href="#">Установки</a>  
  </li>  
  <li>  
  <a href="#">Подтверждение</a>  
  </li>  
  </ul>  
  </div>  
  </div>


Навигация со ссылками на этапы является неупорядоченным списком и изначально скрыта. Она показывается с помощью JavaScript скрипта.

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;  
  }


Класс step задается для каждого набора полей. А вот стиль навигации:
Код
#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;  
  }


Единичный элемент со ссылкой будет иметь четкий градиент CSS3 в качестве фона:
Код
#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;  
  }


После проверки информации шага мы добавляем либо span, указывающий, что все задано без ошибок, либо span, отображающий наличие ошибок в данных:
Код
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;  
  }


Стиль для элементов формы выглядит так:
Код
#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;  
  }


JavaScript

В нашей функции сначала мы покажем слайдер. Для этого нам нужно вычислить ширину элементов внутри. Также нужно обеспечить проскальзывание, когда закладка получает фокус ввода. Когда пользователь нажимает закладку в момент, когда он находится на последнем поле ввода в наборе, мы передвигаем слайд следующего набора и устанавливаем фокус ввода на его первом поле.

Проверка формы основана на том, что все поля должны быть заполнены. Если мы переключаемся на следующий набор и не все поля заполнены в предыдущем наборе, то пропущенные поля нужно отметить с помощью красного фона и добавления маленькой отметки об ошибке на элемент навигации.Если все в порядке, то добавляется отметка о прохождении проверки, чтобы пользователь знал, что все прошло успешно. Отправлять форму, которая имеет хотя бы одно незаполненное поле нельзя.
Код
$(function() {  
  /*  
  Количество наборов полей  
  */  
  var fieldsetCount = $('#formElem').children().length;  
  /*  
  текущая позиция / ссылка навигации  
  */  
  var current = 1;  
  /*  
  Складываем и сохраняем ширину каждого набора полей  
  устанавливаем общую сумму в качестве общей ширины элемента шагов  
  */  
  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, устанавливаем фокус на первом поле в форме  
  */  
  $('#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 = $this.parent().index() + 1;  
  /*  
  анимация / проскальзывание на соответствующий набор полей.  
  Порядок ссылок навигации соответствует порядку наборов полей  
  Также, после проскальзывания, мы переключаем фокус ввода
  на первое поле в новом наборе.  
  Если нажата последняя ссылка (подтверждение), то проверяются все наборы полей,  
  иначе мы проверяем только предыдущий набор  
  */  
  $('#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();  
  /* включаем blur для проверки */  
  $(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';  
  }  
  $('<span class="'+valclass+'"></span>').insertAfter($link);  
  return error;  
  }  
  /*  
  Если есть ошибки, то форму отправить нельзя  
  */  
  $('#registerButton').bind('click',function(){  
  if($('#formElem').data('errors')){  
  alert('Пожалуйста, исправьте ошибки в форме!');  
  return false;  
  }  
  });  
  });


Всё! Рабочее демо и все необходимые файлы находятся в прикреплённом архиве!
Категория: jQuery | Добавил: Apocalypse | Теги: JQuery, форма, Поэтапная, классная, регистрации, на
Просмотров: 530 | Загрузок: 0 | Комментарии: 6 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email: