Ознакомьтесь с некоторыми из этих руководств и обучающих материалов, а затем вернитесь к этому руководству.
Создание повторно используемых анимаций
Вы можете создавать повторно используемые анимации, доступные во всём приложении, используя @keyframes. Определите ключевые кадры анимации в общем CSS-файле, и вы сможете повторно использовать эти анимации с ключевыми кадрами в любом месте приложения.
Добавление класса animated-class к элементу запускает анимацию этого элемента.
Анимация перехода
Анимация состояния и стилей
Вам может потребоваться анимировать переход между двумя разными состояниями, например, когда элемент открывается или закрывается. Это можно сделать с помощью CSS-классов, используя анимацию с ключевыми кадрами или стили перехода.
Переключение в состояние open или closed выполняется изменением классов элемента в компоненте. Примеры того, как это сделать, можно найти в нашем руководстве по шаблонам.
Для анимации часто требуется настроить длительность, задержки и функции плавности. Это можно сделать с помощью нескольких CSS-свойств или сокращённых свойств.
Для анимации с ключевыми кадрами в CSS укажите animation-duration, animation-delay и animation-timing-function или воспользуйтесь сокращённым свойством animation.
Аналогично, для анимации без @keyframes можно использовать transition-duration, transition-delay и transition-timing-function, а также сокращённое свойство transition.
Анимацию можно запустить, переключая CSS-стили или классы. Когда класс добавлен к элементу, запускается анимация. Удаление класса возвращает элемент к стилям CSS, определённым для него. Вот пример:
Если вам не нужно обеспечивать поддержку всех браузеров, обратите внимание на calc-size() — это настоящее решение для анимации автоматической высоты. Дополнительную информацию см. в документации MDN и этом руководстве.
Анимация появления и исчезновения элемента в представлении
Вы можете создавать анимации для появления элемента в представлении или его исчезновения. Начнём с того, как анимировать появление элемента. Для этого мы используем animate.enter, который применяет классы анимации при появлении элемента в представлении.
Анимация исчезновения элемента из представления похожа на анимацию его появления. Используйте animate.leave, чтобы указать, какие классы CSS применять при исчезновении элемента из представления.
Применение этого класса к элементу предотвращает запуск любых анимаций для него. Вместо этого можно задать область действия класса для всего DOM или его части, чтобы обеспечить такое поведение. Однако это не позволяет запускать события анимации. Если вы ожидаете события анимации перед удалением элемента, это решение не подойдёт. В качестве обходного решения можно задать длительность в 1 миллисекунду.
Используйте медиазапрос prefers-reduced-motion, чтобы анимации не запускались у пользователей, которые предпочитают уменьшить их количество.
Не добавляйте классы анимации программно
Обратные вызовы анимации
Если вы хотите выполнять действия в определённые моменты анимации, можно подписаться на ряд доступных событий. Вот некоторые из них.
Web Animations API предоставляет множество дополнительных возможностей. Ознакомьтесь с документацией, чтобы узнать обо всех доступных API для анимации.
ПРИМЕЧАНИЕ: Помните о проблемах всплытия событий при использовании этих обратных вызовов. Если вы анимируете дочерние и родительские элементы, события всплывают от дочерних элементов к родительским. Чтобы определить, обрабатываете ли вы событие именно для нужной цели, а не событие, всплывшее от дочернего узла, остановите распространение события или изучите его подробнее. Убедиться, что выбраны нужные узлы, можно по свойству animationname или свойствам, для которых выполняется переход.
Сложные последовательности
Анимации часто бывают сложнее простого появления или исчезновения. Возможно, вам понадобится запускать множество сложных последовательностей анимации. Рассмотрим несколько возможных сценариев.
Последовательный запуск анимаций в списке
Распространённый эффект — запускать анимацию каждого элемента списка с небольшой задержкой, создавая каскадный эффект. Этого можно добиться с помощью animation-delay или transition-delay. Вот как может выглядеть соответствующий CSS.
С помощью сокращённого свойства animation можно одновременно применить к элементу несколько анимаций. Для каждой из них можно задать собственную длительность и задержку. Это позволяет комбинировать анимации и создавать сложные эффекты.
В этом примере анимации rotate и fade-in запускаются одновременно, но имеют разную длительность.
Анимация элементов списка при изменении порядка
Элементы в цикле @for будут удалены и добавлены снова, что запустит анимации появления с помощью @starting-styles. Для такого же поведения можно использовать animate.enter. Используйте animate.leave, чтобы анимировать удаление элементов, как показано в примере ниже.
import {Component, signal} from '@angular/core';
@Component({
selector: 'app-reorder',
templateUrl: './reorder.html',
styleUrls: ['reorder.css'],
})
export class Reorder {
show = signal(true);
items = ['stuff', 'things', 'cheese', 'paper', 'scissors', 'rock'];
randomize() {
const randItems = [...this.items];
const newItems = [];
for (let i of this.items) {
const max: number = this.items.length - newItems.length;
const randNum = Math.floor(Math.random() * max);
newItems.push(...randItems.splice(randNum, 1));
}
this.items = newItems;
}
}
Получить анимации элемента можно напрямую с помощью Element.getAnimations(). Этот метод возвращает массив всех объектов Animation этого элемента. С помощью API Animation можно сделать гораздо больше, чем позволял AnimationPlayer из пакета анимаций. С его помощью можно cancel(), play(), pause(), reverse() и многое другое. Этот встроенный API должен предоставить всё необходимое для управления анимациями.
Подробнее об анимациях Angular
Возможно, вас также заинтересуют следующие материалы: