Bird
Raised Fist0
Angularframework~5 mins

Trigger and state definitions in Angular

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction

Triggers and states help manage changes and actions in your app smoothly. They make your app respond to user actions or data changes with animations or style changes.

When you want to animate a button when clicked.
When you want to show or hide a menu with a smooth transition.
When you want to change the style of an element based on user interaction.
When you want to animate a list item entering or leaving the screen.
When you want to create visual feedback for form input focus.
Syntax
Angular
trigger('triggerName', [
  state('stateName', style({ /* CSS styles */ })),
  transition('state1 => state2', [
    animate('duration easing', style({ /* CSS styles */ }))
  ])
])

trigger defines the animation with a name you use in your template.

state defines how the element looks in a certain state.

Examples
This example defines two states: 'open' and 'closed'. The element changes height and opacity with a smooth animation when toggling between states.
Angular
trigger('openClose', [
  state('open', style({ height: '200px', opacity: 1 })),
  state('closed', style({ height: '100px', opacity: 0.5 })),
  transition('open <=> closed', [animate('0.5s ease-in-out')])
])
This example animates an element fading in when it appears and fading out when it disappears.
Angular
trigger('fadeInOut', [
  state('in', style({ opacity: 1 })),
  transition(':enter', [
    style({ opacity: 0 }),
    animate('300ms ease-in')
  ]),
  transition(':leave', [
    animate('300ms ease-out', style({ opacity: 0 }))
  ])
])
Sample Program

This Angular component shows a button and a box. Clicking the button toggles the box between 'open' and 'closed' states. The box changes height and opacity smoothly using the defined trigger and states.

Angular
import { Component } from '@angular/core';
import { trigger, state, style, transition, animate } from '@angular/animations';

@Component({
  selector: 'app-toggle-box',
  template: `
    <button (click)="isOpen = !isOpen">Toggle</button>
    <div [@openClose]="isOpen ? 'open' : 'closed'" class="box">
      I change size and opacity!
    </div>
  `,
  styles: [
    `.box { width: 200px; background-color: lightblue; margin-top: 10px; overflow: hidden; }`
  ],
  animations: [
    trigger('openClose', [
      state('open', style({ height: '200px', opacity: 1 })),
      state('closed', style({ height: '100px', opacity: 0.5 })),
      transition('open <=> closed', [animate('0.5s ease-in-out')])
    ])
  ]
})
export class ToggleBoxComponent {
  isOpen = true;
}
OutputSuccess
Important Notes

Use simple CSS styles inside style() to define how states look.

Transitions define how to animate between states, including timing and easing.

Use the trigger name in your template with [@triggerName] to connect animations.

Summary

Triggers group states and transitions for animations.

States define how elements look in different conditions.

Transitions animate changes between states smoothly.

Practice

(1/5)
1. What is the main purpose of a trigger in Angular animations?
easy
A. To group states and transitions for an animation
B. To define the style of an element
C. To start an HTTP request
D. To create a new component

Solution

  1. Step 1: Understand the role of triggers

    Triggers in Angular animations group together states and transitions to control animations.
  2. Step 2: Compare with other options

    Defining styles is done by states, not triggers. HTTP requests and components are unrelated.
  3. Final Answer:

    To group states and transitions for an animation -> Option A
  4. Quick Check:

    Trigger = group states and transitions [OK]
Hint: Triggers group states and transitions, not styles or requests [OK]
Common Mistakes:
  • Confusing triggers with states
  • Thinking triggers start HTTP requests
  • Mixing triggers with component creation
2. Which of the following is the correct syntax to define a state named open with a background color of red in Angular animations?
easy
A. state('open', style({ backgroundColor: 'red' }))
B. state(open, style({ backgroundColor: 'red' }))
C. state('open', { backgroundColor: 'red' })
D. state('open', style('backgroundColor: red'))

Solution

  1. Step 1: Recall correct state syntax

    The correct syntax uses state('name', style({...})) with quotes around the name and style as a function.
  2. Step 2: Check each option

    state('open', style({ backgroundColor: 'red' })) matches the correct syntax. state(open, style({ backgroundColor: 'red' })) misses quotes around 'open'. state('open', { backgroundColor: 'red' }) misses style() function. state('open', style('backgroundColor: red')) incorrectly passes style as a string.
  3. Final Answer:

    state('open', style({ backgroundColor: 'red' })) -> Option A
  4. Quick Check:

    State syntax = state('name', style({...})) [OK]
Hint: Use quotes for state name and style() function for styles [OK]
Common Mistakes:
  • Omitting quotes around state name
  • Passing style as plain object without style()
  • Using string instead of object for styles
3. Given the following Angular animation trigger:
trigger('openClose', [
  state('open', style({ height: '200px', opacity: 1 })),
  state('closed', style({ height: '100px', opacity: 0.5 })),
  transition('open => closed', animate('1s')),
  transition('closed => open', animate('0.5s'))
])

What will be the animation duration when transitioning from closed to open?
medium
A. No animation
B. 1 second
C. 0.5 seconds
D. 2 seconds

Solution

  1. Step 1: Identify the transition direction

    The transition from 'closed' to 'open' is defined as transition('closed => open', animate('0.5s')).
  2. Step 2: Read the animation duration

    The animate function specifies 0.5 seconds duration for this transition.
  3. Final Answer:

    0.5 seconds -> Option C
  4. Quick Check:

    closed to open = 0.5s animation [OK]
Hint: Check transition direction and matching animate duration [OK]
Common Mistakes:
  • Mixing up open=>closed and closed=>open durations
  • Assuming default duration if not specified
  • Ignoring transition direction syntax
4. Identify the error in this Angular animation trigger definition:
trigger('fade', [
  state('visible', style({ opacity: 1 })),
  state('hidden', style({ opacity: 0 })),
  transition('visible <=> hidden', animate('500ms')),
  transition('hidden => visible', animate('fast'))
])
medium
A. style() function is missing in states
B. Missing quotes around state names
C. Transitions cannot use '<=>' syntax
D. The 'fast' duration is invalid in animate()

Solution

  1. Step 1: Check animate() duration values

    Angular animate() requires duration in time units like '500ms' or '1s'. 'fast' is not valid.
  2. Step 2: Verify other parts

    State names have quotes, transitions use valid '<=>' syntax, and style() is used correctly.
  3. Final Answer:

    The 'fast' duration is invalid in animate() -> Option D
  4. Quick Check:

    animate() needs valid time units, not 'fast' [OK]
Hint: Use time units like 'ms' or 's' in animate() durations [OK]
Common Mistakes:
  • Using words like 'fast' instead of time units
  • Forgetting quotes around state names
  • Misusing transition syntax
5. You want to create an Angular animation trigger named slideToggle that has two states: expanded with height '300px' and collapsed with height '0px'. The transition from collapsed to expanded should animate over 700ms, and the reverse over 300ms. Which of the following is the correct trigger definition?
hard
A. trigger('slideToggle', [state('expanded', style({ height: '300px' })), state('collapsed', style({ height: '0px' })), transition('collapsed <=> expanded', animate('700ms'))])
B. trigger('slideToggle', [state('expanded', style({ height: '300px' })), state('collapsed', style({ height: '0px' })), transition('collapsed => expanded', animate('700ms')), transition('expanded => collapsed', animate('300ms'))])
C. trigger('slideToggle', [state('expanded', style({ height: '0px' })), state('collapsed', style({ height: '300px' })), transition('collapsed => expanded', animate('700ms')), transition('expanded => collapsed', animate('300ms'))])
D. trigger('slideToggle', [state('expanded', style({ height: '300px' })), state('collapsed', style({ height: '0px' })), transition('expanded => collapsed', animate('700ms')), transition('collapsed => expanded', animate('300ms'))])

Solution

  1. Step 1: Verify state definitions

    States 'expanded' and 'collapsed' must have heights '300px' and '0px' respectively. trigger('slideToggle', [state('expanded', style({ height: '300px' })), state('collapsed', style({ height: '0px' })), transition('collapsed => expanded', animate('700ms')), transition('expanded => collapsed', animate('300ms'))]) matches this correctly.
  2. Step 2: Check transition directions and durations

    Transition from 'collapsed' to 'expanded' is 700ms, and reverse is 300ms. trigger('slideToggle', [state('expanded', style({ height: '300px' })), state('collapsed', style({ height: '0px' })), transition('collapsed => expanded', animate('700ms')), transition('expanded => collapsed', animate('300ms'))]) matches these durations and directions.
  3. Final Answer:

    Correct trigger with proper states and transitions -> Option B
  4. Quick Check:

    States and transitions match requirements [OK]
Hint: Match state styles and transition durations carefully [OK]
Common Mistakes:
  • Swapping state styles for expanded and collapsed
  • Reversing transition durations
  • Using single transition for both directions with wrong duration