Переходы и анимации в Vue.js: руководство
Переходы и анимации делают интерфейс более плавным и понятным. В Vue.js для этого есть встроенный компонент transition и поддержка CSS-анимаций (keyframes). В статье объяснено, как применять классы перехода при монтировании и размонтировании элементов, как давать переходам имя, как создавать сложные анимации через @keyframes, а также приведены практические советы по доступности, тестированию и внедрению в рабочий проект.

Визуальные переходы и анимации существенно влияют на пользовательский опыт. Неброские анимации и аккуратные переходы между элементами страницы делают интерфейс более гладким, вовлекающим и понятным.
Это руководство показывает, как реализовать переходы и анимации в Vue.js. Вы научитесь создавать и простые переходы, и более сложные эффекты с помощью компонента transition и CSS keyframes.
Компонент transition в Vue.js
Vue.js включает компонент transition, который используется для добавления анимаций при появлении и исчезновении элементов. Компонент оборачивает элемент, который нужно анимировать.
В примере компонент transition оборачивает заголовок первого уровня:
Hello
Когда элемент обёрнут в компонент transition, Vue по очереди применяет к нему специальные классы. Всего — шесть классов: три для появления (enter) и три для исчезания (leave).
Код, используемый в статье, доступен в GitHub-репозитории и распространяется под лицензией MIT.
Как работают классы при появлении элемента
Во время появления элемента в DOM компонент transition применяет классы enter-from, enter-to и enter-active. Эти классы задают начальное состояние, финишное состояние и поведение перехода (например, длительность).
- enter-from: применяется до того, как элемент отрисован браузером. Используется для определения начального CSS-состояния.
- enter-to: применяется по мере появления элемента — это конечное состояние.
- enter-active: применяется в процессе перехода и задаёт продолжительность и функцию временной интерполяции.
Пример:
Hello
.enter-from {
opacity: 0;
}
.enter-to {
opacity: 1;
}
.enter-active {
transition: opacity 2s ease;
}
С этим кодом заголовок плавно проявляется за две секунды — от полностью прозрачного (opacity: 0) до полностью видимого (opacity: 1).
Как работают классы при исчезновении элемента
Для удаления есть симметричные классы leave-from, leave-to и leave-active. Они активируются перед размонтированием элемента из DOM и задают анимацию исчезновения.
Пример:
Hello
.leave-from {
opacity: 0;
}
.leave-to {
opacity: 1;
}
.leave-active {
transition: opacity 2s ease;
}
В этом примере заголовок постепенно скрывается за две секунды.
Важно: понимание базовых понятий DOM (монтирование и размонтирование) поможет при работе с переходами.
Именованные переходы
Вы можете задать атрибут name у transition. Тогда Vue будет дописывать это имя в начало всех классов, что удобно при множественных переходах на одной странице.
Например, если name=”fade”, классы будут иметь префикс fade:
Hello
.fade-enter-from {
opacity: 1;
}
.fade-leave-from {
opacity: 1;
}
// other "enter" and "leave" classes with the fade as prefix
Пример: создание перехода в компоненте
Далее мы покажем конкретную реализацию. Оборачиваем H1 в transition и добавляем кнопку, которая переключает переменную showTitle между false и true.
Hey People
Далее — script с setup и реактивной переменной showTitle:
В браузере отобразится текст и кнопка:

При первом клике H1 появится, при втором — исчезнет. Пока мы не добавили CSS-переходы, смена состояния будет мгновенной. Добавим стили:
Теперь при каждом переключении элемент будет аккуратно проявляться и исчезать за две секунды.
Сложные анимации через CSS keyframes
Если нужно более сложное движение, используйте CSS @keyframes. Keyframes позволяют описать несколько этапов анимации.
Определение: @keyframes — директива CSS для задания ключевых кадров анимации.
Пример «wobble» — покачивание заголовка слева направо при появлении:
@keyframes wobble {
0% { transform: translateY(-60px); opacity: 0}
50% {transform: translateY(0px); opacity: 1}
60% {transform: translateX(8px);}
70% {transform: translateX(-8px);}
80% {transform: translateX(4px);}
90% {transform: translateX(-4px);}
100% {transform: translateX(0px);}
}
В начале заголовок скрыт. На 50% он полностью видим, затем происходит серия сдвигов по оси X, создающих эффект «покачивания».
Применение анимации при появлении через enter-active:
.fade-enter-active {
animation: wobble 0.5s ease;
}
В этом примере анимация длится 0.5 секунды.
Доступность (Accessibility)
Переходы делают интерфейс приятным, но могут также мешать некоторым пользователям. Люди с повышенной чувствительностью к анимациям или с когнитивными особенностями могут испытывать дискомфорт.
Важно уважать предпочтения пользователя по анимациям и давать возможность их отключить.
Рекомендации по доступности:
- Поддерживайте prefers-reduced-motion в CSS. Это системная настройка, которую используют люди, предпочитающие минимальную анимацию.
- Не используйте слишком быстрые мигания или яркие мерцающие эффекты.
- Оставляйте явные визуальные состояния (hover/focus/active) без единственной зависимости от анимации.
- Тестируйте с реальными пользователями и с ассистивными технологиями.
Пример использования prefers-reduced-motion:
@media (prefers-reduced-motion: reduce) {
.fade-enter-active, .fade-leave-active {
transition-duration: 0.01ms !important;
animation-duration: 0.01ms !important;
}
}
Лучшие практики и шаблон внедрения
Ниже — практическая методика и чек-лист для внедрения переходов в проект.
Мини-методология (шаги):
- Определите цель анимации — информирование, фидбэк, акцент на важном.
- Выберите тип анимации — простые переходы (opacity, transform) или keyframes для сложных сцен.
- Настройте именные transition для каждого типа компонента.
- Поддержите prefers-reduced-motion.
- Протестируйте на производительности и в разных браузерах.
- Оцените влияние на UX с участием пользователей.
Краткий чек-лист разработчика:
- Анимация решает конкретную задачу, не только декор.
- Используются transform и opacity вместо layout-affecting свойств (width/height) для оптимизации.
- Добавлена поддержка prefers-reduced-motion.
- Есть именные transition при множественных эффектах.
- Прописаны разумные длительности (обычно 150–400 мс для UI, 500–2000 мс для сценических эффектов).
- Тесты на плавность на слабых устройствах.
Чек-лист дизайнера:
- Анимация согласована с UI-гайдлайном.
- Эффекты не отвлекают от задачи.
- Есть состояния без анимации (статический fallback).
Чек-лист QA:
- Переключение редко вызывает «мерцание» или застревание компонента.
- Анимация не ломает фокус клавиатуры.
- В режиме reduced motion анимации отключены.
Когда переходы не работают или вредят UX
Примеры ошибок и контрпримеров:
- Переходы слишком длинные. Если длительность > 1.5–2 с без причины — это раздражает.
- Анимации, которые скрывают важную информацию до завершения эффекта.
- Анимации, основанные на свойствах, изменяющих layout (width/height), вместо transform — это приводит к перерасчёту макета и проблемам с производительностью.
- На мобильных устройствах сложные keyframes могут тормозить и снижать частоту кадров.
Когда лучше не использовать анимацию:
- Для критических сообщений (ошибки, предупреждение) — лучше статичный, мгновенный фидбэк.
- Для повторяющихся системных операций, где пользователь делает множество кликов в минуту.
Альтернативные подходы и сторонние библиотеки
- Чистый CSS transition и keyframes — простые случаи.
- JavaScript-анимации (requestAnimationFrame) — когда нужна тонкая синхронизация с логикой приложения.
- Библиотеки: GreenSock (GSAP) — для сложных сцен и высокопроизводительных анимаций; Animate.css — коллекция готовых CSS-анимаций.
- Web Animations API — современный API для декларативного управления анимациями из JS.
Выбор зависит от: сложности анимаций, требований к производительности и кроссбраузерной поддержке.
Критерии приёмки
Перед релизом анимаций проверьте по критериям приёмки:
- Функциональность: элементы корректно появляются и исчезают при действиях пользователя.
- Производительность: анимации не снижают FPS ниже приемлемого уровня на целевых устройствах.
- Доступность: поддержка prefers-reduced-motion и корректная работа с фокусом.
- Кроссбраузерность: основные браузеры и мобильные версии без визуальных дефектов.
- UX: анимация не мешает выполняемой задаче.
Тест-кейсы и приёмочные критерии
- Когда пользователь нажимает кнопку, заголовок появляется с ожидаемой анимацией в течение указанного времени.
- При активации system setting “reduced motion” анимация не выполняется и элемент мгновенно меняет состояние.
- На слабых устройствах анимация не вызывает заметной просадки отклика.
Советы по оптимизации и безопасность
- Для плавной анимации используйте transform и opacity, а не изменение размеров или позиционирования через top/left.
- Старайтесь избегать heavy repaints: свойства, влияющие на layout и repaint, хуже, чем transform/opacity.
- Не вставляйте пользовательский ввод напрямую в свойства animation-name или animation-duration без валидации.
Пример Playbook внедрения (SOP)
- Описание задачи и цели анимации в тикете.
- Дизайн-макет + описание состояний.
- Реализация: компонент transition + scoped CSS с именованными классами.
- Добавление prefers-reduced-motion.
- Проведение ручного QA и автоматизированных тестов визуальной регрессии (если есть).
- Проверка на мобильных устройствах и слабых CPU.
- Деплой с мониторингом ошибок и отзывов пользователей.
Резюме
Переходы и анимации — мощный инструмент улучшения UX. Vue.js предоставляет простой и гибкий API через компонент transition, а CSS keyframes расширяют набор эффектов. Всегда держите в фокусе доступность и производительность: используйте prefers-reduced-motion, оптимизируйте свойства и тестируйте на целевых устройствах.
Важно: анимации должны помогать пользователю, а не мешать ему.
Полезные ссылки и дальше
- Документация Vue.js по переходам и анимациям (официальный сайт).
- Руководство по CSS keyframes.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone