Однажды, в процессе работы над продвижением одного проекта, перед нами встал вопрос: «Как сократить процент пользователей, которые уходят со страницы корзины не совершив дальнейших действий по оформлению заказа?». В результате обсуждения, было принято решение показывать всплывающее окно с предложением оставить email и получить скидку пользователям, подпадающим под ряд условий. В данном случае, условия были следующего характера: Определенные бренды, определенная сумма и определенные категории товаров. Стоит сразу заметить, что автор данной заметки не большой таких «агрессивных» форматов, как всплывающие окна, но в данном случае это было оправданной мерой. Также стоит заметить, что окно показывалось не при проведении мышью по невидимой полоске в верхней части экрана (обычно берется около 5px), а с задержкой в 6 после загрузки страницы (среднее время просмотра страницы пользователями, ушедшими с сайта со страницы корзины). Собственно, технической реализации данного модального окна и посвящена данная заметка (ну и + небольшой бонус в конце заметки).

Стоит заметить, что приведенный код содержит инлайновые стили (это просто дело привычки), лучше, конечно, вынести это в отдельное CSS-правило.
1. Html-разметка
<div class="overlay-window4" title="Кликните, чтобы закрыть окно"></div>
<div id="hbt-md-1" class="hbt-md-modal">
<div class="hbt-md-content">
<h3>ХОТИТЕ ДЕШЕВЛЕ?</h3>
<div>
<a id="hbt-md-close" style="font-size: 18px; color: white; cursor: pointer; position: absolute; top: 5px; left: 5px" title="Закрыть окно">X</a>
<div id="popup_text_hleb"><p>Оставьте свой email и мы дадим вам максимальную скидку на товары в вашей корзине!</p>
<form id="DiscountForm" style="margin: auto; text-align: center; vertical-align: middle;">
<input id="DiscountFormInput" name="DiscountFormInput" style="display: block; padding: 5px 0; width: 60%; margin: auto; color: black;" placeholder="Ваш email" required type="email">
<input id="DiscountFormProduct" name="DiscountFormProduct" value="<? //тут переменная названия товара ?>" type="hidden">
<button type="submit" class="hbt-md-submit">Отправить</button>
</form>
</div>
</div>
</div>
</div>
Контейнер с классом overlay-window4 — это подложка, затемняющая экран при появлении окна (больше она ничего не содержит). Само всплывающее окно — это контейнер hbt-md-modal, внутри которого содержится форма с двумя полями: input для ввода email и скрытое поле, которое принимает переменную названия товара в качестве значения. Стоит заметить, что для того, чтобы фиксировались все товары, находящиеся в корзине пользователя, нужно написать простенький цикл, который будет записывать название каждого товара в атрибут value с определенным разделителем (это может быть запятая, например).
2. Стили CSS
В данном подразделе приводятся стили для модального окна (вопросов приведенный код вызывать, по идее, не должен. По умолчанию окно имеет атрибут visibility: hidden. Потом, при выполнении условия, js-скрипт меняет значение на противоположное.
.hbt-md-modal{
background-color: #fff;
display: inline-block;
vertical-align:middle;
left: 50%;
opacity: 0;
width: 30%;
height: auto;
position: fixed;
text-align: justify;
top: 40%;
visibility: hidden;
z-index: 999999;
-webkit-transform: translate(-50%, -50%);
-moz-transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
-o-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
-webkit-transition: opacity .5s, top .5s;
-moz-transition: opacity .5s, top .5s;
-ms-transition: opacity .5s, top .5s;
-o-transition: opacity .5s, top .5s;
transition: opacity .5s, top .5s;
border-radius: 11px;
overflow: auto;
}
.hbt-md-content{
color: #fff;
background: #e74c3c;
position: relative;
border-radius: 3px;
margin: 0 auto;
}
.hbt-md-content h3 {
margin: 0;
padding: 0.4em;
text-align: center;
font-size: 2.4em;
font-weight: 300;
opacity: 1;
background: rgba(0,0,0,0.1);
border-radius: 3px 3px 0 0;
color: white;
}
.hbt-md-content > div {
padding: 15px 40px 30px;
margin: 0;
font-weight: 300;
font-size: 1.15em;
}
.hbt-md-submit{
display: block;
font-size: 0.8em;
border: none;
padding: 0.6em 1.2em;
background: #c0392b;
color: #fff;
letter-spacing: 1px;
text-transform: uppercase;
cursor: pointer;
display: inline-block;
margin: 7px 2px 3px 2px;
border-radius: 2px;
}
.overlay-window4 {
background-color: rgba(0, 0, 0, 0.7);
bottom: 0;
cursor: default;
left: 0;
opacity: 0;
position: fixed;
right: 0;
top: 0;
visibility: hidden;
z-index: 99999;
-webkit-transition: opacity .5s;
-moz-transition: opacity .5s;
-ms-transition: opacity .5s;
-o-transition: opacity .5s;
transition: opacity .5s;
}
3. JS-код
В приведенном ниже js-коде, первый блок отвечает за скрытие модального окна по кнопке «закрыть» и оверлею. При желании можно убрать из данной функции класс overlay-window4 и оставить только:
$('#hbt-md-close').click(function (){
И тогда окно будет закрываться только по кнопке «закрыть».
Далее идет, собственно, функция для вывода окна по прошествии необходимого времени (значение указывается в миллисекундах). И ajax-функция обработки входящей информации и отправки на контактный email и/или в БД сайта. Описание данной функции не совсем входит в тему данной заметки, но если тема интересна, то почитать об этом можно, например, тут.
<script>
$('#hbt-md-close, .overlay-window4').click(function (){
$('.hbt-md-modal, .overlay-window4').css({'opacity': 0, 'visibility': 'hidden'});
});
$(window).load(function() {
setTimeout(function(){
// вызвать модальное окно
$('.hbt-md-modal, .overlay-window4').css({'opacity': 1, 'visibility': 'visible'});
}, 6000);
});
$('#DiscountForm').submit(function(e){
var popup = $('#popup_text_hleb');
e.preventDefault();
$.ajax({
url: "/smthng.php",
type: "POST",
data: $('#DiscountForm').serialize(),
success: function(response) {
//обработка успешной отправки
popup.html('Ваше сообщение успешно отправлено!');
},
error: function(response) {
//обработка ошибок при отправке
}
});
});
</script>
4. Кратко об ограничениях для вывода окна
Если говорить об ограничениях (группе условий) для показа данного окна, основная мысль была в том, чтобы это окно показывалось только в том случае, если мы действительно могли бы дать скидку пользователю, оставившему свой email. Что же касается технической реализации, то тут все просто — группа условий if с логическими операторами ‘И’ и ‘ИЛИ’. В грубой форме это можно выразить следующим образом:
<? if(($PRICE >= 6000) AND (($BRAND_ID == 120 ) OR ($BRAND_ID == 121)): //кол-во условий можно расширить ?> <!-- Здесь код всплывающего окна --> <?endif;?>
В общих словах, логика условий индивидуальна для каждого проекта и должна разрабатываться исходя из текущих бизнес-задач.
Бонус. Вызов окна по клику на странице товара.
После получения положительных результатов, было решено расширить область применения данного окна. На карточку товара была добавлена дополнительная кнопка «Хочу дешевле!» и уже по клику на эту кнопку вызывалось окно.
Код самой кнопки:
<a href="#" class="want_discount"> <p style="padding: 10px 5px; margin: 5px 0px; background-color: #e74c3c; text-align: center; color: white; font-weight: 600; border-radius: 5px;">ХОЧУ ДЕШЕВЛЕ!</p> </a>
И модифицированный js-код. Соответственно, блок с вызовом окна по времени удаляется из скрипта.
$('#hbt-md-close, .overlay-window4').click(function (){
$('.hbt-md-modal, .overlay-window4').css({'opacity': 0, 'visibility': 'hidden'});
});
$('a.want_discount').click(function (e){
$('.hbt-md-modal, .overlay-window4').css({'opacity': 1, 'visibility': 'visible'});
});
На этом, в общем-то, и все. Приведенный выше код не привязан ни к какой-нибудь определенной CMS, и его, в принципе, можно использовать в любых проектах.