Виджет опросов в Shadow DOM: почему iframe устарел
iframe весит 200+ КБ, ломает поисковую индексацию и плохо адаптируется. Shadow DOM-виджет – современный путь встраивания. Разбираем технически.
Когда нужно встроить «опрос на сайт», конструкторы 2010-х предлагают
<iframe src="...">. Это работает, но мы прошли мимо 2010-х. Разбираемся,
почему виджет в Shadow DOM объективно лучше – и почему мы выбрали именно
этот путь.
Что не так с iframe-виджетом
Размер. iframe – это отдельная страница со своим HTML, CSS, JS. У Typeform-виджета грузится ~200 КБ только для отрисовки одного вопроса. У WebAsk – около 180 КБ. Это плюс к вашему сайту.
Индексация. Поисковики и AI-краулеры не видят содержимое iframe в контексте вашей страницы. Опрос индексируется отдельно или вообще не индексируется. Для NPS не критично, для лидген-квиза – потеря трафика.
Стили и адаптив. iframe – это прямоугольник фиксированной высоты. Адаптация под мобильные – танец с postMessage и resizeObserver. На малых экранах вылезает скролл внутри iframe.
Доступность. Скринридерам и keyboard-юзерам приходится «прыгать» внутрь iframe – это разрыв контекста.
Что даёт Shadow DOM
Shadow DOM – стандарт W3C, по которому ваш виджет рендерится внутри DOM страницы, но с изолированной CSS-областью. Получаете лучшее из двух миров:
- Виджет – часть страницы. Индексируется Google и AI-краулерами.
- CSS изолирован. Не ломает ваш дизайн, ваш CSS не ломает виджет.
- Размер – только нужный JS, никакого дублирующего HTML/CSS. 35 КБ gzip у аскио.
- Адаптив – нативный CSS внутри. Размер контейнера = размер виджета.
- A11y – внутренние элементы видны скринридеру как часть страницы.
Как это выглядит в коде
<script src="https://cdn.askyo.ru/widget.js" async></script>
<div data-askyo="nps-feedback-v3"></div>
После загрузки скрипт находит <div data-askyo> и attachShadow к
нему с режимом closed. Внутри Shadow Root рендерится изолированный
React-инстанс. Ваш сайт даже не знает, что внутри React (это деталь
реализации).
Что нужно знать перед внедрением
- Браузеры: Shadow DOM поддерживается во всех современных, включая Safari 14+. Для IE 11 – нужен полифилл, но IE 11 уже отстрелили.
- CSS-токены: если хотите, чтобы виджет наследовал CSS-переменные вашего сайта (—accent, —radius) – он это делает автоматически.
- Тестирование: Playwright и Cypress видят Shadow DOM «из коробки»
через
shadow_root.locator().
Когда iframe всё-таки нужен
Только в одном кейсе: жёсткие политики безопасности, требующие
полной изоляции виджета от страницы (банкинг, медицинские формы с
PII в полях). В таком случае аскио тоже умеет – у нас есть параметр
isolation: 'iframe'. Но по умолчанию – Shadow DOM, и это правильно.
Дальше – практика
Документация виджета – установка, API, события, примеры под React, Vue, Тильду, Битрикс24.