ГлавнаяИнструментыМаркетингГенератор всплывающего окна
Всплывающее окно на сайт — генератор кода
Выберите, зачем окно нужно, где оно появляется и что его вызывает — и заберите три блока кода, которые можно вставить в любой сайт: модальное окно, карточку в углу или полосу сверху. Внутри уже сделано то, что чаще всего забывают в самодельных попапах: окно объявлено диалогом, фокус уходит внутрь и не выходит по Tab, Esc закрывает, а после закрытия фокус возвращается туда, где человек был. Частота показа ограничена, поэтому закрывший окно не увидит его на следующей странице.
—
Окно в рамке настоящее, вместе с триггером: при доскролле — прокрутите рамку, при уходе курсора — выведите курсор за её верхний край. Нажмите Esc или Tab, чтобы проверить клавиатуру. «Показать заново» перезапускает страницу с нуля, потому что ограничение частоты работает и здесь.
Что уже сделано за вас
Как это устроено. Окно лежит в разметке с атрибутом hidden, скрипт снимает его по триггеру и только после проверки частоты показа — поэтому закрывший окно не видит его снова. Пока окно открыто, остальная часть страницы получает aria-hidden, документ перестаёт прокручиваться, а Tab ходит по кругу внутри окна. При закрытии всё возвращается на место, включая фокус.
Расчёт идёт в вашем браузере — введённые данные никуда не отправляются.
Как пользоваться
- Выберите цель и форматЦель задаёт поля: подписке нужна только почта, заявке — имя и телефон, объявлению не нужно ничего. Формат решает, насколько вы мешаете: модальное окно перекрывает страницу, карточка в углу и полоса сверху — нет.
- Задайте триггерДоскролл до половины страницы — самый спокойный вариант: окно видит тот, кто читает. Задержка проще, но ставьте её не меньше пяти секунд. Уход курсора работает только на компьютере, на телефоне подставится задержка.
- Ограничьте частотуОдин раз в N дней — это разница между инструментом и раздражителем. Отсчёт идёт от закрытия, значение хранится в localStorage, доступ к нему обёрнут в try/catch: в приватном режиме он падает.
- Заполните согласие и заберите кодЕсли окно собирает почту или телефон, впишите оператора и ссылку на политику. Дальше три блока: HTML в конец body, CSS в стили, JS перед закрывающим тегом body.
Когда показывать окно
Триггер решает больше, чем текст. Одно и то же предложение в первую секунду читается как помеха, а после половины прочитанной статьи — как уместное продолжение.
- Доскролл до 50–70%. Лучший вариант по умолчанию. Человек, доехавший до середины, уже решил, что текст ему нужен, и предложение попадает в интерес, а не перебивает его.
- Задержка. Проще всего настроить и проще всего испортить. Окно на второй секунде показывают людям, которые ещё не поняли, куда попали, — это и есть тот самый попап, который все закрывают не читая. Пять секунд — нижняя граница, десять-пятнадцать честнее.
- Уход курсора. Срабатывает, когда курсор уходит за верхний край окна — в адресную строку или к закрытию вкладки. Ловит уже уходящего, поэтому ничего не отнимает у читающих. Работает только на компьютере: на телефоне курсора нет, и любой «exit-intent для мобильных» — это таймер под другим названием. В сгенерированном коде для мобильных так и сделано, честной задержкой.
- Клик по элементу. Формально не всплывающее окно, а модальное по запросу — и самый безобидный формат. Конверсия к показам у него высокая просто потому, что окно видят только те, кто сам нажал.
Отдельно про частоту. Показ без ограничения — самая частая техническая ошибка в самодельных попапах: человек закрыл окно, перешёл на вторую страницу и получил его снова. Это ломает не конверсию, а отношение к сайту. В коде ограничение стоит до отрисовки, а не после, поэтому окно не успевает мигнуть.
Модальное окно и клавиатура: шесть вещей, без которых оно сломано
Всплывающее окно — это диалог, и у диалога есть обязанности. Ни одна из них не видна глазами, поэтому их и пропускают.
- Окно объявлено диалогом.
role="dialog",aria-modal="true"иaria-labelledby, указывающий на заголовок. Иначе скринридер читает содержимое как обычный кусок страницы, не сообщая, что открылось окно. - Фокус входит внутрь. При открытии фокус переводится на первое поле или кнопку. Без этого человек на клавиатуре остаётся там, где был, и Tab гуляет по странице за окном.
- Фокус не выходит. Ловушка: Tab с последнего элемента возвращается на первый, Shift+Tab с первого — на последний. Это та часть, которую почти никогда не пишут руками, и именно из-за неё модальные окна недоступны с клавиатуры.
- Фокус возвращается. При закрытии — ровно на тот элемент, с которого окно открыли. Иначе фокус падает в начало документа, и человек заново проходит всю страницу.
- Esc закрывает. И клик по затемнению тоже. Крестик — настоящая кнопка с
aria-label, а не<div>с обработчиком: по<div>нельзя попасть табом и нельзя нажать пробелом. - Страница под окном выключена. Пока окно открыто, документ не прокручивается, а остальные узлы получают
aria-hidden. Без этого скринридер продолжает ходить по тексту за окном, а на телефоне страница уезжает под пальцем.
Проверить всё это можно за минуту и без инструментов: откройте окно, пройдите его Tab'ом по кругу дважды, нажмите Esc и посмотрите, куда попал фокус. Если фокус вышел на страницу за окном или после закрытия оказался в начале документа — окно сломано, как бы оно ни выглядело.
Цвета кнопки и текста ошибки должны проходить контраст: текст — 4,5:1 к фону, рамка поля с ошибкой — 3:1. Подобрать пару можно в палитре интерфейса, проверить отдельную — в проверке контраста.
Текст в окне: три строки, которые всё решают
У окна есть три строки и примерно одна секунда. Заголовок должен говорить, что человек получит, а не что вы делаете.
Разница не в вежливости, а в том, что во втором варианте названа цена и польза. «Раз в две недели» снимает страх ежедневных писем. «За 15 минут» — обещание, по которому вас можно проверить.
- Кнопка называет результат. «Забрать промокод», «Жду звонка» — а не «Отправить» и не «ОК». Надпись на кнопке читают чаще, чем подзаголовок.
- Снимите возражение в подзаголовке. Что будет с почтой, как часто придут письма, будете ли звонить повторно. Одна такая фраза работает лучше, чем усиление заголовка.
- Не делайте закрытие стыдным. Второй вариант кнопки в духе «Нет, я не хочу экономить» — это приём, который запоминается плохо и про сайт, а не про предложение.
- Не обещайте того, чего не будет. Обещанный за 15 минут звонок, который не случился, стоит дороже, чем не полученная заявка.
Заготовки в генераторе написаны по этим правилам — их можно оставить как есть или переписать в полях «Текст в окне». Если переписываете и хотите проверить, не получилось ли канцелярита, прогоните текст через проверку читаемости.
Согласие на обработку данных и мобильный поиск
Два ограничения снаружи, о которых стоит знать до того, как вы поставите окно.
Персональные данные. Почта и телефон — персональные данные, и их сбор по закону № 152-ФЗ требует конкретного и осознанного согласия. На практике это отдельный чекбокс, не отмеченный заранее, с названным оператором, перечнем данных, целью и ссылкой на опубликованную политику. Согласие на ответ по заявке не даёт права на рассылку: для неё нужна отдельная галочка со своей формулировкой. Подробнее это разобрано на странице генератора формы обратной связи — там же лежит полный текст согласия, который подставляется и здесь.
Мобильная выдача. С 2017 года у Google действует отдельная мера против навязчивых межстраничных блоков (intrusive interstitials) на мобильных: окно, которое закрывает основной контент сразу после перехода из поиска, может стоить странице позиций. Под неё не попадают окна по действию пользователя и небольшие баннеры, занимающие разумную долю экрана. Отсюда практический вывод: модальное окно на весь экран сразу после загрузки — худшая комбинация из возможных, а полоса сверху или карточка в углу с доскроллом безопасны.
Поэтому в генераторе задержка меньше пяти секунд помечается предупреждением, а не молча принимается.
Когда всплывающее окно не работает
Попап — не всегда плюс к конверсии. Есть случаи, где он честно вредит, и лучше знать их заранее.
- Когда трафика мало. Чтобы отличить конверсию 2% от 3% на уровне, которому можно верить, нужны тысячи показов. На сотне визитов в месяц любой результат — шум: вы увидите «2 заявки вместо 1» и решите, что попап работает, хотя это разница в одного человека. Посчитать нужный объём можно в калькуляторе A/B-тестов.
- Когда окно собирает контакты, с которыми никто не работает. Попап поднимает число адресов в базе, а не выручку. Если письма не уходят или уходят через месяц, вы получили список людей, которые вас забыли, и испортили первое посещение сайта. Это самая частая причина, по которой попап «не сработал».
- Когда предложение не связано со страницей. Скидка на первый заказ на странице «Доставка и возврат» — человек читал условия, а ему предложили купить. Попап усиливает намерение, которое уже есть; создать его он не может.
- В поддержке и в личном кабинете. Там человек пришёл с проблемой. Окно с рассылкой поверх экрана, где он ищет, как отменить заказ, читается как издевательство, и именно оттуда приходят жалобы.
- На платном трафике с узким запросом. Вы заплатили за переход человека, готового купить, и перекрыли ему товар просьбой подписаться. Здесь попап отнимает деньги напрямую.
- Когда его ставят вместо исправления страницы. Если люди уходят из-за непонятной цены, отсутствия отзывов или сломанной формы, окно поверх этой страницы ничего не лечит — оно только собирает адреса тех, кто всё равно бы ушёл.
Отдельно про числа. Вендоры попап-сервисов публикуют сводки со средней конверсией около 3% и лучшими результатами около 9–10%. Это данные самих вендоров по своим клиентам, то есть по сайтам, которые уже решили ставить попапы и настраивают их; как оценка того, что получится у вас, они не годятся. Ориентироваться стоит на собственный замер: поставьте окно на половину трафика и сравните не число подписок, а выручку на посетителя.
И последнее: попап решает задачу «получить контакт, пока человек здесь». Задачу «объяснить, как пользоваться продуктом» он не решает — для этого нужны подсказки и туры внутри интерфейса, а не окно на входе. Разница разобрана в статье про продуктовый онбординг.
Куда вставлять код
Три блока, и порядок важен:
- HTML — в конец
<body>, перед скриптом. Если окно лежит внутри контейнера сoverflow: hiddenилиtransform, оно обрежется:position: fixedсчитается от такого предка, а не от окна браузера. - CSS — в общий файл стилей или в
<style>в<head>. Все классы начинаются с одного префикса, поэтому со стилями сайта они не столкнутся. - JS — в конце
<body>, после разметки окна. Скрипт ищет окно по идентификатору при запуске и молча выходит, если не нашёл.
В конструкторах то же самое, но через блок произвольного кода: в Тильде это блок T123 «HTML-код», в WordPress — блок «Произвольный HTML» или файл шаблона, в Битриксе — включаемая область. Инструкции по установке без разработчика собраны отдельно: поп-ап без программиста и поп-ап на Тильде.
Если на странице уже есть другое всплывающее окно, следите за z-index: у сгенерированного стоит 9999. И проверьте, что у вас не два окна с одинаковыми идентификаторами полей — иначе label for начнёт указывать не туда.
Источники
- W3C. WAI-ARIA Authoring Practices Guide — Dialog (Modal) Pattern: role, aria-modal, перевод и возврат фокуса, ловушка фокуса, Esc.
- W3C. Web Content Accessibility Guidelines (WCAG) 2.2 — критерии 2.1.2 (без ловушки клавиатуры), 2.4.3 (порядок фокуса), 2.4.7 (видимый фокус), 3.3.1 (определение ошибки), 1.4.3 (контраст).
- Google Search Central. Helping users easily access content on mobile — мера против навязчивых межстраничных блоков, действует с января 2017 года.
- Федеральный закон от 27.07.2006 № 152-ФЗ «О персональных данных» — статьи 9 (согласие), 18.1 (политика оператора).
- HTML Living Standard — атрибуты hidden, novalidate, autocomplete, inputmode; Web Storage API и исключения при отключённом хранилище.
Частые вопросы
Как сделать всплывающее окно на сайте без плагинов?
Нужны три блока: разметка окна с атрибутом hidden, стили и скрипт, который снимает hidden по триггеру и проверяет, не закрывал ли человек окно раньше. Генератор на этой странице собирает все три под ваши настройки — это чистый HTML, CSS и JavaScript без зависимостей, он работает в любом сайте, включая конструкторы.
Через сколько секунд показывать всплывающее окно?
Не раньше пяти, а лучше через десять-пятнадцать. Окно на второй секунде видит человек, который ещё не понял, куда попал, и закрывает его не читая. Если есть выбор, вместо задержки берите доскролл до 50–70%: тогда окно видит тот, кто уже читает страницу.
Всплывающие окна портят позиции в поиске?
Могут — но не любые. С 2017 года у Google действует мера против навязчивых межстраничных блоков на мобильных: под неё попадает окно, перекрывающее контент сразу после перехода из поиска. Окна, которые человек открыл сам, и небольшие баннеры на разумной доле экрана под неё не попадают. Модальное окно на весь экран без задержки — худший вариант, полоса сверху или карточка в углу с доскроллом — безопасный.
Как сделать, чтобы окно не показывалось повторно?
Записать факт закрытия в localStorage с датой и проверять её до показа. В генераторе это режим «один раз в N дней»: отсчёт идёт от закрытия. Доступ к хранилищу обёрнут в try/catch, потому что в приватном режиме и при заблокированных cookies обращение к нему выбрасывает исключение — без обёртки это ломает весь скрипт.
Работает ли exit-intent на телефоне?
Нет. Уход курсора за верхний край окна — событие мыши, а на телефоне курсора не существует. Всё, что продаётся как «exit-intent для мобильных», на деле таймер или реакция на быструю прокрутку вверх. В сгенерированном коде для устройств без мыши честно подставлена задержка, и это видно в самом коде.
Нужен ли чекбокс согласия в окне подписки?
Если окно собирает почту или телефон — да. Закон № 152-ФЗ требует конкретного и осознанного согласия: отдельный чекбокс, не отмеченный заранее, названный оператор, перечень данных, цель и ссылка на опубликованную политику. Согласие на ответ по заявке не покрывает рассылку — под неё нужна отдельная галочка.
Почему окно нельзя просто сделать на div с display none?
Визуально можно, но такое окно недоступно с клавиатуры и для скринридера: оно не объявлено диалогом, фокус в него не входит и из него выходит по Tab, Esc не закрывает, а после закрытия фокус падает в начало документа. Это не придирка — так модальное окно становится непроходимым для части людей. В сгенерированном коде все шесть пунктов закрыты, и их видно в списке «Что уже сделано за вас».
Можно ли поставить код на Тильду или WordPress?
Да, это обычный HTML, CSS и JS. В Тильде — через блок T123 «HTML-код», в WordPress — через блок «Произвольный HTML» или шаблон темы, в Битриксе — через включаемую область. Следите только за тем, чтобы окно не оказалось внутри контейнера с overflow: hidden или transform: position: fixed начнёт считаться от него, и окно обрежется.
Ещё в разделе «Маркетинг»
- Генератор UTM-меток
Как собрать единообразные UTM-ссылки для каждой кампании и канала?
- UTM-метки для Яндекс Директа
Какие макросы Директа поставить в метки и что из них испортит отчёт Метрики?
- UTM-метки для Тильды
Как разметить ссылку на лендинг Тильды и довести метку до заявки из формы?
- UTM-метки для Яндекс Метрики
Как эта ссылка ляжет в отчёт «Метки UTM» и что в ней ломает склейку источников?
- Генератор Open Graph
Какие теги Open Graph нужны странице и как будет выглядеть превью ссылки?
- Проверка сниппета
Как заголовок и описание будут выглядеть в поиске и не обрежутся ли они?
- Проверка темы письма
Поместятся ли тема письма и прехедер во входящих на телефоне и компьютере?
- Транслитерация и генератор ЧПУ
Как превратить заголовок на кириллице в чистый адрес страницы?
- QR-коды с UTM-метками
Какое место на выставке или какая листовка привели посетителей — и как пометить каждый QR-код?
- Генератор QR-кодов
Как сделать QR-код для ссылки, Wi-Fi или визитки, который никогда не истечёт?
- Калькулятор юнит-экономики
Зарабатываете вы на каждом клиенте или заказе — или доплачиваете за него?
- Калькулятор окупаемости CAC
За сколько месяцев новый клиент окупит стоимость привлечения?
- Калькулятор LTV и CAC
Окупает ли клиент затраты на своё привлечение?
- Калькулятор конверсии триала в оплату
Сколько выручки добавит рост конверсии из триала в оплату?
- Калькулятор вирусного коэффициента
Приводит ли каждый пользователь достаточно новых для вирусного роста?
- Калькулятор A/B-тестов
Значима ли разница между A и B и сколько пользователей нужно для теста?
- Проверка читаемости текста
Насколько текст сложен для чтения и какие предложения слишком длинные?
- Калькулятор NPS, CSAT и CES
Какой NPS у этих ответов и какова погрешность?
- Генератор формы обратной связи
Какой код формы обратной связи поставить на сайт, чтобы она проверяла поля и собирала согласие по 152-ФЗ?