Привет друзья! Сегодня хочу поделиться тем, как сделать кнопку обратного звонка на сайт с всплывающим модальным окном, формой обратной связи, маской для телефона в инпуте формы, возможностью выбрать дату и время обратного звонка.
Кнопка обратного звонка – это неотъемлемый элемент коммерческого сайта. Она улучшает поведенческие характеристики веб-ресурса, с её помощью можно быстро связаться с клиентом. Весь этот несложный интерфейс коммуникации состоит из двух элементов: самой кнопки с текстом «Заказать звонок» и всплывающей формы обратной связи в модальном окне.
Форма состоит из трёх текстовых полей (инпутов), куда пользователь вводит своё имя и телефон. В поле input с type=»tel» будет маска с выводимым по умолчанию кодом страны по определённому формату.
Нажав на кнопку «Заказать звонок», пользователь увидит вот такую аккуратную форму с полями для заполнения.

Так же я сделаю ещё один input с тайпом “datetime—local” для отображения выпадающего календаря с выбором даты и времени. Таким образом можно предоставить клиенту возможность выбрать удобное для него время звонка. Однако в html коде я закомментирую этот input, а если кому то он будет нужен, то может раскомментировать строку кода и пользоваться этим функционалом. В файлах php обработчика и в таблице стилей это поле будет подключёно.
Выглядеть это будет вот так.

Разбиваем работу над кнопкой вызова на этапы
Создание кнопки обратного звонка можно разделить на семь этапов.
- Выбор java script плагина, отвечающего за вызов модального окна.
- Подключение и редактирование html и js кода.
- Оформление внешнего вида кнопки и формы обратной связи с помощью css стилей.
- Подключение php кода обработчика формы.
- Подключение маски для телефона.
- Настройка ajax – будем отправлять данные с формы без перезагрузки страницы.
- Подключение или отключение поля с календарём (датой и временем).
Выбираем плагин js
В интернете сейчас есть много решений, с помощью которых можно сделать вызов модального окна. Например, в библиотеке фреймворка bootstrap встроен плагин Modal. Чтобы его подключить нужно скачать фреймворк bootstrap. Он будет встроен в минифицированный файл bootstrap.min.js. Или скачать можно сам плагин, найдя его в разделе Настройки — Компоненты java script.

Так же модальное окно вызывается с помощью плагина fancybox,

или Remodal.

Существует ещё много скриптов, вызывающих всплывающее окно на сайте. На нескольких своих проектах я использовал плагин remodal, но недавно, когда делал сайт визитку, плагины remodal и fancybox вступили в конфликт с другими js скриптами. В частности после их установки перестал работать плавный скролл на сайте.
После поисков различных решений я нашёл плагин Magnific Popup. Установив его я понял, что всё работает отлично и никаких конфликтов с другими скриптами нет. Следовательно скачиваем данный плагин с гитхаба https://github.com/dimsemenov/Magnific-Popup и в папку js своего сайта вставляем минифицированный файл jquery.magnific-popup.min.js, а в папку с css вставляем файл со стилями magnific-popup.css. Затем подключем их в html коде. Всё, файлы подключены.
Адаптируем html код плагина под свой проект
HTML код плагина берём с примеров на главной странице magnific popup http://dimsemenov.com/plugins/magnific-popup/. Можно скопировать код с раздела Popup with form или Modal Popup. Я решил взять только часть кода для «обёртки» с образца в Modal Popup потому, что контактную форму сделаю простую сам.

Форма, что приводится в разделе Popup with form имеет много лишнего кода и перегружена всякими филдсетами, тегами ol, li и лейблами, которые занимают только лишнее место. Зачем писать «Ваше имя» в теге lable, если это можно сделать прямо в атрибуте placeholder input?
Итак, копируем здесь же javascript код, создаём файл main.js и вставляем его сюда.
$(function () {
$('.popup-modal').magnificPopup({
type: 'inline',
preloader: false,
focus: '#username',
modal: true
});
$(document).on('click', '.popup-modal-dismiss', function (e) {
e.preventDefault();
$.magnificPopup.close();
});
});Чтобы в форме обратной связи показывалась кнопка крестик, для её закрытия нужно строку modal: true переделать на modal: false,
и под ней вставить эту showCloseBtn: true
В общем должен получиться такой код
$(function () {
$('.popup-modal').magnificPopup({
type: 'inline',
preloader: false,
focus: '#username',
modal: false,
showCloseBtn: true
});
$(document).on('click', '.popup-modal-dismiss', function (e) {
e.preventDefault();
$.magnificPopup.close();
});
});Далее подключаем файл main.js внизу страницы с помощью тега script. А в html коде берём только код ссылки и обёртку, остальное удаляем.

Получилcя такой код:
<!-- это код кнопки --> <a class="popup-modal button" href="#form">Обратный звонок</a> <!-- А это код формы в «обёртке» --> <div id="magnific-modal" class="white-popup-block mfp-hide clearfix"> <div class="mfpcontentBorder"> <a class="popup-modal-dismiss" href="#"><i class="fa fa-times" aria-hidden="true"></i></a> <form id="form"> <p class="title">Оставьте ваш номер<br> и я перезвоню вам</p> <input type="text" class="putName" name="name" placeholder="Ваше имя" required> <input type="tel" class="putPhone" name="phone" placeholder="Ваш телефон" required> <!--<input type="datetime-local" class="putNumber" name="date" value="2017-12-09">--> <input type="submit" name="submit" class="btn" value="ЗАКАЗАТЬ ЗВОНОК"> <input type="hidden" name="formData" value="Заявка с сайта"> </form> </div> </div>
Сюда я вставил ещё три тега input: один будет функционировать в качестве кнопки, другой будет скрытым, а третий закомментированный — это инпут с выводом даты и времени. Атрибут ссылки href=”#form” нацелен на id=”form” формы обратной связи. Css класс popup-modal связует форму с ajax. Здесь всё.
Оформляем кнопку и форму стилями css
Далее привожу пример css стилей с помощью которых я оформил внешний вид формы. Бекграундом для формы я сделал фотографию, а инпуты и кнопку в ней немного прозрачными.
@import url("font-awesome.min.css");
@import url("https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,300italic,400,600");
body {
background-color: #191515;
background: radial-gradient(white, #FFA9A1) repeat-y;
height: 700px;
}
.button {
display: inline-block;
position: relative;
min-width: 178px;
margin: 6px 28px;
padding: 15px 40px;
font-weight: 800;
font-family: sans-serif;
font-size: 14px;
text-transform: uppercase;
letter-spacing: 1px;
color: #AB274F;
transition: .15s ease-out;
box-sizing: border-box;
text-decoration: none;
font-family: Alice, serif;
text-shadow: #a58383 2px 2px 2px;
letter-spacing: 2px;
}
.button:hover {
color: #ec1355!important;
}
.button:last-of-type {margin: 6px 28px;}
.button:before {
content:"";
position: absolute;
top: -6px;
left: 0;
height: calc(100% + 12px);
width: 100%;
border: 2px solid #AB274F;
box-sizing: border-box;
transition: .2s ease-in-out;
}
.button:after {
content:"";
position: absolute;
top: 0;
left: -8px;
height: 100%;
width: calc(100% + 16px);
border: 1px solid #AB274F;
box-sizing: border-box;
transition: .2s ease-in-out;
}
.button:hover:before {
top: 0;
left: -8px;
height: 100%;
width: calc(100% + 16px);
}
.button:hover:after {
top: -6px;
left: 0;
height: calc(100% + 12px);
width: 100%;
}
.button:hover{
color:#AB274F;
}
.panel-grid-cell section {
padding: 80px 0;
z-index: 999;
text-align: center;
}
input[type="button"]:hover,
input[type="submit"]:hover,
input[type="reset"]:hover,
button:hover,
.btn:hover {
background-color: #9ececc;
}
.mfp-close-btn-in .mfp-close {
color: #999!important;
}
/* modal windows */
div > a.popup-modal.button[href="#form"] {
text-transform: uppercase;
padding: 0.75em 2em 0.75em 2em;
text-decoration: none;
margin-top: 100px;
}
.mfp-content {
background-image: url("../images/callback_bg.jpg")!important;
position: relative;
display: inline-block;
vertical-align: middle;
margin: 0 auto;
text-align: center!important;
background: #2f3847;
max-width: 280px;
z-index: 1045;
height: auto;
padding: .8%;
border-radius: 4px;
}
a.popup-modal-dismiss {
position: absolute;
top: 0;
left: 0;
overflow: visible;
cursor: pointer;
-webkit-transition: color 0.2s;
transition: color 0.2s;
text-decoration: none;
color: #95979c;
border: 0;
background: transparent;
}
.mfpcontentBorder {
max-width: 310px;
border: 1px solid #e1e1e1;
padding: 4% 5% 0.8%;
}
.fa-times:hover {
content: "\f00d";
color: #F7943C;
}
.fa-times{
padding: 15px 0px 0px 18px;
display: inline-block;
}
.putNumber, .putName, .putPhone {
width: 210px!important;
padding: 9px 10px!important;
height: 40px!important;
background: rgba(255, 255, 255, 0.62)!important;
margin-bottom: 15px;
border-radius: 2px!important;
border: none!important;
outline: none!important;
margin: 10px auto;
font-family: Alice, serif;
font-size: 18px;
}
input.putName:focus, input.putPhone:focus {
box-shadow: 0 0 2px 1px #FFCC00!important;
}
#form > input.btn {
margin-top: 10px;
}
p.title {
margin: 15px 10px 2px!important;
color: #e1e1e1!important;
font-family: Marck Script, cursive!important;
line-height: 1.4!important;
font-size: 22px;
}
#form {
border: 1px solid #e1e1e1;
border-radius: 4px;
}
input.btn {
width: 210px;
height: 40px;
background: rgba(229, 115, 115, 0.78);
margin: 10px 0px 15px!important;
border-radius: 2px;
border: none;
outline: none;
color: #fff;
cursor: pointer;
line-height: 1;
}
input.btn:hover {
color: #000;
}Php обработчик формы
Php обработчик формы обратной связи будет называться mail.php. На него будет нацелен ajax.
<?php $recepient = "vashapochta@gmail.com"; /* почта получателя */ $sitename = "vashsaite.ru"; /* сайт с которого пришло письмо */ $name = trim($_POST["name"]); $phone = trim($_POST["phone"]); $date = trim($_POST["date"]); $pagetitle = "Заявка с формы обратного звонка на сайте \"$sitename\""; $message = "Имя: $name \nТелефон: $phone \nДата звонка: $date"; mail($recepient, $pagetitle, $message, "Content-type: text/plain; charset=\"utf-8\"\n From: $recepient");
Скрипт маски для телефона
В файл main.js вставьте этот код
$('input[name="phone"]').mask("+38 (099) 999-99-99");
По умолчанию здесь настроен телефонный код Украины, но если вы с России или другой страны, вы можете изменить первые цифры кода на свои. Так же, что бы маска работала нужно подключить к html файлу файл maskedinput.min.js. Я его выложу в конце статьи со всеми файлами.
Ajax
Код ajax можно вставить в файл, main.js, который уже подключен. Вставляем его ниже кода плагина magnific popup.
/E-mail Ajax Send
$("#form").submit(function() { //Change
var th = $(this);
$.ajax({
type: "POST",
url: "mail.php", //Change
data: th.serialize()
}).done(function() {
alert("Спасибо за ваш отклик!");
setTimeout(function() {
// Done Functions
th.trigger("reset");
}, 1000);
});
return false;
});Если вы всё правильно сделали, то должно всё работать. Кнопку, вызывающую форму обратной связи можно изменить, прописав ей свои стили. На всякий случай выложу zip файл для скачивания с кодом кнопки обратного звонка. Удачи вам!



Спасибо вам огромное!!!Очень помогли,искал,наверное часа 2 такую готовую кнопку!Спасибо,друг!
Павел, спасибо за коммент, рад помочь.