我们知道在vue中可以通过transition标签给对应的元素设置动画,在Angular中是否也有对应的机制呢?答案是肯定的,Angular的动画系统是基于css构建的,也就是说我们可以给浏览器认为可动的任何属性设置动画;
介绍
动画被定义为从初始状态到最终状态的一种过渡,它是任何web应用程序不可或缺的一部分,动画的存在不仅是我们的web应用变得有趣,还能增强用户体验。
理解Angular中动画的状态
动画是元素从一种状态到另一种状态的过渡,Angular定义了一个元素的三种状态:
-
通配符状态:元素的默认状态,可以匹配任何一个动画状态,与他当前的动画状态无关,在代码中通常用 '*' 来表示;
-
void 状态:这个状态不属于dom元素的状态,当我们创建了一个元素但还没有放到dom树中或者元素从dom中删除时就会出现这种状态,在代码中用’void‘来表示;
-
自定义状态:使用state()函数来进行定义。这个函数接收两个参数:第一个参数是状态的名称;第二个参数是一个style()函数,用来定义状态的样式;
动画过渡
如果状态也状态之间没有过渡的话,那这些变化就会显得很突兀,Angular的animate ('duration delay easing')的动画函数为我们提供了三种动画的过渡属性:
- duration:持续时间
- delay:动画延迟
- easing:动画的过渡效果
创建Angular项目
在 stackblitz.com/ 中可以快速创建一个Angular项目,要使用Angular的动画,我们需要导入BrowserAnimationsModule模块:
app.modules.ts
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
@NgModule({
imports: [ BrowserModule, FormsModule,BrowserAnimationsModule ],
declarations: [ AppComponent, HelloComponent, AnimationDemoComponent ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
了解Angular动画的语法
动画所需要的函数要从@angular/animations模块中导入;
在组件的元数据 animations 中编写动画代码:
import {trigger,state,style,animate,transition,...} from '@angular/animations';
@Component({
animations: [
trigger('triggerName', [
state('stateName', style())
transition('stateChangeExpression', [animate()...])
])
]
})
这个属性接收一个数组,包含了一个或多个触发器,动画的状态和过渡都需要在触发器实现中定义;
每个状态函数state()都定义了一个唯一的状态名,并定义了一个样式函数来显示处于该状态元素的样式。
过渡函数transition()第一个参数定义状态变化的方向,例如:a=>b;第二个参数接受一个或一系列 animate() 函数。
元素中应用动画
<div [@triggerName]="stateName"></div>
下面就创建一个简单的动画以便更好的理解Angular的动画概念
大小改变动画
我们将通过点击一个按钮来实现div的动画。
在组件元数据中添加以下动画属性定义:
animation-demo.component.ts
animations: [
trigger('changeDivSize', [
state('initial', style({
backgroundColor: 'green',
width: '100px',
height: '100px'
})),
state('final', style({
backgroundColor: 'red',
width: '200px',
height: '200px'
})),
transition('initial=>final', animate('1500ms')),
transition('final=>initial', animate('1000ms'))
]),
]
在这里,我们定义了一个触发器changeDivSize和触发器内部的两个状态函数。元素在“初始”状态时为绿色,在“最终”状态时为红色,并增加宽度和高度,还定义了状态过渡所需要的时间。
我们通过一个函数来改变元素的状态:
currentState = 'initial';
changeState() {
this.currentState = this.currentState === 'initial' ? 'final' : 'initial';
}
在animation-demo.component.html中添加以下代码
<h3>改变大小</h3>
<button (click)="changeState()">click</button>
<br />
<div [@changeDivSize]="currentState"></div>
<br />
我们已经定义了一个按钮,它将在点击的时候调用changeState函数。我们在div上应用了changeDivSize触发器。当我们点击按钮时,它将改变div元素的状态,并且它的大小将随着过渡效果而改变。
上面我们主要探讨了动画状态和过渡的概念。具体效果可以访问 stackblitz.com/edit/angula…