@mikilikala
На фронте

Как сделать переключение блоков с проверкой на инпуты?

Есть два блока - form и type (может быть и больше).
После проверки инпутов (написано ли что-то в них или нет), человек нажимает на кнопку Далее и текущий блок прячется, а следующий показывается и так до последнего блока...
После первого блока появляется кнопка Назад и соответственно она возвращает тебя назад.

Просто объясните на словах как это всё реализовать, а кому не лень, то вот код... ;)

<div class="block">
	<div class="block-inner">
		<div class="block-text">
			<div class="block-title">Настройка аккаунта</div>
			<div class="block-subtitle">Укажите дополнительную информацию о вас</div>
			<span class="block-step blockStep">Шаг 1</span>
		</div>

		<div class="form">
			<div class="info">
				<input type="text" class="surname" placeholder="Ваша Фамилия">
				<input type="text" class="birthday" placeholder="Дата рождения">
				<input type="text" class="cuntry" placeholder="Страна">
				<input type="text" class="town" placeholder="Город">
			</div>

			<div class="type">
				<div class="radio-block">
					<input name="radio" type="radio" class="executor">
					<div class="radio-text">
						<div class="radio-title">Исполнитель</div>
						<div class="radio-subtitle">Краткое описание</div>
					</div>
				</div>
				<div class="radio-block">
					<input name="radio" type="radio" class="employer">
					<div class="radio-text">
						<div class="radio-title">Работадатель</div>
						<div class="radio-subtitle">Краткое описание</div>
					</div>
				</div>
			</div>

			<div class="buttons">
				<button type="button" class="prev"></button>
				<button type="button" class="next">Дальше</button>
			</div>
		</div>
	</div>
</div>


* {
	box-sizing: border-box;
	padding: 0;
	margin: 0;
}

body {
	font-family: sans-serif;
	background-color: #F9F9F9;
}

/*================================================================================================================
==================================================================================================================*/

.block {
	width: 50%;
	margin: 200px auto;
}


.block-inner {
	display: flex;
	flex-direction: column;
}

.block-text {
	text-align: center;
}

.block-title {
	font-size: 32px;
	color: #535353;
}

.block-subtitle {
	max-width: 360px;
	margin: 10px auto 20px auto;
	font-size: 18px;
	color: #D2D2D2;
}

.block-step {
	font-size: 22px;
	font-weight: bold;
	color: #3D46FF;
}

.form {
	display: flex;
	flex-direction: column;
	align-items: center;
}

.info {
	max-width: 360px;
	margin: 0 auto;
}

.info input {
	width: 360px;
	padding: 18px 0 18px 20px;
	margin-top: 20px;
	border-radius: 4px;
	box-shadow: 0px 7px 5px #F5F5F5;
	border: 1px solid #F9F9F9;
}

.info input:first-child {
	margin-top: 50px;
}

.info input[placeholder] {
	font-size: 16px;
}

.info input:focus {
	outline: 1px solid #2C4CED;
}

/*================================================================================================================
==================================================================================================================*/

.type {
	display: none!important;
	max-width: 360px;
	margin: 50px auto 0 auto;
	display: flex;
	flex-direction: column;
}

.type input {
	width: 340px;
	padding: 50px 0;
	border: 1.5px solid #F9F9F9;
	box-shadow: 0px 7px 5px #F5F5F5;
	background-color: #fff;
	border-radius: 2px;
	outline: none;
}

.type input:focus {
	border: 1.5px solid #0076CB;
	background: #F5FAFF;
}

.type input[type="radio"] {
 	appearance: none;
}

.radio-block {
	position: relative;
}

.radio-block:last-child {
	margin-top: 20px;
}

.radio-text {
	position: absolute;
	top: 50%;
	left: 50%;
	transform: translate(-50%, -50%);
}

.radio-subtitle {
	margin-top: 10px;
}

.buttons {
	display: flex;
	align-items: flex-end;
}

.prev {
	width: 65px;
	height: 60px;
	box-shadow: 0px 7px 5px #F5F5F5;
	border-radius: 10px;
	border: 1px solid #F9F9F9;
	outline: none;
	background-color: #fff;
	position: relative;
	margin-right: 20px;
}

.prev:before {
	content: '';
	display: block;
	position: absolute;
	top: 50%;
	left: 50%;
	transform: translate(-25%, -50%) rotate(45deg);
	border-bottom: 3px solid #D2D2D2;
	border-left: 3px solid #D2D2D2;
	width: 10px;
    height: 11px;
}

.next {
	margin-top: 50px;
	padding: 20px 50px;
	background-color: #0076CB;
	box-shadow: 0px 4px 25px rgba(0, 118, 203, 0.35);
	border-radius: 10px;
	outline: none;
	border: none;
	font-size: 16px;
	font-weight: bold;
	color: #fff;
}


const step = document.querySelector('.blockStep'),
	info = document.querySelector('.info'),
	type = document.querySelector('.type'),
	prev = document.querySelector('.prev'),
	next = document.querySelector('.next');

const step = () => {};


next.addEventListener('click', (event) => {
	
});
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 1
SilenceOfWinter
@SilenceOfWinter
та еще зажигалка...
1 вариант: подгружаешь формы через ajax и хранишь промежуточные результаты в web/local storage или cookies
2. загружаешь все шаги-блоки формы сразу и отображаешь по мере необходимости, т.к. это единая форма, то потребность в доп. хранилище результатов отпадает.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
КРАФТТЕК Санкт-Петербург
от 60 000 до 80 000 ₽
Brightdata Тель-Авив
от 5 500 до 6 500 $
Rocket Брянск
от 60 000 до 100 000 ₽
22 мая 2024, в 07:09
50000 руб./за проект
22 мая 2024, в 02:15
10000 руб./за проект