Переход между экранами нужен, чтобы человек понял, куда он попал и как вернуться: шаг вглубь приходит справа или «вырастает» из нажатого элемента, возврат повторяет то же движение в обратную сторону, модальное окно поднимается снизу. Хороший переход короткий (для крупных изменений экрана — около 200–300 мс), не блокирует ввод, сохраняет общий элемент вроде карточки, раскрывающейся в страницу, и превращается в простое проявление, если пользователь включил «уменьшить движение».
После материала вы сможете
- выбрать движение перехода по пространственной модели: вглубь, назад, модальное окно, боковое меню, вкладки
- объяснить переход с общим элементом и приём FLIP
- определить, когда применять View Transitions API в режимах same-document и cross-document, и подключать его как улучшение
- проверить переходы по чек-листу: 200–300 мс, прерываемость, каркас вместо пустоты, режим уменьшенного движения
Содержание
- Почему резкая смена экрана сбивает с толку
- Пространственная модель: вперёд, назад, вглубь
- Непрерывность: общий элемент и смена состояний
- View Transitions API и нативные переходы
- Загрузка между экранами: не показывать пустоту
- Длительность, производительность и уменьшенное движение
- Типичные ошибки и чек-лист
Почему резкая смена экрана сбивает с толку
Когда один экран мгновенно подменяется другим, человеку приходится заново собирать картину: это новая страница, окно поверх старой или та же страница, только прокрученная? На телефоне меняется весь экран, и связь между «было» и «стало» теряется. Nielsen Norman Group отмечает, что аккордеоны, якорные ссылки и полноэкранные меню, появляющиеся мгновенно, дезориентируют: без анимированной подсказки непонятно, открылась новая страница или что-то другое.
Переход решает эту задачу за долю секунды: показывает, откуда пришёл новый экран, где остался старый и в какую сторону возвращаться. Это не украшение, а часть навигации — такая же, как хлебные крошки или кнопка «Назад». В предыдущем уроке трека мы разбирали микроанимации отдельных кнопок и переключателей; здесь речь о движении целых экранов и крупных состояний.
Пространственная модель: вперёд, назад, вглубь
Интерфейс удобно представлять как пространство, по которому человек перемещается. Тогда у каждого направления своё движение, и оно одинаково во всём продукте. Nielsen Norman Group описывает такую анимацию как понятную пространственную метафору: она подсказывает, где пользователь находится в информационном пространстве. Самый наглядный пример — путь покупателя в каталоге.
- 01Каталог
- 02Карточка товара
- 03Отзывы
- 04Оформление
Шаг вглубь: из списка в карточку
- Движение
- Новый экран въезжает справа или вырастает из нажатого элемента
- Что понимает человек
- Я спустился на уровень ниже, прежний экран остался рядом
Возврат назад
- Движение
- То же движение в обратную сторону: экран уходит вправо, список возвращается
- Что понимает человек
- Я там, откуда пришёл
Модальное окно, шторка
- Движение
- Поднимается снизу и опускается обратно при закрытии
- Что понимает человек
- Это временная задача поверх текущего экрана, а не новая страница
Боковое меню
- Движение
- Выезжает с той стороны, где находится кнопка
- Что понимает человек
- Меню прикреплено к краю, его можно задвинуть обратно
Соседние вкладки
- Движение
- Короткий сдвиг в сторону выбранной вкладки или проявление на месте
- Что понимает человек
- Я на том же уровне, просто в соседнем разделе
Главное правило — обратимость. Apple Human Interface Guidelines приводит пример: если панель появилась, съехав сверху, человек не ожидает, что закрывать её нужно смахиванием вбок. Движение создаёт ожидание, и жест закрытия должен ему соответствовать. Поэтому в проектах InterLAB мы описываем систему переходов вместе с дизайн-системой: один набор движений и длительностей на весь продукт, а не решение «на глаз» для каждого экрана.
Непрерывность: общий элемент и смена состояний
Самый сильный приём непрерывности — переход с общим элементом (shared element transition). Человек нажимает на карточку в каталоге, и она не исчезает, а раскрывается: картинка растёт до шапки новой страницы, заголовок переезжает на своё место, остальное содержимое проявляется вокруг. Глаз следит за одним объектом и не теряет его, поэтому вопрос «туда ли я нажал» просто не возникает.
Тот же принцип работает внутри одного экрана, когда меняется не страница, а состояние:
- Аккордеон: раскрываемый блок плавно растёт, а контент ниже съезжает, а не прыгает — видно, что именно открылось
- Вкладки: индикатор активной вкладки переезжает под новую, содержимое сменяется коротким проявлением
- Удаление из списка: строка схлопывается, соседи подтягиваются — понятно, что пропало и что ничего не сломалось
- Добавление в список: новая строка раздвигает соседей и проявляется на своём месте, а не возникает вместе с рывком всего списка
Чтобы такие перестановки шли плавно даже на слабом телефоне, разработчики используют приём FLIP. Название складывается из первых букв четырёх шагов:
First — «было»
Запоминаем, где элемент находится и какого он размера сейчас.
Last — «стало»
Мгновенно применяем новое состояние и измеряем, где элемент оказался.
Invert — «вернуть»
Сдвигаем элемент обратно в старую позицию через transform — визуально пока ничего не изменилось.
Play — «отпустить»
Убираем сдвиг, и элемент едет из старой позиции в новую. Браузер анимирует только transform, а это дёшево.
View Transitions API и нативные переходы
Долгое время плавные переходы между страницами были доступны в основном одностраничным приложениям: на обычном сайте браузер при переходе по ссылке просто показывал новую страницу. View Transitions API меняет это. Браузер делает снимок старого состояния, применяет новое и анимирует разницу. По умолчанию это перекрёстное проявление (cross-fade), а элементам с одинаковым свойством view-transition-name на старом и новом экране можно задать перелёт из одной позиции в другую — так на вебе и делается общий элемент.
Внутри документа (same-document)
- Как запускается
- Вызов document.startViewTransition() вокруг обновления страницы
- Где подходит
- Одностраничные приложения, фильтры, вкладки, смена вида списка
Между документами (cross-document)
- Как запускается
- Обе страницы включают переход CSS-правилом @view-transition { navigation: auto; }, запускает его обычный переход по ссылке
- Где подходит
- Многостраничные сайты; работает только в пределах одного origin
В мобильных приложениях многое уже встроено в стандартные компоненты навигации, и лучше опираться на них, чем изобретать своё: к этим движениям пользователь привык в каждом приложении на телефоне. На iOS для отдельной задачи Apple HIG рекомендует модальные листы (sheets) и всплывающие панели. На Android в Jetpack Compose общий элемент собирается из SharedTransitionLayout и модификаторов sharedElement и sharedBounds, а предиктивный жест «Назад» показывает анимированное превью экрана, на который человек вернётся, ещё до завершения жеста.
Загрузка между экранами: не показывать пустоту
Самый неприятный переход — когда анимация закончилась, а показывать нечего: белый экран или одинокий спиннер. Человек не понимает, работает ли приложение. Решение — каркас (skeleton): экран приходит сразу, с серыми блоками на месте заголовка, картинки и строк, а данные проявляются по мере загрузки.
Nielsen Norman Group рекомендует каркасы для загрузки страницы с ожиданием до 10 секунд, а для более долгих операций — индикатор прогресса. Каркас должен повторять структуру будущей страницы: «пустая рамка» из шапки и фона без очертаний контента, по оценке NN/g, по сути не лучше спиннера.
Второй приём — оптимистичная навигация: переход начинается сразу по нажатию, не дожидаясь ответа сервера.
- Экран открывается мгновенно с тем, что уже известно: из карточки в списке мы знаем название, картинку и цену — их показываем сразу
- Остальное догружается в каркас на свои места, без скачков раскладки
- Ошибка загрузки показывается внутри нового экрана с кнопкой «Повторить», а не молчаливым возвратом назад
Длительность, производительность и уменьшенное движение
Переход забирает у человека время при каждом нажатии, поэтому длительность важнее эффектности. Nielsen Norman Group считает 200–300 мс подходящими для крупных изменений экрана вроде появления модального окна, 400 мс — уже очень медленной анимацией для больших перемещений, а около 500 мс движение начинает раздражать. Там же отмечено, что появление обычно делают чуть длиннее исчезновения.
100ms200ms300ms500ms1000ms- Анимируем transform и opacity — по рекомендации web.dev браузер обрабатывает их дешевле, чем смену размеров и отступов
- Не запускаем посреди перехода тяжёлые эффекты: размытие на весь экран, большие тени
- Проверяем на недорогом Android-телефоне: дёргающийся переход хуже, чем никакого
- Не блокируем ввод: если человек нажал «Назад» посреди анимации, переход должен прерваться и развернуться, а не доиграть до конца
Отдельная тема — режим уменьшенного движения. Если человек включил его в настройках системы, сайт узнаёт об этом через медиазапрос prefers-reduced-motion. Критерий WCAG 2.3.3 описывает требование: анимацию, которую запускает взаимодействие, должно быть можно отключить, если она не необходима. Для переходов это значит: вместо сдвигов, увеличения и перелёта карточки — короткое проявление на месте. Смысл «экран сменился» сохраняется, укачивающего движения нет.
Типичные ошибки и чек-лист
Мешает
- Долгий переход, во время которого нельзя ничего нажать
- Каждый экран анимируется по-своему: один въезжает справа, другой снизу, третий вращается
- Движение ради эффекта, которое не объясняет, куда вы попали
- «Назад» проигрывает ту же анимацию, что и «вперёд»
- Пустой белый экран после красивого перехода
Помогает
- Короткий переход, который можно прервать
- Одна система: вглубь — справа, временное — снизу, соседнее — проявлением
- Общий элемент, который связывает список и страницу
- Обратное движение при возврате
- Каркас вместо пустоты
- Для каждого типа перехода (вглубь, назад, модальное окно, вкладки) выбрано одно движение, и оно одинаково во всём продукте
- «Назад» проигрывает движение «вперёд» в обратную сторону
- Модальные окна и шторки поднимаются снизу, закрываются тем же путём и имеют очевидную кнопку закрытия
- Крупные переходы укладываются примерно в 200–300 мс, ничего не тянется дольше 400–500 мс
- Переход можно прервать, ввод во время анимации не блокируется
- Между экранами — каркас, а не белый экран или одинокий спиннер
- Анимируются только transform и opacity, переходы проверены на недорогом телефоне
- При prefers-reduced-motion сдвиги и увеличения заменены проявлением
Переход удался, если после него человек не задаётся вопросом, где он находится.
Источники
- Nielsen Norman Group — The Role of Animation and Motion in UX
- Nielsen Norman Group — Executing UX Animations: Duration and Motion Characteristics
- Nielsen Norman Group — Skeleton Screens 101
- MDN — View Transition API
- MDN — Using the View Transition API
- MDN — @view-transition
- Chrome for Developers — Same-document view transitions
- Chrome for Developers — Cross-document view transitions
- W3C — CSS View Transitions Module Level 1
- web.dev — How to create high-performance CSS animations
- web.dev — prefers-reduced-motion: Sometimes less movement is more
- W3C WAI — Understanding SC 2.3.3: Animation from Interactions
- Apple Human Interface Guidelines — Motion
- Apple Human Interface Guidelines — Modality
- Android Developers — Shared element transitions in Compose
- Android Developers — Predictive back gesture