Лаборатория
Приёмы движения, которые мы делаем в клиентских проектах. Каждый работает прямо на этой странице — и у каждого указана честная цена: сколько весит, что ломает и где его ставить не стоит.
Движение на сайте — не украшение, а способ объяснить. Оно показывает, что с чем связано, куда всё едет и что только что изменилось. Всё остальное движение мешает: замедляет загрузку, отвлекает от чтения и через неделю начинает раздражать самого владельца сайта.
Поэтому каждый приём здесь снабжён не восторгом, а ценой. Три вещи, которые мы проверяем до того, как что-то анимировать: сколько это весит, работает ли без скрипта и что увидит человек, включивший в системе «уменьшить движение».
Появление и параллакс по скроллу
Блоки проявляются и смещаются по мере прокрутки. Ни одной строки JavaScript.
- Как сделано
- CSS scroll-driven animations:
animation-timeline: view(). Браузер считает прогресс сам, в потоке композитора — основной поток свободен, кадры не проседают даже на слабом телефоне. - Цена
- 0 КБ
- Ограничения
- Не поддерживается в Safari до 26 и в старых браузерах — там блок просто виден сразу. Это правильное поведение отката: содержимое не должно зависеть от анимации.
- Где уместно
- Везде. Это замена библиотекам появления, которые тянут 30–60 КБ ради того же эффекта.
Секвенция кадров на скролле
Объект «крутится» от прокрутки: кадры, нарезанные из видео, перелистываются вместе со скроллом.
Прокручивайте страницу — кадр меняется вместе со скроллом
- Как сделано
- Кадры грузятся заранее и рисуются в
<canvas>; номер кадра считается от положения блока в окне. Здесь 24 кадра — в боевом варианте их 60–180. - Цена
- 100 КБ на 24 кадров
- Ограничения
- Главная цена — вес. 120 кадров даже по 40 КБ это почти 5 МБ, и они нужны до того, как человек доскроллит. Лечится ленивой подгрузкой диапазонами и уменьшением кадра. Альтернатива — обычное видео с перемоткой: один файл легче, но на iOS капризнее.
- Где уместно
- Товар, который нужно рассмотреть со всех сторон: техника, украшения, автомобиль, упаковка. Не для страницы услуг.
Спутник курсора
Метка следует за курсором с задержкой и меняет вид над ссылками.
Наведите курсор. Метка догоняет его с задержкой, а над ссылкой увеличивается.
На устройстве без курсора приём выключен — так и должно быть.
- Как сделано
- Позиция сглаживается интерполяцией в
requestAnimationFrame, смещение черезtranslate3d— свойство, которое не вызывает пересчёт раскладки. - Цена
- ~1 КБ
- Ограничения
- На тач-устройствах курсора нет вовсе — а это больше половины трафика, значит приём обязан быть необязательным. Отключается при
prefers-reduced-motion: для части людей такое движение — это плохое самочувствие, а не «вау». - Где уместно
- Портфолио, промо, витрины. На сайте услуг мешает читать.
Магнитная кнопка
Кнопка тянется к курсору на подлёте и возвращается на место.
- Как сделано
- Смещение считается от расстояния до центра и ограничивается по модулю. Возврат — той же кривой, что и весь сайт:
cubic-bezier(0.22, 0, 0, 1). - Цена
- ~0,6 КБ
- Ограничения
- Смещать можно на 6–10 пикселей, не больше: кнопка, убегающая от пальца, — это не игривость, а промах мимо цели.
- Где уместно
- Один главный призыв на странице. Две магнитные кнопки рядом — уже балаган.
Заголовок по словам
Строки заголовка выезжают снизу, одна за другой.
Движение, которое ничего не весит
- Как сделано
- Слова оборачиваются в
spanскриптом и получают сдвиг задержки. Разметка в исходнике остаётся цельной — поисковик и экранный диктор видят обычный заголовок. - Цена
- ~0,8 КБ
- Ограничения
- Разбивать по буквам не стоит: диктор начнёт читать по одной. По словам — безопасно.
- Где уместно
- Первый экран. Ровно один раз на страницу.
Смена кадра под шторкой
Изображение раскрывается из-под движущейся полосы, а не проявляется прозрачностью.
- Как сделано
- Анимируется
clip-path— работает на композиторе, без перерисовки слоя. - Цена
- 0 КБ
- Ограничения
- Требует, чтобы под шторкой было что показывать: на пустом блоке приём выглядит как ошибка загрузки.
- Где уместно
- Работы, обложки, до/после.
Правила
Чего мы
не делаем
Список короче, чем кажется, но он жёсткий.
-
01
Анимация вместо содержимого
Текст, который виден только после срабатывания скрипта, — это текст, которого нет для поисковика и для человека с отключённым JavaScript.
-
02
Движение без выключателя
Системная настройка «уменьшить движение» обязана выключать всё. Для части людей вестибулярная реакция на анимацию — медицинский факт.
-
03
Мегабайты ради эффекта
Секвенция на 5 МБ убивает первый экран на мобильном интернете. Эффект, который стоит дороже заявки, не окупается.
-
04
Захват скролла
Страница, которая перехватывает прокрутку и ведёт человека «как надо», — самый быстрый способ его потерять.
-
05
Анимация на анимации
Когда движется всё, не выделено ничего. На экране одновременно живёт один смысловой акцент.
-
06
Библиотека ради одного эффекта
Подключать 60 КБ ради появления блоков незачем: то же самое делает CSS, причём быстрее.
Первый шаг
Оживим
ваш проект?
Расскажите, что нужно оживить и зачем. Предложим приём под задачу и назовём цену — в часах и в килобайтах.