Как делать11 октября 2026 г.8 мин чтения
Моушн и анимацияШаг 4 из 4

Переходы между экранами и состояниями: как движение объясняет, куда вы попали

Коротко

Переход между экранами нужен, чтобы человек понял, куда он попал и как вернуться: шаг вглубь приходит справа или «вырастает» из нажатого элемента, возврат повторяет то же движение в обратную сторону, модальное окно поднимается снизу. Хороший переход короткий (для крупных изменений экрана — около 200–300 мс), не блокирует ввод, сохраняет общий элемент вроде карточки, раскрывающейся в страницу, и превращается в простое проявление, если пользователь включил «уменьшить движение».

Глубокий разборУровень: СреднийМоушн-дизайн

После материала вы сможете

  • выбрать движение перехода по пространственной модели: вглубь, назад, модальное окно, боковое меню, вкладки
  • объяснить переход с общим элементом и приём FLIP
  • определить, когда применять View Transitions API в режимах same-document и cross-document, и подключать его как улучшение
  • проверить переходы по чек-листу: 200–300 мс, прерываемость, каркас вместо пустоты, режим уменьшенного движения
Содержание
  1. 01Почему резкая смена экрана сбивает с толку
  2. 02Пространственная модель: вперёд, назад, вглубь
  3. 03Непрерывность: общий элемент и смена состояний
  4. 04View Transitions API и нативные переходы
  5. 05Загрузка между экранами: не показывать пустоту
  6. 06Длительность, производительность и уменьшенное движение
  7. 07Типичные ошибки и чек-лист

Почему резкая смена экрана сбивает с толку

Когда один экран мгновенно подменяется другим, человеку приходится заново собирать картину: это новая страница, окно поверх старой или та же страница, только прокрученная? На телефоне меняется весь экран, и связь между «было» и «стало» теряется. Nielsen Norman Group отмечает, что аккордеоны, якорные ссылки и полноэкранные меню, появляющиеся мгновенно, дезориентируют: без анимированной подсказки непонятно, открылась новая страница или что-то другое.

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

Пространственная модель: вперёд, назад, вглубь

Интерфейс удобно представлять как пространство, по которому человек перемещается. Тогда у каждого направления своё движение, и оно одинаково во всём продукте. Nielsen Norman Group описывает такую анимацию как понятную пространственную метафору: она подсказывает, где пользователь находится в информационном пространстве. Самый наглядный пример — путь покупателя в каталоге.

  1. 01Каталог
  2. 02Карточка товара
  3. 03Отзывы
  4. 04Оформление
Каждый шаг вперёд — на уровень глубже; «Назад» проходит тот же путь в обратном направлении.

Шаг вглубь: из списка в карточку

Движение
Новый экран въезжает справа или вырастает из нажатого элемента
Что понимает человек
Я спустился на уровень ниже, прежний экран остался рядом

Возврат назад

Движение
То же движение в обратную сторону: экран уходит вправо, список возвращается
Что понимает человек
Я там, откуда пришёл

Модальное окно, шторка

Движение
Поднимается снизу и опускается обратно при закрытии
Что понимает человек
Это временная задача поверх текущего экрана, а не новая страница

Боковое меню

Движение
Выезжает с той стороны, где находится кнопка
Что понимает человек
Меню прикреплено к краю, его можно задвинуть обратно

Соседние вкладки

Движение
Короткий сдвиг в сторону выбранной вкладки или проявление на месте
Что понимает человек
Я на том же уровне, просто в соседнем разделе

Главное правило — обратимость. Apple Human Interface Guidelines приводит пример: если панель появилась, съехав сверху, человек не ожидает, что закрывать её нужно смахиванием вбок. Движение создаёт ожидание, и жест закрытия должен ему соответствовать. Поэтому в проектах InterLAB мы описываем систему переходов вместе с дизайн-системой: один набор движений и длительностей на весь продукт, а не решение «на глаз» для каждого экрана.

Непрерывность: общий элемент и смена состояний

Самый сильный приём непрерывности — переход с общим элементом (shared element transition). Человек нажимает на карточку в каталоге, и она не исчезает, а раскрывается: картинка растёт до шапки новой страницы, заголовок переезжает на своё место, остальное содержимое проявляется вокруг. Глаз следит за одним объектом и не теряет его, поэтому вопрос «туда ли я нажал» просто не возникает.

Тот же принцип работает внутри одного экрана, когда меняется не страница, а состояние:

  • Аккордеон: раскрываемый блок плавно растёт, а контент ниже съезжает, а не прыгает — видно, что именно открылось
  • Вкладки: индикатор активной вкладки переезжает под новую, содержимое сменяется коротким проявлением
  • Удаление из списка: строка схлопывается, соседи подтягиваются — понятно, что пропало и что ничего не сломалось
  • Добавление в список: новая строка раздвигает соседей и проявляется на своём месте, а не возникает вместе с рывком всего списка

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

  1. First — «было»

    Запоминаем, где элемент находится и какого он размера сейчас.

  2. Last — «стало»

    Мгновенно применяем новое состояние и измеряем, где элемент оказался.

  3. Invert — «вернуть»

    Сдвигаем элемент обратно в старую позицию через transform — визуально пока ничего не изменилось.

  4. 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 мс движение начинает раздражать. Там же отмечено, что появление обычно делают чуть длиннее исчезновения.

duration
100ms
200ms
300ms
500ms
1000ms
Нажмите «Повторить» и сравните: 200–300 мс читаются как переход, 1000 мс — как ожидание.
  • Анимируем transform и opacity — по рекомендации web.dev браузер обрабатывает их дешевле, чем смену размеров и отступов
  • Не запускаем посреди перехода тяжёлые эффекты: размытие на весь экран, большие тени
  • Проверяем на недорогом Android-телефоне: дёргающийся переход хуже, чем никакого
  • Не блокируем ввод: если человек нажал «Назад» посреди анимации, переход должен прерваться и развернуться, а не доиграть до конца

Отдельная тема — режим уменьшенного движения. Если человек включил его в настройках системы, сайт узнаёт об этом через медиазапрос prefers-reduced-motion. Критерий WCAG 2.3.3 описывает требование: анимацию, которую запускает взаимодействие, должно быть можно отключить, если она не необходима. Для переходов это значит: вместо сдвигов, увеличения и перелёта карточки — короткое проявление на месте. Смысл «экран сменился» сохраняется, укачивающего движения нет.

Типичные ошибки и чек-лист

Мешает

  • Долгий переход, во время которого нельзя ничего нажать
  • Каждый экран анимируется по-своему: один въезжает справа, другой снизу, третий вращается
  • Движение ради эффекта, которое не объясняет, куда вы попали
  • «Назад» проигрывает ту же анимацию, что и «вперёд»
  • Пустой белый экран после красивого перехода

Помогает

  • Короткий переход, который можно прервать
  • Одна система: вглубь — справа, временное — снизу, соседнее — проявлением
  • Общий элемент, который связывает список и страницу
  • Обратное движение при возврате
  • Каркас вместо пустоты
  • Для каждого типа перехода (вглубь, назад, модальное окно, вкладки) выбрано одно движение, и оно одинаково во всём продукте
  • «Назад» проигрывает движение «вперёд» в обратную сторону
  • Модальные окна и шторки поднимаются снизу, закрываются тем же путём и имеют очевидную кнопку закрытия
  • Крупные переходы укладываются примерно в 200–300 мс, ничего не тянется дольше 400–500 мс
  • Переход можно прервать, ввод во время анимации не блокируется
  • Между экранами — каркас, а не белый экран или одинокий спиннер
  • Анимируются только transform и opacity, переходы проверены на недорогом телефоне
  • При prefers-reduced-motion сдвиги и увеличения заменены проявлением
Переход удался, если после него человек не задаётся вопросом, где он находится.
Расскажите о задаче — мы изучим запрос и свяжемся с вами

Есть задача?
Обсудим и оценим — бесплатно.

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

  • Оценка объёма и рисков до старта
  • NDA — по вашему или нашему шаблону
  • Старт работ в течение недели

Не присылайте через форму пароли, ключи доступа и исходный код — безопасную передачу доступа обсудим отдельно.

Нажимая кнопку, вы соглашаетесь с обработкой персональных данных.