Чтение 6 минут

CSS-анимация: как сделать её плавной


CSS-анимация: как сделать её плавной - Студия Вебтую

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

Откуда берутся рывки

Браузер старается обновлять картинку примерно 60 раз в секунду, то есть на один кадр у него около 16 миллисекунд. За это время он должен пересчитать стили, при необходимости заново разложить элементы на странице, перерисовать их и собрать слои в итоговое изображение. Чем больше этих шагов затрагивает анимация, тем выше шанс не уложиться в кадр. Пропущенный кадр глаз замечает как подёргивание, а несколько подряд — как залипание интерфейса.

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

Что анимировать дёшево, а что дорого

СвойствоЧто пересчитывает браузерВывод для практики
transform: сдвиг, масштаб, поворотТолько сборку слоёвОсновной инструмент для любого движения
opacityТолько сборку слоёвПоявление, исчезание, смена состояний
color, background-colorПерерисовку самого элементаДопустимо на кнопках, ссылках, иконках
box-shadow, filterПерерисовку, часто большой областиЗаменяем наложенным слоем с opacity
width, height, padding, marginРаскладку целой ветки документаОсновная причина рывков, избегаем
top, left без transformРаскладку и перерисовкуЗаменяем на сдвиг через transform

Сдвиг блока на двадцать пикселей и увеличение его отступа на те же двадцать пикселей выглядят для человека одинаково, а стоят для браузера принципиально по-разному. Если в проекте уже есть анимация из нижних строк таблицы и переписывать её некогда, первым делом мы сокращаем длительность: короткое подёргивание заметно меньше длинного.

Длительность, кривая и задержка

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

  • мелкие отклики — подсветка кнопки, смена иконки, изменение рамки поля — 100-150 миллисекунд;
  • появление и скрытие блоков, выпадающие списки, всплывающие подсказки — 200-300 миллисекунд;
  • крупные переходы, модальные окна, боковые панели — до 400 миллисекунд;
  • всё, что дольше половины секунды, воспринимается как задержка интерфейса, а не как эффект.

Характер движения задаёт кривая. Замедление к концу подходит для появления: объект прилетает и мягко останавливается. Ускорение в начале — для исчезания: элемент уходит и не отвлекает. Симметричная кривая уместна для перемещения между двумя видимыми состояниями. Линейное движение выглядит механическим, его оставляют для бесконечных индикаторов загрузки и бегущих строк.

Задержки в интерфейсе почти всегда лишние. Единственный оправданный случай — последовательное появление элементов списка со сдвигом в 30-50 миллисекунд, и то при условии, что элементов не больше пяти-шести. Каскад из двадцати карточек превращается в ожидание.

Типовые задачи и рабочие решения

Раскрытие блока неизвестной высоты

Классическая задача: аккордеон, ответ в разделе вопросов, скрытые подробности карточки. Анимация высоты от нуля к автоматическому значению не работает, а фиксированная высота ломается на длинном тексте и при смене шрифта. Рабочее решение — анимировать сеточную строку от нулевой доли к единице, оставив внутреннему контейнеру скрытие переполнения. Высота остаётся автоматической, переход плавным, а вёрстка не зависит от объёма текста.

Появление блоков при прокрутке

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

Наведение и фокус

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

Индикаторы ожидания

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

Слои композиции: когда помогает, когда мешает

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

Уменьшенное движение и доступность

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

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

Как мы проверяем анимацию

  1. Смотрим не на рабочем ноутбуке, а на среднем телефоне и с искусственным замедлением процессора в инструментах разработчика.
  2. Записываем производительность во время анимации и смотрим, появляются ли в отчёте пересчёты раскладки — если да, анимируется что-то из нижней части таблицы.
  3. Проходим страницу с клавиатуры: реагирует ли то же самое на фокус, не уводит ли анимация фокус за пределы экрана.
  4. Включаем режим уменьшенного движения и убеждаемся, что интерфейс остаётся рабочим.
  5. Открываем страницу с отключённым JavaScript и проверяем, что содержимое видно.
  6. Проверяем поведение при быстром повторе: наведение и увод курсора десять раз подряд не должны копить незавершённые переходы.

Частые ошибки

  • Анимируются размеры и отступы вместо преобразований — самая распространённая причина рывков.
  • Одна длительность на все случаи: подсветка кнопки за 400 миллисекунд ощущается как задержка отклика.
  • Анимация работает на элементах, которых не видно на экране, и тратит ресурсы впустую.
  • Появление при прокрутке скрывает содержимое от поисковых роботов и от людей с отключёнными скриптами.
  • Параллакс на первом экране: он почти всегда конфликтует с плавностью прокрутки на мобильных устройствах.
  • Ради одного эффекта в проект приезжает чужая библиотека анимаций, а вместе с ней сотни килобайт стилей.

Анимация — не украшение, а способ объяснить человеку, что изменилось на экране и куда смотреть. Если она этого не делает, её проще убрать: спокойный и быстрый интерфейс воспринимается лучше нарядного и подтормаживающего.

Если нужна не разовая правка, а интерфейс, где анимация продумана вместе с вёрсткой и скоростью загрузки, мы занимаемся этим постоянно: разработка сайтов.

Нужно спроектировать интерфейс?

Соберём прототип до начала разработки — от 72 000 руб.

Проектирование интерфейсов

По теме статьи

Мы это уже делали

Похожие статьи

Нужен новый сайт?

Оставьте контакты — вернёмся с вопросами по задаче и ориентиром по срокам и стоимости.

Читайте также

Разбираем задачи, с которыми к нам приходят: от структуры сайта до поддержки и продвижения.

Внимание: мошенники представляются сотрудниками Вебтую Внимание: мошенники представляются сотрудниками Вебтую Посторонний человек обращается к рекламным и маркетинговым агентствам от имени Вебтую через Telegram-аккаунт @vetaroki22010, заказывает работы и не оплачивает и 10-09-2026 Читать Работа в digital: процессы, инструменты и команда Работа в digital: процессы, инструменты и команда Цифровые проекты редко проваливаются из-за технологий: чаще мешает организация работы. Разбираем этапы, роли, постановку задач, инструменты распределённой коман 30-08-2026 Читать Реклама и аналитика: как считать заявки, а не клики Реклама и аналитика: как считать заявки, а не клики Показы и клики не отвечают на вопрос, сколько принесла реклама. Разбираем, как настроить цели, разметить источники, учесть звонки и связать заявку со сделкой, ч 30-08-2026 Читать Поддержка сайта: обновления, резервные копии и безопасность Поддержка сайта: обновления, резервные копии и безопасность Сайт без регулярного обслуживания ломается предсказуемо. Разбираем, из чего состоит поддержка: обновления, резервные копии, доступы, безопасность, выбор хостинг 30-08-2026 Читать Техническое SEO: индексация, скорость и структура сайта Техническое SEO: индексация, скорость и структура сайта Техническая часть сайта решает, попадут ли страницы в индекс и дождётся ли их посетитель. Разбираем структуру и адреса, индексацию и дубли, работу с устаревшими 30-08-2026 Читать Продвижение сайта в поиске: стратегия, семантика и ссылки Продвижение сайта в поиске: стратегия, семантика и ссылки Разбираем продвижение сайта в поиске от постановки цели до регулярной работы: как собрать и разложить семантику по страницам, что должно быть на посадочной стра 30-08-2026 Читать Тексты для сайта: как писать, чтобы читали и покупали Тексты для сайта: как писать, чтобы читали и покупали Как выбрать тему для страницы и построить текст, который просматривают глазами и дочитывают, чем заменить оценочные формулировки, как переработать существующую 30-08-2026 Читать Автоматизация бизнеса: CRM, ERP и искусственный интеллект Автоматизация бизнеса: CRM, ERP и искусственный интеллект С чего начинать автоматизацию и что автоматизировать в первую очередь, чем различаются CRM, ERP и системы документооборота, внедрять по модулям или всё сразу, г 30-08-2026 Читать Как устроена разработка: технологии, тестирование и инструменты Как устроена разработка: технологии, тестирование и инструменты Из чего состоит веб-проект, как выбирают язык, фреймворк и базу данных, зачем нужны тестирование и контроль версий, где заканчиваются возможности low-code и ген 30-08-2026 Читать Создание сайта: от технического задания до запуска Создание сайта: от технического задания до запуска Проекты срываются не из-за технологий, а из-за неясных договорённостей. Разбираем весь путь создания сайта: как сформулировать цель, что должно быть в техническ 30-08-2026 Читать
Обсудить проект