#angular #typescript #angular-animations
#угловая #typescript #angular-анимация
Вопрос:
У меня есть следующий HTML
<div @fadeInOut *ngIf="state">State is true</div>
<div @fadeInOut *ngIf="!state">State is false</div>
<button (click)="state = !state">Toggle</button>
И я хочу анимировать переход:leave и :enter. Я бы сказал, очень тривиально
Я могу сделать это со следующей анимацией
trigger("fadeInOut", [
transition(":enter", [
style({ opacity: 0 }),
animate(1000, style({ opacity: 1 }))
]),
transition(":leave", [animate(1000, style({ opacity: 0 }))])
])
Но проблема в том, что как только начинается переход, оба элемента становятся видимыми. Чего я хочу, так это чтобы сначала исчезло :leave, а затем появилось :enter. Каков правильный способ добиться этого?
Ответ №1:
Вы можете добиться этого, добавив задержку для :enter
анимации, равную длине :leave
анимации
trigger("fadeInOut", [
transition(":enter", [
style({ opacity: 0 }),
animate("1000ms 1000ms", style({ opacity: 1 }))
]),
transition(":leave", [animate(1000, style({ opacity: 0 }))])
])
Комментарии:
1. Это то, что я пробовал, кажется, что задержка не влияет на вставку вводимого элемента, а только при запуске анимации: stackblitz
2. Анимация работает так, как вы хотели. Ваша проблема состоит в том, чтобы показывать только один элемент одновременно. Это может быть достигнуто путем помещения divs в контейнер и скрытия переполнения.
3. Да, я понимаю, что вы имеете в виду. Если я присвою кнопке абсолютную позицию (она не будет прыгать вверх-вниз), но это не исправит ее полностью. Я бы ожидал, что можно было бы отложить вставку этого элемента:entering
4. Вы имели в виду что-то подобное: stackblitz ? Мне это не нравится, я надеялся, что angular сможет сделать это за меня
5. Проблема заключается в порядке расположения элементов. Я разобрался с этим, сделав позицию абсолютной, а фон прозрачным. Проверить stackblitz.com/edit/angular-ivy-p5dj2y . Лучше всего это будет работать в маршрутизаторе-розетке, так как выходящий элемент всегда будет первым, а входящий элемент всегда будет следующим.