ФронтендJavaScriptHTML / CSS

View Transitions API: плавные переходы между страницами без фреймворка

Добавляем плавный переход между страницами на чистом HTML и CSS, настраиваем view-transition-name и делаем безопасный fallback.

Кодик

Автор

6 мин чтения

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

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

1Соберите минимум

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

2Увидьте данные

same-origin навигация получает стандартный fade. Проверяйте значение, а не отсутствие ошибки.

3Измените правило

После успеха добавьте разные имена изображения и заголовка, сохранив короткую общую длительность. Так копирование станет практикой.

Как устроен учебный проект View Transitions API

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

ЭтапДействиеПроверяемый результат
Разметкасоздать список и страницу детали с одним и тем же объектомобе страницы работают без анимации
Включениедобавить директиву navigation: autosame-origin навигация получает стандартный fade
Связьназначить уникальный view-transition-name общей карточкеобъект плавно меняет позицию и размер
Доступностьучесть prefers-reduced-motion и fallbackнавигация остаётся мгновенной при уменьшении движения

Контрольные точки: разметка, включение, связь и доступность. Следующий шаг начинается после совпадения с ожидаемым результатом.

Путь данных в проекте View Transitions API
От входных данных до видимого результата. Сначала проверяется вход, затем действие и только потом интерфейс.

Зафиксируйте первый успех Сначала убедитесь, что ссылки работают как обычная навигация. Анимация не должна быть единственным способом открыть страницу. Сохраните команду запуска и ожидаемый вывод.

Собираем рабочий пример шаг за шагом

Пример сверялся с актуальной документацией MDN View Transition API на 19 октября 2026 года. Создайте два HTML-файла и откройте их через локальный сервер, например npx serve. Переходы между file:// не являются надёжным тестом. Проверьте текущую папку через pwd или Get-Location. Вставьте пример целиком, выполните один раз, затем разбирайте по частям.

@view-transition {
  navigation: auto;
}

.course-card[data-id="python"] {
  view-transition-name: course-python;
}

::view-transition-old(root),
::view-transition-new(root) {
  animation-duration: 260ms;
  animation-timing-function: ease-out;
}

::view-transition-group(course-python) {
  animation-duration: 420ms;
}

@media (prefers-reduced-motion: reduce) {
  ::view-transition-group(*) {
    animation-duration: 1ms;
  }
}
Что должно произойти после запуска
  • Обычная навигация между страницами получает короткое затухание.
  • Карточка Python с одинаковым именем плавно переходит из сетки в заголовок страницы.
  • Повторный запуск даёт тот же предсказуемый результат.
  • Пустой ввод получает понятное сообщение вместо падения.

Директива включает переходы навигации, а view-transition-name связывает конкретный визуальный объект между состояниями. Найдите в примере вход, проверку и место формирования результата.

Хрупкий и проверяемый вариант View Transitions API
Что отличает устойчивый проект от случайного запуска. Явные границы делают ошибку локальной и понятной.

Что происходит внутри и почему это работает

Во время перехода браузер рисует специальные псевдоэлементы ::view-transition-old и ::view-transition-new. Реальный DOM уже обновляется, а пользователь видит анимацию снимков. Логику держите отдельно от вывода: функция получает аргумент и возвращает значение, а интерфейс показывает его. Имена должны быть уникальны в одном состоянии. Если два видимых элемента получают одинаковый view-transition-name, переход может быть пропущен.

ЧастьЗа что отвечаетЧто проверить
Навигацияменяет документ или состояние приложенияссылка и история работают без API
Идентичностьview-transition-name связывает общий элементв каждый момент имя уникально
Анимацияпсевдоэлементы задают длительность и easingreduced motion сокращает движение

Не анимируйте все элементы сразу. Сильнее работает один общий объект и спокойный переход фона. Длинные задержки заставляют интерфейс казаться медленным. Для навигации обычно достаточно 180-420 мс, но проверяйте ощущение на реальном устройстве и при возврате назад. Не прячьте поток в одном обработчике: сохраните вход, проверьте его, вызовите операцию и только затем обновите интерфейс.

Проверьте границу Временно задайте одинаковое имя двум карточкам и посмотрите предупреждение DevTools. Затем верните уникальность. Меняйте одно условие за прогон, чтобы видеть причину.

Проверяем проект и добавляем свою функцию

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

Проверка своими руками
  1. Сохраните ожидаемый результат: переход запускается при клике, карточка не прыгает, кнопка Назад работает, а без поддержки API страницы остаются обычными.
  2. Измените правило: добавьте разные имена изображения и заголовка, сохранив короткую общую длительность. Сначала предскажите итог.
  3. Передайте граничное значение и убедитесь, что приложение не падает.
  4. Верните корректные данные и объясните роли трёх основных частей.
Готово, если выполняются все пункты
  • обе страницы работают без анимации
  • same-origin навигация получает стандартный fade
  • объект плавно меняет позицию и размер
  • навигация остаётся мгновенной при уменьшении движения

Переход должен объяснять связь экранов, а не задерживать пользователя ради эффекта. Полезная правка проходит от нового ввода до видимого результата.

Четыре контрольные точки View Transitions API
Четыре проверки перед следующим шагом. Каждый следующий этап начинается после наблюдаемого результата.

Что запомнить и куда двигаться дальше

Проверьте прямое открытие URL, Назад/Вперёд, reduced motion и браузер без поддержки. Если все сценарии работают без анимации, enhancement сделан правильно. Для закрепления откройте в статье про тёмную тему, в доступном бургер-меню и в PWA на JavaScript.

Как изучить тему в Кодике

Начните с CSS-псевдоэлементов и навигации, а затем переходите к программному document.startViewTransition. Сначала восстановите главную функцию и проверьте её на трёх значениях.

ШагЧто разобратьМини-проверка
1. ОсноваСсылки, история, псевдоэлементы и media queriesОбъясните вход и выход функции.
2. Инструмент@view-transition, имена и группы снимковПовторите команду по памяти.
3. ПроектКаталог и детальную страницу с общим элементомПроверьте два сценария.
4. РефакторингДинамические переходы и тесты доступностиРазделите ввод, логику и вывод.

Попробуйте описать, что именно сообщает движение. Если ответа нет, эффект можно убрать. Базовый синтаксис закрепите через курс CSS.

Повторяющиеся имена

Два элемента претендуют на одну группу. Генерируйте имя из устойчивого id.

Сломанная базовая ссылка

Навигация зависит от JavaScript. Сначала оставьте рабочий href.

Слишком долгая анимация

Пользователь ждёт интерфейс. Сократите длительность и не анимируйте всё.

Игнорирование reduced motion

Движение может мешать. Добавьте media query и почти мгновенный вариант.

Сверяйтесь с первичной документацией. Команды и ограничения примера проверены по MDN View Transition API. Если версия инструмента изменилась, официальный источник важнее старого скриншота.

Что получится в итоге

Готовый результат проекта: View Transitions API: плавные переходы между страницами без фреймворка
Так выглядит законченный учебный проект: есть понятный вход, видимый результат, защита от неверных данных и место для следующего улучшения.

Короткие ответы
Что анимирует браузер во время view transition?

Снимки старого и нового состояния в специальных псевдоэлементах.

Обязательно ли использовать JavaScript?

Нет. Для same-origin навигации можно включить переходы CSS-директивой, а JavaScript нужен для управляемых обновлений.

Что проверять первым, если View Transitions API не запускается?

Версию среды, текущую папку, команду запуска и первую строку ошибки.

Как понять, что проект View Transitions API работает?

Проверьте основной сценарий, неверный ввод, повторный запуск и один граничный случай.

Можно ли начать с готового кода?

Да. Добейтесь результата, измените одно правило и восстановите ключевую функцию без копирования.

Сделайте один осознанный шаг дальше

Выберите одно улучшение и проведите его от ввода до результата.

Если не хватает основы, перейдите курс CSS, затем восстановите ключевую функцию без подсказки.