Обновлено 19 октября 2026 г.
13 миллисекунд. Именно столько времени нужно человеческому мозгу, чтобы распознать изображение, согласно исследованию нейробиологов MIT, опубликованному в 2014 году. Однако скрипту инструмента A/B-тестирования на стороне клиента часто требуется несколько сотен миллисекунд для изменения страницы. За это время посетитель видит исходную версию, затем вариант. Он видел обе. Ваш же тест предполагает, что он видел только одну версию.
Этот эффект мерцания вносит систематическую погрешность в ваши измерения, почти всегда в ущерб вариативности, и может привести к тому, что вы отбросите хорошую идею или подтвердите плохую. В этом руководстве объясняется, откуда он берется, сколько это на самом деле стоит, как измерить его на своем собственном участке и как его устранить.
Что такое эффект мерцания в A/B-тестировании?
Эффект мерцания (или FOOC, «вспышка исходного контента») — это кратковременное отображение исходной страницы перед применением тестируемого варианта, поскольку тестовый скрипт изменяет страницу после того, как браузер начал ее отображать. Посетитель замечает резкий скачок: меняется заголовок, кнопка меняет цвет, блок смещается.
Это явление характерно именно для тестирования на стороне клиента. В этой модели сервер всегда отправляет одну и ту же HTML-страницу; это JavaScript-файл, загружаемый браузером, который определяет, к какой группе принадлежит посетитель, и соответствующим образом переписывает DOM. Пока этот скрипт не будет загружен, интерпретирован и выполнен, отображается элемент управления. Если вам незнакома эта терминология (DOM, вариант, элемент управления, выделение ресурсов), наш глоссарий A/B-тестирования повторяется каждый семестр.
Почему Flicker искажает ваши результаты
Мерцание затрагивает только одну из двух групп: на контрольных изображениях артефактов нет, на варианте появляется вспышка. Таким образом, вы сравниваете уже не «дизайн А против дизайна В», а «дизайн А против дизайна В с дефектом отображения». Это смещение, а не шум: оно не компенсируется увеличением размера выборки.
Против данного варианта действуют два механизма:
- Потеря уверенности в себе. Страница, которая "подпрыгивает", говорит о плохом дизайне сайта. На этапе оплаты или в форме запроса коммерческого предложения одного этого впечатления достаточно, чтобы вызвать подозрения.
- Эффект сравнения. Посетитель видел старую цену, заголовок или изображение. Если в варианте товара цена перечеркнута или предложение содержит более убедительное обещание, он видит обе версии, что меняет его восприятие предложения.
Иногда, наоборот, элемент, который «появляется», привлекает внимание и усиливает вариант. В обоих случаях результат, который вы видите в своем... панель аналитики не соответствует тому, как бы выглядел вариант после развертывания в жестко закодированном виде, без скрипта. Это один из недооцененных источников проблем. ложноположительные (и ложноотрицательные) результаты в A/B-тестировании.
5 технических причин мерцания
Мерцание появляется сразу после применения варианта и отрисовки первой страницы. Пять факторов, которые могут сочетаться, увеличивают эту задержку.
1. Местоположение скрипта
Сценарий, размещенный в конце <body> этот код выполняется только после того, как остальная часть HTML-кода будет обработана: браузер уже отобразил всё. Он должен находиться как можно выше в списке. <head>, до таблиц стилей и других сторонних скриптов.
2. Использование менеджера тегов
Google Tag Manager загружает свои теги асинхронно. Поэтому тестовый скрипт ожидает загрузки самого контейнера GTM, после чего запускается. Аналитик Симо Ахава измерил это расхождение на том же сайте, где трафик разделился на две части: страница оставалась скрытой. В среднем время обработки тега через GTM составляет 964 мс, по сравнению с 581 мс при прямой вставке фрагмента кода на страницу.. Почти 400 мс потеряно исключительно из-за метода интегрирования.
3. Асинхронная загрузка
Асинхронный скрипт не блокирует отображение: в этом его преимущество с точки зрения скорости, и именно поэтому он вызывает мерцание. Мы вернемся к этому в следующем разделе.
4. Размер скрипта и задержка
Выполнение файла, содержащего конфигурацию для всех тестов учетных записей, включая приостановленные, занимает больше времени. Если он загружается с сервера, расположенного далеко от посетителя, каждый обмен данными добавляет десятки миллисекунд.
5. Способ кодирования варианта.
Изменение, которое ожидает появления элемента в DOM перед его перезаписью (например, «заменить текст кнопки после её загрузки»), обязательно будет применено после того, как элемент будет отображен. WYSIWYG-редакторы иногда генерируют такой код по умолчанию. Документация по Optimizely он распознает это: его визуальные изменения ожидают, пока элемент станет доступен, что вызывает мерцание, когда в очереди находится много изменений.
Синхронный или асинхронный фрагмент: вот в чем реальный выбор.
Синхронный фрагмент кода блокирует отображение до завершения выполнения: мерцания нет, но если скрипт выполняется медленно, появляется белый экран. Асинхронный фрагмент кода позволяет странице загрузиться: белого экрана нет, но появляется мерцание. Свободного третьего пути нет.
| Критерии | Синхронный фрагмент | Асинхронный фрагмент |
|---|---|---|
| Мерцание | Ничего, если скрипт ответит. | Вероятно, пропорционально задержке |
| Белый экран | Да, во время загрузки скрипта. | Нет |
| Если сервер скриптов выйдет из строя | Страница остаётся заблокированной до истечения времени ожидания сети. | Страница отображается в оригинальном виде. |
| Влияние на LCP | Прямая трансляция (рендеринг ещё не завершен) | Косвенный (если добавлено маскирование) |
| Надежность эксперимента | Высокий | Зависит от мер по борьбе с мерцанием. |
Optimizely рекомендуется загружать фрагмент кода синхронно. при этом допускается асинхронное выполнение определенных модификаций вариантов. VWO (переименовано) Wingify (в 2026 году) скрывает содержимое страницы, ожидая загрузки библиотеки; Kameleoon подчеркивает "блокирующую асинхронную" интеграцию.
Правильный выбор зависит от одного вопроса: контролируется ли задержка вашего скрипта? Если файл небольшой и загружается с CDN, расположенного близко к вашим посетителям, синхронный режим добавляет несколько десятков миллисекунд и устраняет проблему. В противном случае любое замедление сети приводит к пустому экрану. В этом и заключается суть вопроса. сверхбыстрая доставка вариантов : сделать режим блокировки достаточно коротким, чтобы он стал незаметным.
Фрагмент кода для подавления мерцания: полезен, но имеет свою цену.
Фрагмент кода, предотвращающий мерцание, скрывает страницу (или её часть) с помощью правила CSS во время выполнения тестового скрипта, а затем отображает её. Он устраняет видимое мерцание, но изменяет цену: страница отобразится позже для всех пользователей.
Принцип прост. Строка кода, размещенная в самом начале... <head> применяемый opacity: 0 или visibility: hidden В <body>. Когда инструмент применяет вариант, он удаляет это правило. Если инструмент не реагирует, страница всё равно отображается с превышением максимального времени ожидания. Значения по умолчанию достаточно щедрые: старый фрагмент кода Google Optimize подождал до 4 секунд, и smartCode VWO / Wingify устанавливает допуски в 2000 мс для настроек и 2500 мс для библиотеки..
Эти цифры значительны. За всё это время не отрисовывается ни один пиксель. Аудит, опубликованный DebugBear на главной странице AdRoll, показал, что время отрисовки контента (Largest Contentful Paint, LCP) составляло 6,0 секунд при включенном маскировании, по сравнению с 2,7 секундами после отключения маскирования. Google считает LCP выше 2,5 секунд «требующим улучшения», а выше 4 секунд — «плохим»: плохо настроенный антимерцающий фильтр может превратить здоровую страницу в негативный результат.
Три правила использования без повреждений:
- Скрыть только проверенную область (блок героя, форма), а не
<body>вся страница отображается нормально. Остальная часть страницы отображается как обычно, и LCP затрагивается только в том случае, если скрытый элемент сам является элементом LCP. - Сократите время ожидания время отклика составляет 1000-1500 мс вместо 2000-4000 мс. Кроме того, посетитель, увидевший пустую страницу, получает более серьезные штрафные санкции, чем посетитель, увидевший вспышку.
- Включайте маскирование только на страницах, содержащих тестовые материалы.. Система защиты от мерцания, установленная на всем сайте, наказывает тысячи страниц, которые ничего не проверяют.
Измерение мерцания на вашем сайте: метод A/A'
Чтобы определить, влияет ли мерцание на результаты ваших тестов, проведите тест A/A': две группы видят одну и ту же страницу, но одна из них получает невидимое изменение, примененное тестовым скриптом. Любая существенная разница между двумя группами измеряет стоимость самого механизма внедрения, независимо от каких-либо маркетинговых соображений.
Стандартной операции A/A недостаточно: ни одна группа не подвергается никаким изменениям, поэтому ни одна не мерцает. Именно этот метод мы рекомендуем. BlastOptimize перед запуском серии тестов на новом сайте или новом шаблоне страницы.
Четырехэтапный протокол
- Создать вариант А Эта функция вносит изменения в тестируемый элемент без визуального эффекта (например, заменяет текст заголовка тем же текстом или добавляет атрибут).
data-(на кнопке). Технический путь идентичен пути настоящего варианта. - Инструмент задержки Зафиксируйте время между первым отображением (Первое отображение содержимого) и применением изменений. Приведенного ниже фрагмента достаточно.
- Пусть он пройдет полный цикл. (как минимум 2 недели, чтобы сгладить влияние будней/выходных дней) с вашим обычным целевым показателем конверсии, как определено в вашем целевая конфигурация и отслеживание.
- Прочитайте два числа : медианное время и 90-й процентиль (медленные посетители), затем разница в конверсии между A и A'.
<script>
// À appeler dans le code de la variante A', juste après la modification
(function () {
var fcp = performance.getEntriesByName('first-contentful-paint')[0];
var applique = performance.now();
var delai = fcp ? Math.round(applique - fcp.startTime) : null;
// delai > 0 : la variante s'applique APRÈS le premier affichage = flicker visible
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({ event: 'flicker_delay', flicker_ms: delai });
})();
</script>Как интерпретировать
- Отрицательная или нулевая задержка Данный вариант применяется перед первым рендерингом. Мерцание исключено.
- Медианная задержка менее 100 мс Мерцание, редко различимое на сознательном уровне, но достаточно заметное (помните о 13 мс). Следите за 90-м процентилем.
- Медианная задержка превышает 300 мс Мерцание видно большинству посетителей. Не проводите никаких тестов на этой странице, пока интеграция не будет исправлена.
- Существенная разница в конверсии между A и A' Сам по себе механизм впрыска оказывает измеримое влияние. Все ваши тесты на этом шаблоне страдают от этого искажения.
На этом рисунке показан минимальный размер эффекта, который можно интерпретировать на этой странице. Если A/A' показывает −2% для A', то вариант, который получает +1,5%, на самом деле может получить +3,5%, а вариант с −1% может быть нейтральным.
9 конкретных корректировок, от наиболее выгодных до наиболее дорогостоящих.
Большинство проблем с мерцанием можно решить без смены инструментов: переместив скрипт, изменив его освещение и закодировав варианты в CSS, а не в JavaScript. Вот рычаги, ранжированные по соотношению затраченных усилий и полученной выгоды.
- Разместите фрагмент кода в верхней части страницы.
<head>, перед CSS и другими сторонними скриптами. Мгновенная выгода, пять минут работы. - Выйдите из тестового скрипта в Google Tag Manager. Интегрируйте это навсегда в шаблон. Разница в 400 мс, измеренная Simo Ahava, обусловлена именно этим.
- Добавить
preconnectк домену, на котором размещен скрипт (<link rel="preconnect" href="…">) чтобы открыть соединение еще до того, как браузер встретит этот тег. - Визуальные изменения следует вносить с помощью CSS. CSS-правило, внедренное в
<head>применяется сразу после отрисовки элемента, без ожидания его появления в DOM. Изменить цвет, скрыть блок или изменить порядок двух элементов с помощьюorderиспользование flexbox не требует JavaScript. Это также рекомендуется в документации. Optimizely на тех вариантах, которые мигают. - Очистите код, сгенерированный программой.визуальный редактор : удалять избыточные селекторы, группировать изменения одного и того же элемента, избегать полной перезаписи HTML-блоков, когда достаточно изменения текста.
- Архив завершенных тестов. Каждый приостановленный тест, остающийся в конфигурации, увеличивает размер файла для всех посетителей.
- Скрыть можно только проверяемую область., с коротким таймаутом (1000-1500 мс), а не со всей страницей в течение 4 секунд.
- Избегайте тестирования перенаправлений на страницах с высоким входящим трафиком. Перенаправление на URL B после загрузки URL A приводит к двум загрузкам страницы: это наиболее затратный вид мерцания.
- Размещайте скрипт на CDN, расположенном ближе всего к вашим посетителям., с конфигурацией, ограниченной только тестами, активными на посещаемой странице. Это рычаг, на который вы влияете меньше всего, так как он зависит от инструмента: спросите своего поставщика или посмотрите нашу страницу о доставке скрипта BlastOptimize как можно ближе к посетителю.
Когда следует переходить к серверной части?
Серверное тестирование исключает мерцание по своей сути: сервер выбирает вариант и отправляет правильный HTML-код напрямую; никакой скрипт не переписывает страницу в браузере. Недостаток хорошо известен: каждый тест проходит через разработчика, визуальный редактор становится непригодным для использования, а цикл итераций удлиняется. Серверное тестирование оправдано для тестов структурных элементов (алгоритм ценообразования, процесс оформления заказа, навигация), для страниц, где даже малейшее отклонение в LCP обходится дорого, или когда ваш анализ A/A выявляет предвзятость, которую не устраняют девять упомянутых выше исправлений. Для тестов заголовков, визуальных элементов или кнопок хорошо интегрированный клиентский подход остается более быстрым в реализации. Этот архитектурный выбор заслуживает отдельного руководства, которое мы посвящаем серверному тестированию.
Контрольный список по предотвращению мерцания перед каждым запуском
Перед запуском в производство проверьте эти десять пунктов. Достаточно одного «нет» по первым четырём, чтобы отложить запуск.
- ☐ Этот фрагмент кода жестко закодирован в коде.
<head>, Занимает первое место среди скриптов, за исключением менеджеров тегов. - ☐ Режим загрузки (синхронный/асинхронный) для этой страницы известен и задокументирован.
- ☐ Данный вариант был проверен на реальном смартфоне с ограничением скорости сети до «медленного 4G» в инструментах разработки.
- ☐ Измеряется задержка между первым отображением и применением варианта (медиана и 90-й процентиль).
- ☐ Визуальные изменения по возможности вносятся с помощью CSS.
- ☐ При использовании маскирования, оно нацелено на тестируемую область, а время ожидания составляет ≤ 1500 мс.
- ☐ Было проведено сравнение LCP страницы с тестированием и без него (целевая разница: менее 100 мс).
- ☐ Завершенные тесты были заархивированы из учетной записи.
- ☐ Тестирование перенаправления на главной странице входа не запускается без веской причины.
- ☐ В течение последних 6 месяцев для данного шаблона страницы проводилась проверка на соответствие критериям A/A.
Flickr добавлен в список распространенные ошибки в A/B-тестировании что делает тест недействительным еще до проведения статистического анализа. Это тем более опасно для многомерные тесты, где одновременно модифицируются несколько областей, и где каждая комбинация может создавать разную вспышку, а также на сайты электронной коммерции, где на страницах товаров загружается множество изображений и сторонних скриптов.
Часто задаваемые вопросы
Влияет ли эффект мерцания на SEO?
Косвенно, да. Само по себе мерцание не является штрафом, но плохо реализованные исправления — да: антимерцающий фильтр, скрывающий страницу, ухудшает показатель LCP (Low Page Content — низкий уровень контента страницы), а вариант, вставляющий блоки, увеличивает CLS (Cumulative Layout Shift — кумулятивное смещение макета). Оба этих показателя входят в число основных показателей веб-оптимизации, которые учитывает Google. Сравните данные из Search Console на протестированных и непротестированных страницах, чтобы убедиться в этом.
Мой прибор утверждает, что "на 100% не мерцает": могу ли я в это поверить?
Спросите, как. «Без мерцания» часто означает «с маскированием»: вспышка исчезает, но страница загружается позже. Проверьте три вещи: метод загрузки сниппета, значение таймаута маскирования и разницу LCP, измеренную со скриптом и без него. A/A-тест решит этот вопрос на вашем собственном сайте. Вы найдете различия в подходах в нашем сравнительный BlastOptimize / Kameleoon и в нашем сравнение с AB Tasty.
Действительно ли синхронный фрагмент кода замедляет работу моего сайта?
Это задерживает первоначальное отображение времени загрузки и выполнения скрипта. Для небольшого файла, размещенного на CDN, разница составляет несколько десятков миллисекунд. Для большого файла или медленного сервера — сотни миллисекунд, а сбой в работе провайдера может заблокировать страницу до истечения времени ожидания сети. Перед принятием решения измерьте LCP с этим фрагментом кода и без него.
Могу ли я загрузить свой инструмент для A/B-тестирования через Google Tag Manager?
Технически да, но эта конфигурация вызывает наибольшее мерцание, поскольку GTM загружает свои теги асинхронно. Опубликованные измерения показывают примерно на 400 мс большее маскирование по сравнению с прямой интеграцией. Используйте GTM только для запуска событий отслеживания, а не для скрипта, изменяющего страницу.
Усугубляют ли баннеры с призывами к согласию мерцание экрана?
Да, могут. Если ваш инструмент тестирования загружается только после принятия файлов cookie, или если платформа управления согласием блокирует скрипты во время чтения выбора посетителя, применение варианта будет соответственно отложено. Проверьте порядок выполнения между баннером и тестовым фрагментом в чистой сессии, без файлов cookie.
Основные выводы
- Эффект мерцания — это кратковременное отображение исходной страницы перед её вариантом. Он характерен именно для тестирования на стороне клиента.
- Это не просто визуальный дефект: он систематически искажает сравнение, поскольку от него страдает только одна из двух групп.
- Основными причинами являются неправильное размещение скрипта, прохождение через GTM, асинхронная загрузка, слишком большой размер файла и варианты кода, написанные на JavaScript, а не на CSS.
- Функция подавления мерцания маскирует проблему, но задерживает отображение: нацельтесь на тестируемую область и установите тайм-аут ≤ 1500 мс.
- Перед внесением изменений проведите замеры: тест A/A' показывает реальную стоимость механизма инъекции на вашем участке.
- Серверная часть по своей сути устраняет мерцание, но ценой этого является зависимость от разработчиков.
Вы хотите увидеть, как BlastOptimize поддерживает ли она свои варианты? Ознакомьтесь с нашей информацией. предложения и цены запустить первоначальное A/A-тестирование на вашем сайте.















Комментарии закрыты.