We have two blocks to show to difference ways to do animation in Angular:
<button (click)="toggleState()">Toggle</button> <div style="display: flex; align-items: center; align-content: space-between;"> <section [@heightZeroFull] *ngIf="state === 'active'" style=" 200px; height: 200px; background: black;"> </section> <section [@heightState]="state" style=" 200px; height: 200px; background: blue;"></section> </div>
heightZeroFull using animation(). heightState using state().
The way to control the state is:
state = 'active'; toggleState() { if (this.state === 'inactive') { this.state = 'active'; } else { this.state = 'inactive'; } }
In the component, we define 'animations':
@Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'], animations: [ heightZeroFull({duration: '500ms'}), heightState({height: '200px', duration: '500ms'}) ] })
We pass in params, so it is more configurable.
Animation.ts:
import {animation, style, animate, trigger, transition, useAnimation, state} from '@angular/animations'; /* * DSL * */ const heightStart = animation([ style({ height: 0 }), animate( "{{duration}} ease-in", style({ height: '*' }) ) ]); const heightEnd = animation([ animate( "{{duration}} ease-out", style({ height: 0 }) ) ]); /* * Transition * */ // Using animation export const heightZeroFull = (params) => { return trigger('heightZeroFull', [ transition(':enter', useAnimation(heightStart, {params})), transition(':leave', useAnimation(heightEnd, {params})) ]); }; // Using state export const heightState = (params) => { return trigger('heightState', [ state('inactive', style({ height: 0 })), state('active', style({ height: params.height })), transition('inactive => active', animate(`${params.duration} ease-in`)), transition('active => inactive', animate(`${params.duration} ease-out`)) ]); };