Выплывающая форма обратной связи — PROG-TIME

Выплывающая форма обратной связи

26.05.2022
Содержание:

Готовая форма обратной связи с отправкой сообщения через ajax. Данная форма будет выплывать с правой стороны через 5 секунд после полной загрузки страницы. Форма написана на jQuery + PHP + HTML + CSS.

Нужна помощь?
Закажите обратный звонок и мы перезвоним для консультации
через 5 мин.
Спасибо!
Сообщение успешно отправлено, в ближайшее время менеджеры свяжутся с вами по указанному номеру телефона

HTML код для формы

Форма состоит из поля телефона и кнопки отправки. Сам контент разделён на две части .conteinerForm, эта часть хранит в себе форму и .messageGoodSend — блок в котором написано сообщение о удачной отправки.


<div class="fixedCallBackForm_conteiner">
	<div class="butExit">
		<svg viewBox="5 5 25 20" xmlns="http://www.w3.org/2000/svg"><title></title><g data-name="Layer 2" id="Layer_2"><path d="M10.1,23a1,1,0,0,0,0-1.41L5.5,17H29.05a1,1,0,0,0,0-2H5.53l4.57-4.57A1,1,0,0,0,8.68,9L2.32,15.37a.9.9,0,0,0,0,1.27L8.68,23A1,1,0,0,0,10.1,23Z"></path></g></svg>
	</div>

	<div class="conteinerForm active">
		<div class="headingForm">Нужна помощь?</div>
		<div class="dopHeadingForm">Закажите обратный звонок и мы перезвоним для консультации<br>через 5 мин.</div>
		<form id="formFixedCallBack" onsubmit="return false" action="">
			<input type="hidden" name="pageUrl" value="<?=$GLOBALS['urlThisPage'] ?>">
			<input type="tel" name="phone" placeholder="Ваш телефон">
			<input class="button" type="submit" value="Отправить">
		</form>
	</div>
	
	<div class="messageGoodSend">
		<div class="textContent">
			<div class="headingForm">Спасибо!</div>
			<div class="dopHeadingForm">Сообщение успешно отправлено, в ближайшее время менеджеры свяжутся с вами по указанному номеру телефона</div>
		</div>
	</div>

</div>

CSS стили для формы

В качестве анимации для открытия и закрытия модального окна, я использую эффект slide.

Для получения кодов анимации, воспользуйтесь моим удобным конструктором — https://prog-time.ru/css_animation_generator/



.fixedCallBackForm_conteiner {
	transform: translateX(100%);
	width: 300px;
    position: fixed;
    right: 0px;
    top: 50%;
    padding: 25px 20px 40px;
    background: #fff;
	border-radius: 5px 0 0 5px;
	box-shadow: 0 0 8px rgb(0 0 0 / 30%);
	z-index: 1000;
}
.fixedCallBackForm_conteiner .butExit {
    position: absolute;
    right: 10px;
    top: 15px;
    cursor: pointer;
    transform: rotate(180deg);
    height: fit-content;
}
.fixedCallBackForm_conteiner .butExit svg {
    width: 45px;
    height: 20px;
}
.fixedCallBackForm_conteiner .butExit:hover svg {
	height: 20px;
}
.fixedCallBackForm_conteiner .conteinerForm {
	display: none;
}
.fixedCallBackForm_conteiner .conteinerForm.active {
	display: block;
}
.fixedCallBackForm_conteiner .messageGoodSend {
	display: none;
}
.fixedCallBackForm_conteiner .messageGoodSend.active {
	display: block;
}
.fixedCallBackForm_conteiner .messageGoodSend .textContent {
	text-align: center;
}   

@-webkit-keyframes slideOutRight {
    0% {
      -webkit-transform: translateX(0);
              transform: translateX(0);
    }
    100% {
      visibility: hidden;
      -webkit-transform: translateX(100%);
              transform: translateX(100%);
    }
}
@keyframes slideOutRight {
	0% {
		-webkit-transform: translateX(0);
				transform: translateX(0);
	}
	100% {
		visibility: hidden;
		-webkit-transform: translateX(100%);
				transform: translateX(100%);
	}
}
.slideOutRight {
	-webkit-animation-name: slideOutRight;
		animation-name: slideOutRight;
		-webkit-animation-duration: 1s;
		animation-duration: 1s;
		-webkit-animation-fill-mode: both;
		animation-fill-mode: both;
}
@-webkit-keyframes slideInRight {
    0% {
      -webkit-transform: translateX(100%);
              transform: translateX(100%);
      visibility: visible;
    }
  
    100% {
      -webkit-transform: translateX(0);
              transform: translateX(0);
    }
}
@keyframes slideInRight {
	0% {
		-webkit-transform: translateX(100%);
				transform: translateX(100%);
		visibility: visible;
	}

	100% {
		-webkit-transform: translateX(0);
				transform: translateX(0);
	}
}
.slideInRight {
	-webkit-animation-name: slideInRight;
		animation-name: slideInRight;
		-webkit-animation-duration: 1s;
		animation-duration: 1s;
		-webkit-animation-fill-mode: both;
		animation-fill-mode: both;
}


.fixedCallBackForm_conteiner .headingForm {
	font-weight: 500;
	font-size: 20px;
    margin-bottom: 10px;
}
.fixedCallBackForm_conteiner .dopHeadingForm {
    line-height: 1.7rem;
    margin-bottom: 10px;
}
.fixedCallBackForm_conteiner form#formFixedCallBack {
    display: flex;
    flex-direction: column;
    row-gap: 10px;
}
.fixedCallBackForm_conteiner input[type="text"], input[type="tel"] {
    border: 1px solid #000;
    padding: 7px 13px;
    border-radius: 3px;
}

jQuery скрипт для формы

Здесь имеется несколько обработчиков для данной формы. Первый обрабатывает нажатие на стрелку и закрывает форму.

Второй обработчик нужен для проверки заполненности формы и отправки письма в PHP обработчик методом ajax запроса.

$(document).ready(function() {
    if($(".fixedCallBackForm_conteiner")) {

        $(".fixedCallBackForm_conteiner .butExit").on("click", function() {
            $(".fixedCallBackForm_conteiner").addClass("slideOutRight")
        })

        $(".fixedCallBackForm_conteiner #formFixedCallBack").on("submit", function() {
            let form = $(this)
            let formConteiner = $(".fixedCallBackForm_conteiner")
            let dataForm = form.serialize()
            $.post('/ajx/fixedCallBackForm.php', dataForm, function(data){
                formConteiner.find(".conteinerForm").removeClass("active")
                formConteiner.find(".messageGoodSend").addClass("active")

                setTimeout(() => {
                    $(".fixedCallBackForm_conteiner").removeClass("slideInRight")
                    $(".fixedCallBackForm_conteiner").addClass("slideOutRight")
                }, 5000);
            });

        })
        setTimeout(() => {
            $(".fixedCallBackForm_conteiner").addClass("slideInRight")
        }, 5000);
    }

})