Анимация. Часть 1¶
Angular имеет свой собственный механизм реализации анимаций, в основе которого лежит стандарт Web Animations API.
В случае если стандарт не поддерживается браузером, анимирование будет реализована с использованием CSS фреймов (keyframes).
За Angular анимацию отвечает модуль BrowserAnimationsModule.
Анимации определяются прямо в @Component() и состоят из множества сменяющих друг друга состояний конкретного элемента. Описания состояний объединяются в триггер, который и является полноценной Angular animation. Рассмотрим пример.
example-panel.component.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 | |
example-panel.component.html
1 2 3 4 5 6 7 8 9 10 11 | |
Триггер определяется функцией trigger(), принимающей два аргумента — имя анимации и массив с определением состояний и описанием их смены.
Состояние описывается функцией state(). В качестве параметров ей передаются название состояния и набор CSS-стилей, задаваемых функцией style().
В представлении активация анимации контролируется специальным атрибутом (имя триггера с префиксом @, заключенное в квадратные скобки). В качестве значения атрибуту передается название одного из определенных для анимации состояний. Angular animation срабатывает, если описана пара состояний "было" => "стало"
Для указания всех состояний используйте *. Например, если анимация должна срабатывать при переходе с initial на любое другое состояние, то это указывается так:
1 | |
Анимирование смены всех состояний:
1 | |
Еще имеется особое состояние void. Оно используется для обозначения элементов, которых еще нет в представлении. Частое использование void — анимированное появление/исчезновение элемента совместно с *ngIf.
1 2 3 | |
1 2 3 4 5 6 7 8 9 | |
Определение переходов void => * и * => void имеют краткие альтернативные варианты записи:
1 2 3 4 5 6 7 8 | |
Задание стилей для * и void можно производить прямо в функции transition().
Также * может использоваться в функции style() для задания значения ширины или высоты, которая неизвестна до момента работы приложения. Это случается, если, например, размеры элемента зависят от размеров родительского элемента.
1 | |
Функция transition() является аналогом одноименного CSS-свойства и описывает при смене с какого на какое состояние должна срабатывать анимация. Первый параметр — строка с указанием изменяемых состояний, второй — параметры и (или) стили анимации, указываемые функциями animate() или style().
Если Angular анимация должна отрабатывать для двух состояний в обе стороны (например, с on на off и с off на on), можно использовать краткую запись:
1 | |
Функция animate() принимает строку с тремя параметрами:
- длительность анимации;
- время задержки перед стартом анимации;
- easing.
Первые два параметра указываются в миллисекундах.
Для определения Angular animation, которая в процессе смены состояний должна применять промежуточные стили, используется функция keyframes(), принимающая массив промежуточных стилей, определенных с помощью style().
1 2 3 4 5 6 7 8 | |
Параметр offset указывает, в рамках какого интервала анимации применяется промежуточный стиль.
В примере выше анимация длится 1.25 с, значение offset для второго набора стилей — 0.67. Значит, первый промежуточный стиль будет действовать 837,5 мс (1250мс * 0.67). Полная длительность анимации принимается за 1.
Для полного контроля Angular анимации у триггера предусмотрено два события start() и done(), которые срабатывают при старте и окончании анимации соответственно.
1 2 3 4 5 6 7 | |
1 2 3 | |
Функции, определенные для этих событий, в качестве аргумента получают объект типа AnimationEvent, который содержит следующие свойства:
fromState— исходное состояние;toState— состояние, на которое происходит смена;totalTime— длительность анимации.