Перейти к содержимому
SEO/Опубликовано 3 сентября 2026 г./5 мин

Анимации появления прячут уже прочитанный текст: замер вместо спора

Спор об анимациях появления мы закрыли замером на своём сайте: текст читался на 1500 мс, а на 3000 мс уходил в прозрачность. Что показали измерения с prefers-reduced-motion и без, и почему LCP при этом улучшался.

Анимации появления прячут уже прочитанный текст: замер вместо спора
С
Команда NEXFORCE
SEO-эксперт NEXFORCE

Про анимации появления спорят одинаково: одни считают, что они оживляют страницу, другие — что мешают. Мы этот спор у себя закрыли замером, и результат оказался хуже любой из позиций: анимация прятала текст, который посетитель уже читал.

Что происходило

На статическом сайте — а наш собран заранее, страницами — порядок такой. Браузер получает готовый HTML и рисует текст. JavaScript доезжает позже. И только после него оживают компоненты, которые «показывают» страницу.

Показывать уже нечего: страница видна. Поэтому анимация с начальным состоянием «прозрачность 0» даёт не появление, а исчезновение.

Замер живого сайта на канале 1,6 Мбит/с, страница города:

ВремяЧто видит посетитель
1500 мстекст отрисован, читается
3000 мсвся обёртка уходит в прозрачность 0
3300–3600 мсповерх идёт тёмная штора
4000 мссодержимое возвращается

Две с половиной секунды человек смотрит, как исчезает то, что он начал читать. На быстром соединении этого не видно — все события укладываются в первые полсекунды, и глазами дефект не поймать. Именно поэтому спор и был спором: у каждого свой канал и своя правота.

Побочный эффект, из-за которого мы сами себя обманули

Пока страница прозрачна, браузер не засчитывает поздних кандидатов на главную отрисовку. Метрика LCP от этого выглядит лучше.

После того как анимацию убрали с первого захода, LCP «вырос» с 1700 до 2900 мс. Это не откат оптимизации — это снятие маскировки. Показатель улучшался ровно за счёт того, что текст прятали от посетителя, и мы едва не приняли маскировку за достижение. Мы уже ошибались с замером скорости — в тот раз из-за локального сервера без сжатия.

Как починили

Удалять анимацию целиком не стали. Разрыв, который она закрывает, бывает настоящим — при переходе по внутренней ссылке. Поэтому до первого перехода содержимое отдаётся как есть, а дальше анимация работает по-прежнему.

Заодно вышла экономия: раз до перехода анимация не нужна, её код подгружается отдельным куском и только при первом признаке, что посетитель собирается нажать. Библиотека перестала приходить на страницы, открытые из поиска: набор скриптов на странице города похудел с 832 до 708 КБ.

Замер сегодня

Проверили 3 сентября 2026 года на живом сайте — с настройкой prefers-reduced-motion и без неё:

СтраницаLCP как обычноLCP без анимаций
Главная348 мс236 мс
/seo/avtoservis/200 мс180 мс
/ekaterinburg/152 мс240 мс
/proverka/192 мс228 мс

Разница в обе стороны и в пределах десятков миллисекунд — то есть на первом заходе анимации больше ничего не прячут. Раньше расхождение между этими двумя колонками и было ценой анимаций.

Чего мы не доделали

Настройка операционной системы «меньше движения» у нас уважается только наполовину, и это видно по тому же замеру. В стилях стоит правило, которое сводит длительность анимаций к 0,01 мс, — но действует оно на CSS-анимации. Переход между страницами рисует JavaScript, и под это правило он не попадает.

Штора при переходе, три прогона на каждом режиме:

РежимШтора на экране
Как обычно584, 575, 584 мс
С prefers-reduced-motion542, 552, 509 мс

Разница около семи процентов — это погрешность, а не уважение к настройке. Человек, который попросил систему убрать движение, всё равно получает полсекунды шторы. Недочёт открытый, заведён в работу; рассказываем о нём здесь, потому что юзабилити начинается с честного списка того, что не сделано.

Что забрать себе

  • Ищите начальную прозрачность 0 в каркасе. Компонент, который монтируется через useEffect и стартует с прозрачности, на предрендеренной странице работает наоборот.
  • Мерьте на медленном канале и по времени. Дефект существует только там, где JavaScript отстаёт от HTML на секунды.
  • Не радуйтесь улучшению LCP, если что-то скрыли. Проверяйте показатель в двух режимах: расхождение и есть цена анимации.
  • Проверяйте, кто рисует движение. Правило в CSS не остановит анимацию из JavaScript — библиотеке настройку нужно передать отдельно.

Про то, почему у молодого домена вообще нет данных о настоящих посетителях, мы писали отдельно: Core Web Vitals по нам пусты, а трафик оказался роботами. Тем важнее лабораторные замеры делать честно.

Вопросы и ответы

FAQ по теме

Чем плохи анимации появления на статическом сайте?+
Тем, что порядок событий обратный ожидаемому. Текст статической страницы отрисован из HTML задолго до того, как доедет и выполнится JavaScript. Анимация, которая должна «показать» страницу, приходит после — и вместо появления даёт исчезновение. На нашем замере текст читался на 1500 мс, а на 3000 мс вся обёртка уходила в прозрачность.
Как проверить, не прячет ли анимация текст у меня?+
Искать в каркасе компоненты, у которых начальное состояние — прозрачность 0, а монтируются они через useEffect. И мерить на медленном канале с записью по времени: на быстром соединении глазами это не видно, потому что все события укладываются в первые полсекунды.
Почему после снятия анимации LCP стал хуже?+
Потому что он был не лучше, а замаскирован. Пока страница прозрачна, поздние кандидаты на главную отрисовку не засчитываются. После снятия анимации LCP «вырос» с 1700 до 2900 мс — это снятие маскировки, а не откат оптимизации. Метрика улучшалась ровно за счёт того, что текст прятали от посетителя.
Достаточно ли правила prefers-reduced-motion в CSS?+
Нет, если анимации рисует JavaScript. Наше правило сводит animation-duration к 0,01 мс, и на CSS-анимации оно действует. Но библиотека, которая анимирует из JS, под это правило не попадает: замер 3 сентября 2026 показал штору при переходе 575–584 мс без настройки и 509–552 мс с ней. Разница в пределах погрешности.