Добрый день. Сегодня хотел поделиться анимированной формой обратной связи. Наша разработка будет простой, всего 3 поля: поле ввода имени, почты и для короткого сообщения. Форму будем показывать при клике по зафиксированной на экране кнопке. Скачать архив.

Это интересно. Ради любопытства исследовал 18 случайных интернет-магазинов с формой обратной связи. Оказалось, что практически все формы состояли только из вышеупомянутых полей.

Пример работы формы

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

Шаг 1: верстаем

Разместите перед закрывающим тегом body.

<div id="container">

	<!-- кнопка -->
	<div class="button-wrapper">
		<div class="layer"></div>
		<button class="main-button">
			<div class="ripple"></div>
		</button>
	</div>

	<!-- форма -->
	<div class="layered-content">
		<button class="close-button">×</button>
		<div class="form-box">
			<div class="mail"></div>
			<h2>ОСТАВЬТЕ ЗАЯВКУ</h2>
			<label>Ваше имя
				<input id="name" class="txt" name="name" type="name" />
			</label>
			<label>Ваш Email
				<input id="email" class="txt" name="email" type="email" />
			</label>
			<label>Текст сообщения
				<textarea id="msg" class="txtarea" name="msg"></textarea>
			</label>
			<button class="send">	
				<div class="text">Отправить</div>
				<div class="loader"></div>
				<div class="done">Отправлено</div>
			</button>
		</div>
	</div>
	
</div>

к содержанию ↑

Шаг 2: оформляем форму и готовим анимацию

Анимацию привязываем к классам, которые мы будем добавлять элементам через jQuery.

button:focus {
	outline: none;
}
#container {
	width: 100%;
	height: 100vh;
	top: 0;
	bottom: 0;
	min-height: 300px;
	position: relative;
	overflow: hidden;
}
.button-wrapper {
	width: 50px;
	height: 100%;
	position: absolute;
	bottom: 0;
	right: 0;
	display: -webkit-box;
	display: -webkit-flex;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-webkit-align-items: center;
	-ms-flex-align: center;
	align-items: center;
	-webkit-box-pack: center;
	-webkit-justify-content: center;
	-ms-flex-pack: center;
	justify-content: center;
	-webkit-transform-origin: 50% 50%;
	-ms-transform-origin: 50% 50%;
	transform-origin: 50% 50%;
	right: 20px;
	bottom: 20px;
}

button {
	width: 50px;
	height: 50px;
	border: none;
	border-radius: 50%;
	cursor: pointer;
	box-shadow: 0 1px 3px 0 rgba(0,0,0,0.4);
	z-index: 9;
	position: relative;
}
.main-button {
	background: #ff2670;
	-webkit-align-self: flex-end;
	-ms-flex-item-align: end;
	align-self: flex-end;
}
.ripple {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	top: 0;
	border-radius: 25%;
	z-index: -9;
	background: transparent;
	border: 1px solid #ff2670;
	-webkit-transform: scale(.5);
	-ms-transform: scale(.5);
	transform: scale(.5);
	-webkit-transition: .3s all ease;
	transition: .3s all ease;
	opacity: 1;
	max-width: 50px;
	max-height: 50px;
	padding: 5px;
	background-position: center;
	background-size: 45px;
	background-repeat: no-repeat;
	background-image: url(data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjY0cHgiIGhlaWdodD0iNjRweCIgdmlld0JveD0iMCAwIDUxMCA1MTAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDUxMCA1MTA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8ZyBpZD0iZW1haWwiPgoJCTxwYXRoIGQ9Ik00NTksNTFINTFDMjIuOTUsNTEsMCw3My45NSwwLDEwMnYzMDZjMCwyOC4wNSwyMi45NSw1MSw1MSw1MWg0MDhjMjguMDUsMCw1MS0yMi45NSw1MS01MVYxMDIgICAgQzUxMCw3My45NSw0ODcuMDUsNTEsNDU5LDUxeiBNNDU5LDE1M0wyNTUsMjgwLjVMNTEsMTUzdi01MWwyMDQsMTI3LjVMNDU5LDEwMlYxNTN6IiBmaWxsPSIjRkZGRkZGIi8+Cgk8L2c+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPC9zdmc+Cg==);
}
.rippling {
	-webkit-animation: .3s rippling 1;
	animation: .3s rippling 1;
	-moz-animation: .3s rippling 1;
}
@-webkit-keyframes rippling {
	25% {
		-webkit-transform: scale(1.5);
		transform: scale(1.5);
		opacity: 1;
	}
	100% {
		-webkit-transform: scale(2);
		transform: scale(2);
		opacity: 0;
	}
}
@-moz-keyframes rippling {
	25% {
		-moz-transform: scale(1.5);
		transform: scale(1.5);
		opacity: 1;
	}
	100% {
		-moz-transform: scale(2);
		transform: scale(2);
		opacity: 0;
	}
}
@keyframes rippling {
	25% {
		transform: scale(1.5);
		opacity: 1;
	}
	100% {
		transform: scale(2);
		opacity: 0;
	}
}
.layer {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	width: 50px;
	height: 50px;
	background: #ff2670;
	border-radius: 50%;
	z-index: -99;
	pointer-events: none;
}
.button-wrapper.clicked {
	-webkit-transform: rotate(90deg) translateY(-96px);
	-ms-transform: rotate(90deg) translateY(-96px);
	transform: rotate(90deg) translateY(-96px);
	right: 0;
	bottom: 0;
	-webkit-transition: .3s all ease .6s;
	transition: .3s all ease .6s;
}
.button-wrapper.clicked .main-button {
	opacity: 0;
	-webkit-transition: .3s all ease .3s;
	transition: .3s all ease .3s;
}
.button-wrapper.clicked .layer {
	-webkit-transform: scale(100);
	-ms-transform: scale(100);
	transform: scale(100);
	-webkit-transition: 1.75s all ease .9s;
	transition: 1.75s all ease .9s;
}
.layered-content {
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	display: -webkit-box;
	display: -webkit-flex;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-webkit-align-items: center;
	-ms-flex-align: center;
	align-items: center;
	-webkit-box-pack: center;
	-webkit-justify-content: center;
	-ms-flex-pack: center;
	justify-content: center;
	opacity: 0;
}
.layered-content.active {
	opacity: 1;
}
.close-button {
	background: white;
	position: absolute;
	right: 20px;
	top: 20px;
	color: #ff2670;
	font-size: 30px;
}
.layered-content.active .close-button {
	-webkit-animation: .5s bounceIn;
	animation: .5s bounceIn;
}
.layered-content .content img {
	width: 80px;
	-webkit-shape-outside: 80px;
	shape-outside: 80px;
	border-radius: 50%;
	display: block;
	margin: 0 auto 15px;
	padding: 10px;
	box-sizing: border-box;
	background: white;
	box-shadow: 0 1px 3px 0 rgba(0,0,0,0.4);
	-webkit-transition: .3s all ease;
	transition: .3s all ease;
}
.form-box{
	width: 100%;
	margin: 0 auto;
	max-width: 430px;
}
.form-box h2{
	color: #fff;
	margin: 10px 0;
	font-weight: 900;
	font-size: 33px;
    text-align: center;
}
.form-box input, .form-box textarea{
	width: 100%;
	float: left;
	padding: 10px;
	box-sizing: border-box;
	margin-bottom: 5px;
	border-radius: 3px;
	border: 0px;
}
.form-box label{
	padding: 5px 10px;
	float: left;
	margin-bottom: 10px;
	font-size: 12px;
	color: #fff;
	box-sizing: border-box;
	width: 100%;
	border-radius: 3px;
	border: 1px solid rgba(255, 255, 255, 0.65);
	background: rgba(255, 255, 255, 0.25);
}
.form-box p {
	color: white;
	font-weight: 300;
	text-align: center;
	line-height: 1.5;
}
.form-box p a {
	font-size: 12px;
	background: white;
	padding: 2.5px 5px;
	color: #ff2670;;
	text-decoration: none;
	border-radius: 50px;
	display: inline-block;
	margin-left: 1.5px;
}
.form-box label {
	opacity: 0;
}
.layered-content.active .form-box label {
	opacity: 1;
	top: 0;
	-webkit-transition: .25s all ease 0.25s;
	transition: .25s all ease 0.25s;
}

<!-- кнопка отправить -->
button {
	outline: 0;
}
button.active {
	outline: 0;
}
button.send {
	border: 2px solid #fff;
	color: white;
	width: inherit;
	height: inherit;
	border-radius: 50px;
	padding: 15px 80px;
	background: transparent;
	position: relative;
	overflow: hidden;
	-webkit-transform: translateY(-50%);
	transform: translateY(-50%);
	margin-top: 35px;
}
button.send .text.active {
	-webkit-transform: translateY(-350%) scale(0);
	transform: translateY(-350%) scale(0);
	-webkit-transition: 0.35s cubic-bezier(0.34, -0.61, 1, 0.64);
	transition: 0.35s cubic-bezier(0.34, -0.61, 1, 0.64);
}
button.send.active {
	padding: 0px 80px;
	-webkit-transition: 0.4s cubic-bezier(0.35, -0.77, 0.67, 1.88);
	transition: 0.4s cubic-bezier(0.35, -0.77, 0.67, 1.88);
}
button.send .loader {
	position: absolute;
	width: calc(0% - 4px);
	height: calc(100% - 4px);
	background-color: #fff;
	left: 2px;
	top: 2px;
	border-radius: 50px;
}
button.send .loader.active {
	width: calc(100% - 4px);
	-webkit-transition: 1.3s ease-in-out;
	transition: 1.3s ease-in-out;
	-webkit-transition-delay: 0.5s;
	transition-delay: 0.5s;
}
button.send .done {
	color: #232323;
	font-weight: 900;
	margin-top: -20px;
	-webkit-transform: translateY(300%) scale(0);
	transform: translateY(300%) scale(0);
}
button.send .text{
	font-weight: 700;
	text-transform: uppercase;
}
button.send .done.active {
	-webkit-transform: translateY(0%) scale(1);
	transform: translateY(0%) scale(1);
	-webkit-transition: 0.4s cubic-bezier(0.34, -0.61, 1, 0.64);
	transition: 0.4s cubic-bezier(0.34, -0.61, 1, 0.64);
	color: #232323;
	text-transform: uppercase;
}
button.send.finished {
	padding: 15px 80px;
	-webkit-transition: 0.4s cubic-bezier(0.35, -0.77, 0.67, 1.88);
	transition: 0.4s cubic-bezier(0.35, -0.77, 0.67, 1.88);
}
.mail{
	max-width: 256px;
	max-height: 256px;
	margin: 0 auto;
	width: 100%;
	height: 100px;
	background-repeat: no-repeat;
	background-size: 100px;
	background-position: center;
	background-image: url(data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTkuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeD0iMHB4IiB5PSIwcHgiIHZpZXdCb3g9IjAgMCA1MDQuMTI0IDUwNC4xMjQiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDUwNC4xMjQgNTA0LjEyNDsiIHhtbDpzcGFjZT0icHJlc2VydmUiIHdpZHRoPSI1MTJweCIgaGVpZ2h0PSI1MTJweCI+CjxwYXRoIHN0eWxlPSJmaWxsOiNEMDdDNDA7IiBkPSJNMCwyMDAuODYyTDI1Mi4wNjIsNTEuMmwyNTIuMDYyLDE0OS42NjJ2MjIwLjU1NEgwVjIwMC44NjJ6Ii8+CjxwYXRoIHN0eWxlPSJmaWxsOiNFRkVGRUY7IiBkPSJNNTUuMTM4LDExLjgxNWgzOTMuODQ2YzguNjY1LDAsMTUuNzU0LDcuMDg5LDE1Ljc1NCwxNS43NTR2Mjc1LjY5MiAgYzAsOC42NjUtNy4wODksMTUuNzU0LTE1Ljc1NCwxNS43NTRINTUuMTM4Yy04LjY2NSwwLTE1Ljc1NC03LjA4OS0xNS43NTQtMTUuNzU0VjI3LjU2OUMzOS4zODUsMTguOTA1LDQ2LjQ3NCwxMS44MTUsNTUuMTM4LDExLjgxNSAgeiIvPgo8cGF0aCBzdHlsZT0iZmlsbDojMjZBNkQxOyIgZD0iTTQxNS45MDIsNDMuMzIzbDI1LjIwNi0zMS41MDhoNy44NzdjOC42NjUsMCwxNS43NTQsNy4wODksMTUuNzU0LDE1Ljc1NHYxNS43NTRINDE1LjkwMnogICBNMjExLjEwMiw0My4zMjNsMjUuMjA2LTMxLjUwOGg1NS4xMzhMMjY2LjI0LDQzLjMyM0gyMTEuMTAyeiBNMzkuMzg1LDQzLjMyM1YyNy41NjljMC04LjY2NSw3LjA4OS0xNS43NTQsMTUuNzU0LTE1Ljc1NGgzOS4zODUgIEw2OS4zMTcsNDMuMzIzSDM5LjM4NXoiLz4KPHBhdGggc3R5bGU9ImZpbGw6I0VGQzc1RTsiIGQ9Ik01MDQuMTIzLDQ2OC42NzdjMCwxMi45OTctMTAuNjM0LDIzLjYzMS0yMy42MzEsMjMuNjMxSDIzLjYzMUMxMC42MzQsNDkyLjMwOSwwLDQ4MS42NzQsMCw0NjguNjc3ICBWMjAwLjg2MmwyNTIuMDYyLDExMC4yNzdsMjUyLjA2Mi0xMTAuMjc3djI2Ny44MTVINTA0LjEyM3oiLz4KPHBhdGggc3R5bGU9ImZpbGw6I0U4QzE1QjsiIGQ9Ik01MDQuMTIzLDQ2OC42NzdjMCwxMi45OTctMTAuNjM0LDIzLjYzMS0yMy42MzEsMjMuNjMxSDIzLjYzMUMxMC42MzQsNDkyLjMwOSwwLDQ4MS42NzQsMCw0NjguNjc3ICB2LTQ3LjI2Mmw1MDQuMTIzLTIyMC41NTRWNDY4LjY3N3oiLz4KPHBhdGggc3R5bGU9ImZpbGw6I0Q2RDlEQjsiIGQ9Ik0xNjAuMjk1LDE1MS42MzFsMy4xNTEsMTYuNTQybC0yNS4yMDYtMzkuMzg1bC0zNS40NDYsNTUuMTM4Yy0wLjM5NCw1LjEyLDIyLjQ0OSw5LjA1OCw1MC44MDYsOS4wNTggIHM1MS4yLTMuOTM4LDUxLjItOS4wNThsLTMxLjExNC00Ni4wOEMxNzMuNjg2LDEzNy44NDYsMTYwLjI5NSwxNTEuNjMxLDE2MC4yOTUsMTUxLjYzMXogTTE2My40NDYsMTI5Ljk2OSAgYzUuNTE0LDAsOS44NDYtNC4zMzIsOS44NDYtOS44NDZzLTQuMzMyLTkuODQ2LTkuODQ2LTkuODQ2cy05Ljg0Niw0LjMzMi05Ljg0Niw5Ljg0NlMxNTcuOTMyLDEyOS45NjksMTYzLjQ0NiwxMjkuOTY5eiAgIE0yNDQuMTg1LDEyNi4wMzFoMTU3LjUzOGM0LjMzMiwwLDcuODc3LTMuNTQ1LDcuODc3LTcuODc3cy0zLjU0NS03Ljg3Ny03Ljg3Ny03Ljg3N0gyNDQuMTg1Yy00LjMzMiwwLTcuODc3LDMuNTQ1LTcuODc3LDcuODc3ICBTMjM5Ljg1MiwxMjYuMDMxLDI0NC4xODUsMTI2LjAzMXogTTQwMS43MjMsMTQxLjc4NUgyNDQuMTg1Yy00LjMzMiwwLTcuODc3LDMuNTQ1LTcuODc3LDcuODc3czMuNTQ1LDcuODc3LDcuODc3LDcuODc3aDE1Ny41MzggIGM0LjMzMiwwLDcuODc3LTMuNTQ1LDcuODc3LTcuODc3QzQwOS42LDE0NS4zMjksNDA2LjA1NSwxNDEuNzg1LDQwMS43MjMsMTQxLjc4NXogTTM2Mi4zMzgsMTczLjI5MkgyNDQuMTg1ICBjLTQuMzMyLDAtNy44NzcsMy41NDUtNy44NzcsNy44NzdzMy41NDUsNy44NzcsNy44NzcsNy44NzdoMTE4LjE1NGM0LjMzMiwwLDcuODc3LTMuNTQ1LDcuODc3LTcuODc3ICBDMzcwLjIxNSwxNzYuODM3LDM2Ni42NzEsMTczLjI5MiwzNjIuMzM4LDE3My4yOTJ6Ii8+CjxwYXRoIHN0eWxlPSJmaWxsOiNFMjU3NEM7IiBkPSJNMzEzLjUwMiw0My4zMjNsMjUuMjA2LTMxLjUwOGg1NS4xMzhMMzY4LjY0LDQzLjMyM0gzMTMuNTAyeiBNMTA4LjcwMiw0My4zMjNsMjUuMjA2LTMxLjUwOGg1NS4xMzggIEwxNjMuODQsNDMuMzIzSDEwOC43MDJ6Ii8+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+Cjwvc3ZnPgo=);
}

к содержанию ↑

Шаг 3: добавляем jQuery

jQuery(function(){
    jQuery('.main-button').click(function(){
		$('.button-wrapper').addClass('clicked');
		setTimeout(function(){
			$('.layered-content').addClass('active');
		}, 1500);
	});
	$('.close-button').on('click', function(){
		$('.button-wrapper').removeClass('clicked');
		$('.layered-content').removeClass('active');
	});
	// классы для кнопки отправить
	$('.send').on('click', function(){
		$('.text').addClass('active');
		$('.send').addClass('active');
		$('.loader').addClass('active');
		$('.send').delay(1700).queue(function(){
    	    $(this).addClass('finished').clearQueue();
		});
	
		$('.done').delay(1600).queue(function(){
    		$(this).addClass('active').clearQueue();
		});
	})
});

Хочется отметить, что форма будет прекрасно смотреться, если будет работать на ajax — без перезагрузки.

4 коментариев к записи

Добавить комментарий