Frontend
October 15, 2023

Анимации в Angular: создание плавных переходов

Анимации - это важная часть современных веб-приложений. Они делают интерфейс более живым и приятным для пользователя. Анимации помогают сгладить переходы между состояниями элементов, привлечь внимание к важным действиям, визуализировать процессы.

Angular отлично подходит для создания анимаций. У него есть встроенные инструменты для управления анимациями. Мы можем легко описать анимации в коде и указать, при каких событиях они должны проигрываться.

Основы анимаций в Angular

Чтобы начать использовать анимации в Angular, нужно подключить модуль BrowserAnimationsModule в корневом модуле приложения.

Дальше нам понадобятся три ключевых понятия:

  • Состояния - то, от чего зависит анимация. Например, элемент может быть в состоянии "показан" или "скрыт".
  • Триггеры - события, которые запускают анимацию. Это может быть клик по кнопке, загрузка данных, ошибка и т.д.
  • Переходы - сама анимация между состояниями. Здесь мы описываем эффекты анимации.

Теперь давайте посмотрим, как это работает на примерах.

Простые анимации

Начнем с простой анимации изменения цвета фона элемента.

Создадим в шаблоне блок:

htmlCopy code<div [@changeColor]="colorState"></div>

Здесь мы привязываем анимацию changeColor к переменной colorState.

Дальше в компоненте опишем анимацию:

tsCopy code@Component({
  // ...
  animations: [
    trigger('changeColor', [
      state('default', style({
        backgroundColor: 'white'  
      })),
      state('red', style({
        backgroundColor: 'red'
      })),
      transition('default => red', animate(500)) 
    ])
  ]
})
export class AppComponent {
  colorState = 'default';
  
  makeRed() {
    this.colorState = 'red'; 
  }
}

Здесь мы определили два состояния - белый и красный фон. При переходе из "default" в "red" будет анимация длительностью 500 мс.

Теперь при вызове makeRed() фон плавно станет красным за полсекунды.

Использование ключевых кадров

Чтобы сделать анимации более плавными, используют ключевые кадры (keyframes). Мы определяем промежуточные состояния анимации и Angular автоматически интерполирует их.

Например, реализуем анимацию перемещения блока:

tsCopy codetrigger('moveBlock', [
  transition('* => *', [ 
    animate(1000, keyframes([
      style({ transform: 'translateX(0)' }),
      style({ transform: 'translateX(100px)' }) 
    ]))
  ])
])

Здесь мы задали два ключевых кадра - в начале блок в точке 0, в конце - смещен на 100px. Angular автоматически рассчитает промежуточные состояния.

В результате блок будет плавно двигаться одну секунду от 0 до 100px.

Комплексные анимации

Для более сложных анимаций используют несколько состояний и переходов.

Например, реализуем анимацию открытия и закрытия блока:

tsCopy codetrigger('openClose', [

  state('open', style({
    height: '200px',
    opacity: 1,
  })),
  
  state('closed', style({
    height: '0px',
    opacity: 0
  })),

  transition('closed => open', [
    animate('0.3s ease-out', style({
      opacity: 1,
    })),
    animate('0.2s ease-out', style({
      height: '200px'
    }))
  ]),

  // переход обратно  
])

Здесь используем два состояния - открытый и закрытый блок. При открытии сначала меняем прозрачность, а потом высоту. И наоборот при закрытии.

Так мы реализуем плавную комплексную анимацию перехода между состояниями.

Интерактивные анимации

Анимации в Angular можно сделать интерактивными - запускать по действиям пользователя.

Например, добавим анимацию при наведении на кнопку:

htmlCopy code<button  
  [@hoverAnimation]="buttonState"
  (@hoverAnimation.start)="onHoverStart()"
  (@hoverAnimation.done)="onHoverEnd()">
  Hover over me
</button>

Компонент:

tsCopy code// ...

animations: [
  trigger('hoverAnimation', [
   // ... переходы и состояния 
  ])
]

onHoverStart() {
  this.buttonState = 'hovered'; 
}

onHoverEnd() {
  this.buttonState = 'default';
}

При наведении мы вызываем переход в состояние "hovered", а при снятии курсора - обратно в "default".

Таким образом анимации реагируют на действия пользователя.

Итог

Анимации делают интерфейс приложения живым и интересным. В Angular для них есть отличные встроенные инструменты.

Мы рассмотрели основы анимаций - состояния, триггеры и переходы. Посмотрели как создавать простые и комплексные анимации, использовать ключевые кадры. Также вы узнали, как сделать анимации интерактивными.

Теперь вы можете улучшить свои проекты, добавив в них плавные анимации! Практикуйтесь и изучайте возможности анимаций в Angular, чтобы делать действительно классные приложения!