Запрос «видео во всплывающем окне тильда» чаще всего решается одним блоком T123 с небольшим куском своего кода: кнопка на странице открывает затемнённое окно, внутри него стартует ролик, а при закрытии окна звук гаснет. Я так делаю на лендингах, где видео-отзыв или обзор продукта должен открываться по клику, а не висеть на странице и тормозить загрузку. Ниже полный рабочий код, правила подключения кнопки и разбор мелочей, на которых обычно ломается мобильная версия.
По теме статьи
Готовое решение
Подсказки адреса DaData в форме Tilda
Посетитель начинает вводить адрес, и под полем появляются готовые варианты из базы DaData. Выбранная строка встаёт в поле целиком. Без jQuery, на бесплатном тарифе DaData.
Бесплатно
Кастомный скрипт
Когда стандартных блоков не хватает
Доработка сайтов на Тильде: скрипты для корзины, промокоды, зоны доставки, интеграции с CRM и Telegram. Простой скрипт от 3 000
от3 000 ₽
Как устроено всплывающее окно с видео на Тильде
Попап в Тильде это всегда блок на той же странице, скрытый до вызова. Отдельной страницы поверх другой нет, у окна нет своего URL. Штатные окна из категории «Форма» (BF501N, BF502N, BF503, BF504) заточены под формы и вызываются ссылкой вида #popup:имя. Для ролика проще и надёжнее собрать своё окно, потому что ключевое требование к нему другое: плеер должен создаваться в момент клика и уничтожаться при закрытии.
Почему именно так. Если вставить iframe с YouTube прямо в скрытый попап, браузер загрузит плеер при открытии страницы, хотя посетитель может ни разу не нажать кнопку. Это лишние запросы и просевшая скорость. Хуже другое: при закрытии такого окна ролик продолжает играть, и посетитель слышит звук с невидимого экрана. Если же iframe создаётся кликом и удаляется кнопкой закрытия, обе проблемы исчезают сами собой.
По схеме работы получается три части:
- кнопка или любой элемент со ссылкой вида
#video-promo, которую вы задаёте в обычных настройках блока Тильды; - блок T123 («Библиотека блоков», категория «Другое») с разметкой тёмной подложки и скриптом;
- адрес embed-версии ролика, который скрипт подставит в iframe в момент клика.
Тариф для этого не важен: вставка HTML-кода работает на платных тарифах, а Personal ничем не ограничен.
Подготовка: адрес ролика для встраивания
В iframe нужна не обычная ссылка на страницу видео, а адрес плеера. Для YouTube он выглядит так: https://www.youtube.com/embed/ИДЕНТИФИКАТОР, где идентификатор это часть после v= в обычной ссылке. Для RuTube формат https://rutube.ru/play/embed/ИДЕНТИФИКАТОР, идентификатор берётся из адреса страницы ролика. У VK Видео и Vimeo адреса встраивания тоже есть, их надёжнее копировать из пункта «Поделиться» самого сервиса, чем собирать по памяти.
Короткое сравнение того, что я учитываю при выборе площадки:
| Площадка | Откуда берётся адрес для iframe | На что смотрю |
|---|---|---|
| YouTube | адрес /embed/ID, либо «Поделиться → Встроить» |
доступность у вашей аудитории, параметр rel=0 убирает чужие рекомендации после ролика |
| RuTube | адрес /play/embed/ID |
работает без обходных путей у российской аудитории, автозапуск проверяю на каждом ролике отдельно |
| VK Видео | код встраивания из меню «Поделиться» | настройки приватности ролика, иначе окно останется пустым |
| Vimeo | «Share → Embed» на странице ролика | разрешён ли показ на сторонних доменах в настройках ролика |
Существует и вариант с самостоятельным хранением файла на хостинге и тегом video, но для маркетингового ролика на несколько минут площадка выгоднее: она сама подбирает качество под скорость соединения посетителя.
Код блока T123: кнопка, тёмный фон и закрытие
Добавьте на страницу блок T123 («Библиотека блоков → Другое») и вставьте в него код ниже. Разместить блок можно в любом месте страницы, например в самом низу: окно позиционируется по экрану, а не по блоку. В объекте videos слева ссылка, которую вы укажете на кнопке, справа адрес плеера.
<style>
.vp-overlay {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 99999;
display: none;
align-items: center;
justify-content: center;
padding: 20px;
background: rgba(0, 0, 0, 0.88);
}
.vp-overlay.vp-open { display: flex; }
.vp-box {
position: relative;
width: 100%;
max-width: 960px;
aspect-ratio: 16 / 9;
background: #000;
}
.vp-box iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border: 0;
}
.vp-close {
position: absolute;
top: -42px;
right: 0;
width: 36px;
height: 36px;
padding: 0;
border: 0;
background: none;
color: #fff;
font-size: 34px;
line-height: 1;
cursor: pointer;
}
</style>
<div class='vp-overlay' id='vp-overlay'>
<div class='vp-box' id='vp-box'>
<button class='vp-close' id='vp-close' type='button' aria-label='Закрыть'>×</button>
</div>
</div>
<script>
(function () {
var videos = {
'#video-promo': 'https://www.youtube.com/embed/ИДЕНТИФИКАТОР',
'#video-review': 'https://rutube.ru/play/embed/ИДЕНТИФИКАТОР'
};
var overlay = document.getElementById('vp-overlay');
var box = document.getElementById('vp-box');
var frame = null;
function closeVideo() {
if (frame) {
frame.remove();
frame = null;
}
overlay.classList.remove('vp-open');
document.body.style.overflow = '';
}
function openVideo(src) {
closeVideo();
frame = document.createElement('iframe');
frame.src = src + (src.indexOf('?') === -1 ? '?' : '&') + 'autoplay=1';
frame.allow = 'autoplay; fullscreen; encrypted-media';
frame.setAttribute('allowfullscreen', '');
box.appendChild(frame);
overlay.classList.add('vp-open');
document.body.style.overflow = 'hidden';
}
document.addEventListener('click', function (e) {
var link = e.target.closest('a');
var href = link ? link.getAttribute('href') : null;
if (href && videos[href]) {
e.preventDefault();
e.stopPropagation();
openVideo(videos[href]);
return;
}
if (e.target === overlay || e.target.id === 'vp-close') {
closeVideo();
}
}, true);
document.addEventListener('keydown', function (e) {
if (e.key === 'Escape') closeVideo();
});
})();
</script>
Вместо слова «ИДЕНТИФИКАТОР» подставьте код своего ролика. Лишние строки из объекта videos можно удалить, а если роликов несколько, добавлять новые строки по тому же образцу: каждому ролику своя ссылка, одно окно на всех.
Что делает каждая часть
Стиль .vp-overlay растягивает слой на весь экран и красит его в чёрный с прозрачностью 0.88. Эту цифру я подбираю глазами: на светлых лендингах 0.88 даёт ощущение «выключенного света», а если сделать меньше, ролик начинает спорить с текстом страницы позади. Контейнер .vp-box держит пропорцию 16 к 9 через aspect-ratio, поэтому на телефоне и на мониторе ролик не вытягивается и не обрезается, а ширина ограничена 960 пикселями.
Скрипт ловит клики на уровне документа в фазе перехвата (третий аргумент true). Это нужно, чтобы наш обработчик сработал раньше скриптов якорных переходов Тильды. Если ссылка совпала с ключом из videos, переход отменяется и открывается окно. Остальные клики по странице скрипт не трогает.
Параметр autoplay=1 сработает, потому что ролик запускается в ответ на клик посетителя: браузеры блокируют автозапуск со звуком только там, где пользователь ничего не нажимал. Для RuTube и других площадок поведение этого параметра я проверяю на конкретном ролике, а не принимаю на веру.
Подключение кнопки: запуск ролика по клику
Откройте блок с кнопкой (подойдёт любой блок со ссылкой: обложка, текст с кнопкой, меню, кнопка в Zero Block) и в поле ссылки впишите значение из объекта, например #video-promo. Больше ничего настраивать не нужно. Работает это и со ссылкой на слове в тексте, и с картинкой-превью, на которую стоит ссылка.
Бесплатный материал
🎁 Полезный скрипт в подарок
Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.
Без спама. Отписка в 1 клик.
Несколько правил, которые экономят время при отладке:
- Ссылка в блоке и ключ в объекте
videosдолжны совпадать до символа, включая решётку и регистр. - Не используйте для видео префикс
#popup:. Он принадлежит штатным окнам Тильды, и Тильда попытается найти блок с таким хуком. - После правок опубликуйте страницу и проверяйте клики на опубликованной версии: в режиме редактора часть скриптов страницы не запускается.
- Если на странице несколько блоков T123 с этим кодом, оставьте только один, иначе идентификаторы
vp-overlayзадвоятся и окно будет открываться дважды.
Кнопка-превью с иконкой воспроизведения
Часто вместо обычной кнопки нужна картинка с треугольником «play». Я кладу в обложку или в блок с картинкой изображение-кадр из ролика, поверх него в Zero Block ставлю иконку и вешаю ссылку на весь слой. Кадр и иконка загружаются как обычные картинки сайта, плеер остаётся неподгруженным до клика, и для скорости страницы это лучший вариант.
Окно в Zero Block: когда нужен свой дизайн
Код выше самодостаточный, но иногда дизайнер рисует окно с заголовком, текстом под роликом и кнопкой «Заказать». Тогда есть смысл собрать оформление в Zero Block, а блок-модификатор T1093 (категория «Другое») использовать как оболочку. В нём указывается ID Zero Block, ссылка вызова по умолчанию #zeropopup, а в настройках можно выбрать фон подложки, иконку закрытия, скорость анимации и Z‑index. Сам плеер в такое окно я всё равно подгружаю скриптом: в момент открытия добавляю iframe в нужный контейнер, при закрытии удаляю.
Как я выбираю между вариантами:
| Вариант | Где собирается | Когда беру |
|---|---|---|
| Свой слой в T123 | HTML, CSS и скрипт в одном блоке | нужно только видео на тёмном фоне, оформление минимальное |
| Окно через T1093 | дизайн в Zero Block, вызов штатной ссылкой | рядом с роликом нужны заголовок, текст и кнопка действия |
| Ролик прямо на странице | блок T123 с iframe | видео главное на странице и должно быть видно сразу |
Цена сторонних платформ и тарифов видеохостингов к этому выбору отношения не имеет: решение зависит от дизайна и от того, что должно быть рядом с роликом.
Проверка на телефоне и скорость страницы
На мобильных устройствах чаще всего ломаются три вещи. Первая: кнопка закрытия. Я вынес её на 42 пикселя выше ролика, и в альбомной ориентации телефона она может уйти за край экрана. В таком случае закрыть окно можно касанием по тёмному полю, поэтому я оставил этот сценарий в обработчике. Если у вас ролик занимает почти всю ширину, уменьшите значение top у .vp-close до нуля и поставьте кнопку внутрь рамки.
Вторая: полноэкранный режим. Атрибут allow с fullscreen и allowfullscreen у iframe нужны, иначе кнопка разворота внутри плеера окажется неактивной. На iPhone ролик при разворачивании может открыться во встроенном плеере системы, это нормально и от вашего кода не зависит.
Третья: прокрутка страницы под окном. Строка document.body.style.overflow = 'hidden' блокирует фон, пока окно открыто, а при закрытии возвращает значение. Если на сайте есть другие скрипты, которые тоже меняют overflow у body, проверьте, что они друг друга не затирают.
По скорости: плеер подгружается только после клика, а до этого страница тянет лишь небольшой блок разметки. В моих проектах это заметно сказывается на показателях загрузки по сравнению со вставкой готового iframe в каждый блок с роликом. Точные цифры зависят от вашей страницы, поэтому прогоните её через PageSpeed до и после и сравните сами.
Если нужна нестандартная логика, например запуск ролика после заполнения формы, учёт просмотров в метрике или показ разных роликов по UTM-метке, такие вещи делаются небольшим кодом поверх этой же схемы. Кастомные доработки такого рода я беру в работу как кастомный скрипт для Tilda, от 3 000 ₽ за простую задачу.
Условия и возможности Тильды меняются, а embed-параметры YouTube и RuTube обновляются без предупреждения, поэтому перед запуском я уточняю их у самих сервисов.
Частые вопросы
Почему ролик продолжает играть после закрытия окна?
Это происходит, когда iframe вставлен в скрытый блок заранее, а окно закрывается только через display: none. Плеер остаётся живым. В коде из статьи iframe создаётся при клике и удаляется методом remove() при закрытии, поэтому звук прекращается сразу.
Можно ли открывать разные ролики с разных кнопок?
Да. В объект videos добавляете новую пару «ссылка: адрес плеера» и указываете эту ссылку в нужной кнопке. Окно остаётся одно, меняется только адрес в iframe. Ссылки придумывайте с одним и тем же началом, например #video-, чтобы не путать их со штатными хуками окон.
Работает ли это на бесплатном тарифе?
Вставка своего HTML-кода относится к платным тарифам, поэтому на Free блок T123 для такой задачи не рассчитан. На Personal и Business схема работает одинаково. Перед покупкой сверьтесь со страницей тарифов Тильды, состав тарифов может меняться.
Как сделать так, чтобы окно закрывалось по Esc и клику на фон?
В коде это уже есть: обработчик keydown реагирует на клавишу Escape, а в обработчике клика проверяется, что нажат сам слой vp-overlay, а не рамка с роликом. Если закрытие по фону не нужно, удалите условие e.target === overlay из последней проверки клика.