Angular 8 - 动画

动画为 Web 应用程序提供了清爽的外观和丰富的用户交互。 在 HTML 中,动画基本上是 HTML 元素在特定时间段内从一种 CSS 样式转换为另一种 CSS 样式的过程。 例如,可以通过更改图像元素的宽度和高度来放大图像元素。

如果图像的宽度和高度在一段时间内(例如10秒)从初始值逐步改变到最终值,那么我们就得到了动画效果。 因此,动画的范围取决于 CSS 提供的用于设置 HTML 元素样式的功能/属性。

Angular 提供了一个单独的模块 BrowserAnimationModule 来执行动画。 BrowserAnimationModule 提供了一种简单明了的动画制作方法。

配置动画模块

本章让我们学习如何配置动画模块。

按照下面提到的步骤在应用程序中配置动画模块 BrowserAnimationModule

在AppModule中导入BrowserAnimationModule

import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; 
@NgModule({ 
   imports: [ 
      BrowserModule, 
      BrowserAnimationsModule 
   ], 
   declarations: [ ], 
   bootstrap: [ ] 
}) 
export class AppModule { }

在相关组件中导入动画功能。

import { state, style, transition, animate, trigger } from '@angular/animations'

在相关组件中添加animations元数据属性。

@Component({ 
   animations: [ 
      // animation functionality goes here 
   ] 
}) 
export class MyAnimationComponent

概念

在Angular中,我们要做动画需要了解五个核心概念及其关系。

State

State指的是组件的具体状态。 一个组件可以有多个定义的状态。 状态是使用 state() 方法创建的。 state() 方法有两个参数。

  • name − 唯一名称。

  • style − 使用 style() 方法定义的状态样式。

animations: [ 
   ... 
   state('start', style( { width: 200px; } )) 
   ... 
]

这里,start是状态的名称。

Style

Style是指在特定状态下应用的CSS样式。 style() 方法用于设置组件特定状态的样式。 它使用 CSS 属性并且可以有多个项目。

animations: [ 
   ... 
   state('start', style( { width: 200px; opacity: 1 } )) 
   ... 
]

这里,start状态定义了两个CSS属性,width值为200px,opacity值为1。

Transition

转换是指从一种状态到另一种状态的转换。 动画可以有多个过渡。 每个转换都是使用transition() 函数定义的。 transition() 有两个参数。

  • 指定两个过渡状态之间的方向。 例如,start => end 表示初始状态为start,最终状态为end。 实际上,这是一个功能丰富的表达式。

  • 使用 animate() 函数指定动画详细信息。

animations: [ 
   ... 
   transition('start => end', [ 
      animate('1s') 
   ])
   ... 
]

这里,transition()函数定义了从开始状态到结束状态的转换,动画在animate()方法中定义。

动画

动画定义了从一种状态到另一种状态的转换方式。 animation()函数用于设置动画细节。 animate() 采用以下表达式形式的单个参数 −

duration delay easing
  • duration − 指过渡的持续时间。 表示为1s、100ms等,

  • delay − 指开始转换的延迟时间。 它的表达方式类似于duration

  • easing − 指的是如何在给定的时间内加速/减速过渡。

触发器

每个动画都需要一个触发器来启动动画。 trigger() 方法用于将状态、样式、过渡和动画等所有动画信息设置在一个地方,并为其指定一个唯一的名称。 唯一的名称进一步用于触发动画。

animations: [ 
   trigger('enlarge', [ 
      state('start', style({ 
         height: '200px', 
      })), 
      state('end', style({ 
         height: '500px', 
      })), 
      transition('start => end', [ 
         animate('1s') 
      ]), 
      transition('end => start', [ 
         animate('0.5s') 
   ]) ]), 
]

这里,enlarge是为特定动画指定的唯一名称。 它有两种状态和相关样式。 它有两个过渡,一个是从开始到结束,另一个是从结束到开始。 结束到开始状态执行与动画相反的操作。

触发器可以附加到下面指定的元素 −

<div [@triggerName]="expression">...</div>;

例如,

<img [@enlarge]="isEnlarge ? 'end' : 'start'">...</img>;

这里,

  • @enlarge − 触发器设置为图像标签并被表达式吸引。

  • 如果islarge值更改为true,则end状态将被设置并触发start =>结束转换。

  • 如果isEnlarge值更改为false,则start状态将被设置并触发end => start transition

简单动画示例

让我们编写一个新的 Angular 应用程序,通过放大具有动画效果的图像来更好地理解动画概念。

打开命令提示符并创建新的角度应用程序。

cd /go/to/workspace 
ng new animation-app 
cd animation-app

AppModule(src/app/app.module.ts)中配置BrowserAnimationModule

import { BrowserModule } from '@angular/platform-browser'; 
import { NgModule } from '@angular/core' 
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; 
import { AppComponent } from './app.component'; @NgModule({ 
   declarations: [ 
      AppComponent 
   ], 
   imports: [ 
      BrowserModule, 
      BrowserAnimationsModule 
   ], 
   providers: [], 
   bootstrap: [AppComponent] 
}) 
export class AppModule { }

打开AppComponent(src/app/app.component.ts)并导入必要的动画函数。

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

添加动画功能,在图像放大/缩小过程中为图像添加动画效果。

@Component({
   selector: 'app-root',
   templateUrl: './app.component.html',
   styleUrls: ['./app.component.css'],
   animations: [
      trigger('enlarge', [
         state('start', style({
            height: '150px'
         })),
         state('end', style({
            height: '250px'
         })),
         transition('start => end', [
            animate('1s 2s')
         ]),
         transition('end => start', [
            animate('1s 2s')
         ])
      ])
   ]
})

打开AppComponent模板,src/app/app.component.html并删除示例代码。 然后,包括一个带有应用程序标题的标题、图像和一个放大/缩小图像的按钮。

<h1>{{ title }}</h1> 
<img src="assets/puppy.jpeg" style="height: 200px" /> <br /> 
<button>{{ this.buttonText }}</button>

编写一个函数来改变动画表达式。

export class AppComponent { 
   title = 'Animation Application'; 
   isEnlarge: boolean = false; 
   buttonText: string = "Enlarge"; 
   triggerAnimation() { 
      this.isEnlarge = !this.isEnlarge; 
      if(this.isEnlarge) 
         this.buttonText = "Shrink"; 
      else 
         this.buttonText = "Enlarge"; 
   } 
}

在图像标签中附加动画。 另外,附加按钮的单击事件。

<h1>{{ title }}</h1>
<img [@enlarge]="isEnlarge ? 'end' : 'start'" src="assets/puppy.jpeg" style="height: 200px" />
<br />
<button (click)='triggerAnimation()'>{{ this.buttonText }}</button>

完整的AppComponent代码如下 −

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

@Component({
   selector: 'app-root',
   templateUrl: './app.component.html',
   styleUrls: ['./app.component.css'],
   animations: [
      trigger('enlarge', [
         state('start', style({
            height: '150px'
         })),
         state('end', style({
            height: '250px'
         })),
         transition('start => end', [
            animate('1s 2s')
         ]),
         transition('end => start', [
            animate('1s 2s')
         ])
      ])
   ]
})
export class AppComponent {
   title = 'Animation Application';
   isEnlarge: boolean = false;
   buttonText: string = "Enlarge";


   triggerAnimation() {
      this.isEnlarge = !this.isEnlarge;

      if(this.isEnlarge) 
         this.buttonText = "Shrink";
      else
         this.buttonText = "Enlarge";
   }
}

完整的AppComponent模板代码如下−

<h1>{{ title }}</h1>
<img [@enlarge]="isEnlarge ? 'end' : 'start'" src="assets/puppy.jpeg" style="height: 200px" />
<br />
<button (click)='triggerAnimation()'>{{ this.buttonText }}</button>

使用以下命令运行应用程序 −

ng serve

单击放大按钮,将用动画放大图像。 结果如下所示 −

appcomponents

再次单击该按钮可将其缩小。 结果将如下图所示−

shrink