src/app/app.module.ts
import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterModule } from '@angular/router'; import { AppComponent } from './app.component'; import { OpenCloseComponent } from './open-close.component'; import { OpenClosePageComponent } from './open-close-page.component'; import { OpenCloseChildComponent } from './open-close.component.4'; import { ToggleAnimationsPageComponent } from './toggle-animations-page.component'; import { StatusSliderComponent } from './status-slider.component'; import { StatusSliderPageComponent } from './status-slider-page.component'; import { HeroListPageComponent } from './hero-list-page.component'; import { HeroListGroupPageComponent } from './hero-list-group-page.component'; import { HeroListGroupsComponent } from './hero-list-groups.component'; import { HeroListEnterLeavePageComponent } from './hero-list-enter-leave-page.component'; import { HeroListEnterLeaveComponent } from './hero-list-enter-leave.component'; import { HeroListAutoCalcPageComponent } from './hero-list-auto-page.component'; import { HeroListAutoComponent } from './hero-list-auto.component'; import { HomeComponent } from './home.component'; import { AboutComponent } from './about.component'; import { InsertRemoveComponent } from './insert-remove.component'; @NgModule({ imports: [ BrowserModule, BrowserAnimationsModule, RouterModule.forRoot([ { path: '', pathMatch: 'full', redirectTo: '/enter-leave' }, { path: 'open-close', component: OpenClosePageComponent }, { path: 'status', component: StatusSliderPageComponent }, { path: 'toggle', component: ToggleAnimationsPageComponent }, { path: 'heroes', component: HeroListPageComponent, data: {animation: 'FilterPage'} }, { path: 'hero-groups', component: HeroListGroupPageComponent }, { path: 'enter-leave', component: HeroListEnterLeavePageComponent }, { path: 'auto', component: HeroListAutoCalcPageComponent }, { path: 'home', component: HomeComponent, data: {animation: 'HomePage'} }, { path: 'about', component: AboutComponent, data: {animation: 'AboutPage'} }, ]) ],
src/app/app.component.html
<div [@routeAnimations]="prepareRoute(outlet)" > <router-outlet #outlet="outlet"></router-outlet> </div>
src/app/app.component.ts
prepareRoute(outlet: RouterOutlet) { return outlet && outlet.activatedRouteData && outlet.activatedRouteData['animation']; }
src/app/animations.ts
export const slideInAnimation = trigger('routeAnimations', [ transition('HomePage <=> AboutPage', [ style({ position: 'relative' }), query(':enter, :leave', [ style({ position: 'absolute', top: 0, left: 0, width: '100%' }) ]), query(':enter', [ style({ left: '-100%'}) ]), query(':leave', animateChild()), group([ query(':leave', [ animate('300ms ease-out', style({ left: '100%'})) ]), query(':enter', [ animate('300ms ease-out', style({ left: '0%'})) ]) ]), query(':enter', animateChild()), ]), transition('* <=> FilterPage', [ style({ position: 'relative' }), query(':enter, :leave', [ style({ position: 'absolute', top: 0, left: 0, width: '100%' }) ]), query(':enter', [ style({ left: '-100%'}) ]), query(':leave', animateChild()), group([ query(':leave', [ animate('200ms ease-out', style({ left: '100%'})) ]), query(':enter', [ animate('300ms ease-out', style({ left: '0%'})) ]) ]), query(':enter', animateChild()), ]) ]);
src/app/app.component.ts
@Component({ selector: 'app-root', templateUrl: 'app.component.html', styleUrls: ['app.component.css'], animations: [ slideInAnimation // animation triggers go here ] })
fade animation
export const fadeAnimation2 = trigger('routeAnimations', [ transition('* <=> *', [ style({ opacity: 0 }), query(':enter, :leave', [ style({ opacity: 0 }), ], {optional: true}), // Animate the new page in query(':enter', [ animate('200ms ease-in', style({ opacity: 1 })), ], {optional: true}) ]), ]);
References
https://angular.io/guide/route-animations
https://fireship.io/lessons/angular-router-animations/