В этой статье рассмотрим разработку простейшего скрипта степпера. Степпер — такой скрипт, который переключает экраны/слайды по нажатию на кнопки вперед или назад. Определения так себе, но думаю по примеру будет понятнее что это такое и для чего оно нужно.
Лично мне, приходилось раза два или три использовать примерную реализацию данного скрипта в своих работах. И подумал я, почему бы не написать нормальную заготовку для будущих подобных задач, и выложить ее в качестве статьи блога.
Подключаем библиотеки
Нам понадобится:
- bootstrap. Нам он просто облегчит подключение шрифтов и визуализацию кнопок
- font-awesome. От него мы получим три иконки (стрелка назад, вверх и вперед)
- animate.css, для простенькой анимации (вам никто не мешает использовать чистый css для этого)
- jquery, да-да, пора от него отказываться и отлавливать события на чистом JS. Но пока что лень)
А выглядит это так:
<link rel="stylesheet" href="../library/bootstrap-4/dist/css/bootstrap.min.css"> <link rel="stylesheet" href="../library/font-awesome/css/all.min.css"> <link rel="stylesheet" href="../library/animate.css/animate.min.css"> <script src="../library/jquery/dist/jquery.min.js"></script>
HTML код шагов
Всего у нас будет четыре шага. На третьем шаге у нас появится возможность перейти на первый шаг.
<div class="stepper-list" data-stepper="some-name">
<div class="stepper-one active animated" data-step="1">
<div class="stepper__content">
Шаг 1
</div>
<div class="stepper__nav">
<button type="button" class="btn btn-success" data-to-step="2">Вперед <i class="fas fa-chevron-circle-right"></i></button>
</div>
</div>
<div class="stepper-one animated" data-step="2">
<div class="stepper__content">
Шаг 2
</div>
<div class="stepper__nav">
<button type="button" class="btn btn-success" data-to-step="1"><i class="fas fa-chevron-circle-left"></i> Назад</button>
<button type="button" class="btn btn-success" data-to-step="3">Вперед <i class="fas fa-chevron-circle-right"></i></button>
</div>
</div>
<div class="stepper-one animated" data-step="3">
<div class="stepper__content">
Шаг 3
</div>
<div class="stepper__nav">
<button type="button" class="btn btn-success" data-to-step="2"><i class="fas fa-chevron-circle-left"></i> Назад</button>
<button type="button" class="btn btn-success" data-to-step="1">К шагу 1 <i class="fas fa-chevron-circle-up"></i></button>
<button type="button" class="btn btn-success" data-to-step="4">Вперед <i class="fas fa-chevron-circle-right"></i></button>
</div>
</div>
<div class="stepper-one animated" data-step="4">
<div class="stepper__content">
Шаг 4
</div>
<div class="stepper__nav">
<button type="button" class="btn btn-success" data-to-step="3"><i class="fas fa-chevron-circle-left"></i> Назад</button>
<button type="button" class="btn btn-success" data-to-step="send">Отправить <i class="fas fa-envelope"></i></button>
</div>
</div>
</div>
На что следует обратить внимание:
data-stepper="some-name" — находится как атрибут со значением в обертке наших шагов. Значение данного дата-атрибута, т. е. «some-name» - это название нашего степпера. Используется для того, если на странице Вам нужно реализовать более одного компонента переключения шагов.
HTML код одного шага имеет следующий вид:
<div class="stepper-one animated" data-step="2">
<div class="stepper__content">
Шаг 2
</div>
<div class="stepper__nav">
<button type="button" class="btn btn-success" data-to-step="1"><i class="fas fa-chevron-circle-left"></i> Назад</button>
<button type="button" class="btn btn-success" data-to-step="3">Вперед <i class="fas fa-chevron-circle-right"></i></button>
</div>
</div>
где:
data-step="2" — дата атрибут с номером текущего шага.
data-to-step="1" и data-to-step="3" — в кнопках, дата атрибуты с номерами шагов, к которым мы можем перейти кликнув по той или иной кнопке. Содержимое этих атрибутов могут иметь любое значение. Но важно что бы оно совпадало с какими-то значениями из атрибутов «data-step» окон наших шагов.
CSS код шагов
Здесь все достаточно просто и без особых дизайнерских заморочек (ведь у нас просто заготовка):
.stepper-one:not(.active) {
display: none;
}
.stepper__content {
text-align: center;
margin: 10px;
padding: 50px 0;
border: 1px dotted #47484B;
}
.stepper__nav {
text-align: center;
}
.stepper__nav button {
text-transform: uppercase;
}
Из выше приведенного кода, я бы остановился на следующей его части, а именно:
.stepper-one:not(.active) {
display: none;
}
Здесь мы прячем окна всех шагов кроме тех, которые имеют класс «active». Это важно, т. к. нам нужно отображать только один активный шаг.
JavaScript код шагов степпера
Как и в предыдущей статье про табы. Данный код степпера мы так же обернем в функцию, что бы можно было использовать несколько экземпляров степпера на одной странице.
jQuery(document).ready(function()
{
function stepper(id)
{
var $Stepper = jQuery('[data-stepper="' + id + '"]');
if($Stepper.length)
{
$Stepper.find('[data-to-step]').click(function(e){
e.preventDefault();
var step = jQuery(this).data('to-step');
if(step == 'send')
{
alert('Здесь может быть AJAX отправка данных на сервер...');
}
else
{
if($Stepper.find('.stepper-one').hasClass('bounceInRight') == false)
{
$Stepper.find('.stepper-one').addClass('bounceInRight');
}
$Stepper.find('.stepper-one').removeClass('active');
$Stepper.find('[data-step="' + step + '"]').addClass('active');
}
});
}
}
stepper('some-name');
});
Здесь, функция stepper(…) принимает один аргумент — название экземпляра степпера. В ней, мы ищем в DOM дереве нашего HTML документа сам наш степпер. И далее, через функцию «find» jQuery мы будем манипулировать с шагами и событием.
Подробнее:
$Stepper = jQuery('[data-stepper="' + id + '"]');
Ищем наш степер на странице.
if($Stepper.length) {...}
Если находим, идем далее, и отслеживаем событие onclick.
var step = jQuery(this).data('to-step');
Переменная «step», хранит название/номер шага.
Если:
if(step == 'send')
{
alert('Здесь может быть AJAX отправка данных на сервер...');
}
в данном случае, мы можем используя аякс отправку данных, отправить данные формы на сервер. А там уже как-то обработать - сохранить в БД, передать через CURL по API куда-то, или еще что-то.
В противном же случае, мы переключаемся между шагами наших окон:
if($Stepper.find('.stepper-one').hasClass('bounceInRight') == false)
{
$Stepper.find('.stepper-one').addClass('bounceInRight');
}
$Stepper.find('.stepper-one').removeClass('active');
$Stepper.find('[data-step="' + step + '"]').addClass('active');
Условие выше, используется лишь для того, что бы не добавлять класс, если пользователь решит вернуться на шаг назад а потом клацнуть вперед.
Где:
$Stepper.find('.stepper-one').removeClass('active');
мы удаляем класс «active» с текущего окна. И тем самым оно пропадет (см. выше css описание).
И далее:
$Stepper.find('[data-step="' + step + '"]').addClass('active');
Номеру шагу указанному в step, и помещенного в дата-атрибут окна, добавляем класс «active». Тем самым отображаем окошко делая его активным.
Результат нашего творения можно найти здесь.
