Анимация. Часть 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 |
|