Анимация. Часть 2¶
Переиспользование анимации¶
В Angular анимации можно определить стили один раз и использовать их в нескольких компонентах при создании для них анимированных смен состояний (подобно переиспользованию компонентов, директив и др.).
Используя метод animation() опишите анимацию и экспортируйте ее.
1 2 3 4 5 6 7 8 | |
В двойных фигурных скобках описаны параметры, передаваемые анимации при ее вызове через useAnimation(). Также допустимо использование константных значений.
Пример такой Angular анимации.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
Функция useAnimation() принимает два параметра: первый — анимация, определенная для переиспользования, второй — объект, в свойстве params которого указываются значения параметров.
Сложная анимация¶
Под сложной анимацией в Angular понимается одновременная или последовательная работа нескольких простых анимаций. В частности, например, она позволяет сделать анимированным появление/исчезание связанной последовательности элементов (пункты списка, строки таблицы).
Реализуется подобное с помощью следующих функций:
query()— находит один и более дочерних HTML-элементов по заданному критерию в пределах элемента, к которому применяется анимация, и применяет ее к каждому из них;stagger()— устанавливает задержку для найденных функциейquery()элементов;group()— запускает все составляющие анимации параллельно;sequence()— запускает все составляющие последовательно.
Рассмотрим применение сложной анимации одновременно к нескольким элементам, используя query() и stagger().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
Здесь Angular анимация appearingItems определяется для появляющихся элементов списка (состояние :enter) с классом стилей .users.
Первым параметром query() передается селектор (критерий поиска элементов), а вторым — массив с описанием анимации, где первое использование функции style() задает исходные стили для элементов, попадающих под критерий поиска.
Теперь перейдем к примеру с использованием group().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
Сразу стоит отметить, что функция group() группирует не элементы, а стадии составной анимации применительно к одному элементу, которые работают одновременно и независимо друг от друга.
Как и в предыдущем примере, использование style() задает исходные стили элемента. Далее с помощью group() для каждого свойства задается своя конфигурация анимирования.
Для выполнения этой же Angular анимации последовательно без использования задержки, используется функция sequence().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
Анимированная смена маршрутов¶
Анимация маршрутов требует понимания работы модуля маршрутизации Angular.
Фактически переход с одного URL приложения на другой — это просто смена представлений (change views). Используя анимацию Angular можно сделать смену маршрутов анимированной.
app-routing.module.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
app.component.html
1 2 3 4 5 | |
app.component.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
change-route-animation.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | |
Теперь по порядку. Для определения анимированной смены представления при смене URL используется свойство animation (название может быть другим), указанное в свойстве маршрута data. В качестве значения свойству animation задается имя состояния анимации.
В шаблоне компонента (app.component.html), в котором будет происходить загрузка представления по запрашиваемому URL, элемент <router-outlet> является дочерним по отношению к элементу <div>, для которого определяется routeChangeAnimation. Для определения имени состояния используется метод getRouteAnimationState(), извлекающий значение свойства animation, заданное для текущего маршрута.
Определение самой Angular анимации ограничивается в данном случае описанием смены между собой пары состояний page1 и page2.
Поскольку в момент смены состояний новое представление вставляется сразу же после предыдущего, элементу, для которого определен триггер, задается относительное позиционирование, а дочерним по отношению к нему элементам — абсолютное. Это нужно для избежания одновременного появления на странице двух представлений.
1 2 3 4 5 6 7 8 9 | |
Здесь query() используется для задания исходных стилей выборке элементов.
Далее представление маршрута, на который осуществляется переход, скрывается сдвигом влево.
1 | |
А в представлении, с которого происходит переход, инициируется с помощью функции animateChild() вызов его дочерних анимаций.
1 | |
Для понимания, в коде ниже анимация childAnimation является дочерней по отношению к анимации parentAnimation:
1 2 3 | |
Таким образом, если функция childAnimate() вызывается в parentAnimation, то будет запущена анимация childAnimation.
После функция group() запускает одновременно анимированную смену представлений. Старое представление сдвигается за пределы окна вправо, а новое, которое было изначально спрятано слева, появляется.
1 2 3 4 5 6 7 8 | |
И в конце инициируется запуск дочерних Angular анимаций нового представления.
1 | |