Использование setTimeout
действительно плохо, потому что это приблизительно.
Angular может обеспечить анимацию, особенно для переходов маршрутизатора.
Вы можете добавить директиву к своему выходу маршрутизатора для запуска анимации Angular при изменении страницы.
Например, на вашем app.component. html:
<div [@routeAnimations]="prepareRoute(outlet)">
<router-outlet #outlet="outlet"></router-outlet>
</div>
app.component.ts
public prepareRoute(routerOutlet: RouterOutlet): string {
return routerOutlet && routerOutlet.activatedRouteData && routerOutlet.activatedRouteData[ 'animation' ];
}
В этом примере prepareRoute
будет использовать имя анимации непосредственно из пользовательских данных вашего маршрута, используя свойство animation
.
Таким образом, он позволяет использовать анимацию только на указанных c страницах.
Также необходимо зарегистрировать внутри компонента анимации.
@Component({
animations: [
PAGES_ANIMATION
],
Затем определите тип анимации между вашими маршрутами.
export const PAGES_ANIMATION = trigger('routeAnimations', [
transition(`home => register`, SLIDE_RIGHT_ANIMATION),
transition(`register => home`, SLIDE_LEFT_ANIMATION),
И, наконец, создайте Angular анимацию.
export const SLIDE_RIGHT_ANIMATION = [
style({
position: 'relative'
}),
query(':enter, :leave', [
style({
height: '100vh',
left: 0,
overflowY: 'hidden',
position: 'absolute',
top: 0,
width: '100%'
})
]),
query(':enter', [
style({
transform: 'translateX(100%)'
})
]),
query(':leave', animateChild()),
group([
query(':leave', [
animate('400ms ease-out', style({
transform: 'translateX(-100%)'
}))
]),
query(':enter', [
animate('400ms ease-out', style({
transform: 'translateX(0%)'
}))
])
]),
query(':enter', animateChild())
];
Если это правильный ответ для вас, но вы можете не делайте этого, попросите меня о помощи.
Вы также можете прочитать документацию , чтобы понять концепции и увидеть пример из реального мира.