Интеграция Lottie Web в Angular
Для работы с анимациями Lottie в Angular используется библиотека
lottie-web, а также один из удобных Angular-обёрток, чаще
всего ngx-lottie. Базовая установка выполняется через
npm:
npm install lottie-web
npm install ngx-lottie
Анимации Lottie представляют собой JSON-файлы, экспортируемые из Adobe After Effects через Bodymovin-плагин. Эти файлы становятся основой для дальнейшего рендеринга.
После установки необходимо подключить модуль в Angular-приложении.
В классическом модульном подходе Angular используется следующий импорт:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { LottieModule } from 'ngx-lottie';
import player from 'lottie-web';
export function playerFactory() {
return player;
}
@NgModule({
declarations: [],
imports: [
BrowserModule,
LottieModule.forRoot({ player: playerFactory })
],
bootstrap: []
})
export class AppModule {}
Функция playerFactory необходима для передачи экземпляра
lottie-web в обёртку Angular.
После подключения модуля появляется возможность использовать
компонент ng-lottie:
<ng-lottie
[options]="options"
[width]="300"
[height]="300">
</ng-lottie>
В компоненте Angular задаются параметры анимации:
import { Component } from '@angular/core';
import { AnimationOptions } from 'ngx-lottie';
@Component({
selector: 'app-root',
templateUrl: './app.component.html'
})
export class AppComponent {
options: AnimationOptions = {
path: '/assets/animations/loading.json',
autoplay: true,
loop: true
};
}
Параметр path указывает путь к JSON-файлу анимации,
который обычно размещается в папке assets.
Lottie предоставляет программный доступ к управлению проигрыванием. В
Angular это реализуется через событие animationCreated:
<ng-lottie
[options]="options"
(animationCreated)="onAnimationCreated($event)">
</ng-lottie>
import { AnimationItem } from 'lottie-web';
export class AppComponent {
private animationItem!: AnimationItem;
onAnimationCreated(animationItem: AnimationItem): void {
this.animationItem = animationItem;
}
play(): void {
this.animationItem.play();
}
pause(): void {
this.animationItem.pause();
}
stop(): void {
this.animationItem.stop();
}
}
Такой подход позволяет полностью контролировать жизненный цикл анимации.
Помимо загрузки по пути, можно использовать JSON напрямую:
import animationData from '../assets/animations/loading.json';
options: AnimationOptions = {
animationData,
autoplay: true,
loop: true
};
Этот вариант полезен при сборке через bundler, когда требуется минимизировать количество HTTP-запросов.
В некоторых проектах предпочтительно использовать чистый
lottie-web без обёрток Angular.
Создание контейнера:
<div #lottieContainer></div>
И инициализация в компоненте:
import { AfterViewInit, ElementRef, ViewChild } from '@angular/core';
import lottie, { AnimationItem } from 'lottie-web';
export class AppComponent implements AfterViewInit {
@ViewChild('lottieContainer', { static: true })
container!: ElementRef;
animation!: AnimationItem;
ngAfterViewInit(): void {
this.animation = lottie.loadAnimation({
container: this.container.nativeElement,
renderer: 'svg',
loop: true,
autoplay: true,
path: 'assets/animations/loading.json'
});
}
}
Этот способ даёт полный контроль над конфигурацией и исключает зависимость от сторонних Angular-обёрток.
Lottie поддерживает несколько типов рендеринга:
svg — основной и наиболее качественный вариантcanvas — подходит для тяжёлых анимацийhtml — используется реже, для специфичных случаевПример:
renderer: 'canvas'
SVG остаётся стандартом благодаря масштабируемости и качеству отображения.
Важно корректно управлять ресурсами, особенно при переходе между компонентами.
Очистка анимации:
ngOnDestroy(): void {
if (this.animation) {
this.animation.destroy();
}
}
Это предотвращает утечки памяти и лишнюю нагрузку на DOM.
Lottie позволяет управлять скоростью воспроизведения:
this.animation.setSpeed(2);
Также доступны методы:
goToAndPlay(frame, isFrame)goToAndStop(frame, isFrame)setDirection(direction)setSubframe(useSubFrames)Эти методы позволяют создавать интерактивные сценарии анимаций.
Для масштабных Angular-приложений логично выносить работу с Lottie в сервис.
import { Injectable } from '@angular/core';
import { AnimationItem } from 'lottie-web';
@Injectable({ providedIn: 'root' })
export class LottieService {
private animation?: AnimationItem;
register(animation: AnimationItem) {
this.animation = animation;
}
play() {
this.animation?.play();
}
pause() {
this.animation?.pause();
}
}
Использование сервиса позволяет централизовать управление анимациями.
При большом количестве JSON-анимаций целесообразно загружать их по требованию.
loadAnimation(): AnimationOptions {
return {
path: '/assets/animations/heavy.json',
autoplay: true,
loop: true
};
}
Это уменьшает начальный размер bundle и ускоряет загрузку приложения.
При использовании Angular Universal необходимо учитывать отсутствие
window и DOM.
Lottie должен инициализироваться только на клиенте:
import { isPlatformBrowser } from '@angular/common';
import { Inject, PLATFORM_ID } from '@angular/core';
constructor(@Inject(PLATFORM_ID) private platformId: Object) {}
ngAfterViewInit(): void {
if (isPlatformBrowser(this.platformId)) {
this.initAnimation();
}
}
Это предотвращает ошибки при серверном рендеринге.
При работе с большим количеством анимаций важно учитывать:
svg только при необходимостиautoplay для невидимых элементовТакже полезно контролировать FPS и сложность анимации на этапе экспорта из After Effects.
Lottie позволяет подменять анимации без пересоздания DOM:
this.animation.destroy();
this.animation = lottie.loadAnimation({
container: this.container.nativeElement,
renderer: 'svg',
loop: true,
autoplay: true,
path: 'assets/animations/next.json'
});
Такой подход используется в интерфейсах с состояниями (loading, success, error).
Lottie поддерживает события жизненного цикла:
this.animation.addEventListener('complete', () => {
console.log('Animation completed');
});
Основные события:
completeloopCompleteenterFramesegmentStartЭти события позволяют связывать анимацию с логикой интерфейса.
Сегменты позволяют воспроизводить части анимации:
this.animation.playSegments([0, 50], true);
Это удобно для интерфейсов с пошаговыми состояниями или микроинтеракциями.