Angular框架中可以给路由切换时添加动画效果,在切换路由导航时,Router会将URL映射到对应的组件,因此,在切换路由的时候可以添加动画效果。
1、路由代码部分:
首先要找到视图加载的路由文件,给对应的路由文件下的每个路由中添加一个data对象,data中使用animationName
属性,进行唯一的标识。
data属性中的animationName是任意的,可以根据需要设置不同的名称
const routes: Routes = [
{
path: '',
component:DefaultComponent,
children:[
{
path:'home',
component:HomeComponent,
data: {animationName: 'home'}
},
{
path:'report',
component:ReportComponent,
data: {animationName: 'report'}
},
{
path:'keywords',
component:KeywordsComponent,
data: {animationName: 'keywords'}
},
{
path:'alarm',
component:AlarmComponent,
data: {animationName: 'alarm'}
}
]
}
];
2、模板代码部分:
模板中使用的是router-outlet
视图占位符,在这一块,占位符的父级我们要加上一个[@routeAnimations]="animationRoute(outletInfo)"
,routeAnimations
是动画触发器的名称,animationRoute
是一个方法,需要单独在组件ts代码那边去定义函数体,方法animationRoute
在视图发生变化调用,这个方法给触发器返回当前激活的路由的data中的animationName
。
占位符中也需要添加上#outletInfo='outlet'
,使用outlet属性型指令,可以获得当前激活的路由及其状态的数据还有之前在路由中配置的data属性。
<div class="inner-content" [@routeAnimations]="animationRoute(outletInfo)">
<!-- 视图占位显示 -->
<router-outlet #outletInfo="outlet"></router-outlet>
</div>
animationRoute方法:
animationRoute(outlet: RouterOutlet) {
return outlet && outlet.activatedRouteData && outlet.activatedRouteData['animationName'];
}
3、动画部分处理:
首先创建一个公共的animations
文件夹,以便后期会进行动画复用。然后在这个文件夹下创建一个animation-route.ts
,代码:
import {animate, animateChild, group, query, style, transition, trigger} from '@angular/animations';
export const AnimationRoute =
trigger('routeAnimations', [
transition('* <=> *', [
style({position: 'relative'}),
query(':enter, :leave', [
style({
position: 'absolute',
left:0,
top:0,
width: '100%'
})
], {optional: true}),
query(':enter', [
style({left: '0'})
], {optional: true}),
query(':leave', animateChild(), {optional: true}),
group([
query(':leave', [
animate('300ms ease-in', style({left: '10%',opacity:0}))
], {optional: true}),
query(':enter', [
animate('300ms ease-in', style({left: 0,opacity:0}))
], {optional: true})
]),
query(':enter', animateChild(), {optional: true}),
])
]);
各方法的简要说明:
方法名 | 范围 |
---|---|
query() | 可以找出当前宿主组件中的动画元素。 |
query(":enter") | 返回已插入的视图 |
query(":leave") | 返回已移除的视图。 |
group() | 并行运行内部动画 |
animateChild() | 运行子动画 |
需要加上{optional: true},设置query()查询是可选的,否则在查询不到的情况下会报错
4、使用动画
修改ts代码中的元数据的属性
import { Component, OnInit } from '@angular/core';
import { RouterOutlet } from '@angular/router';
import { AnimationRoute } from 'src/animations/animation-route';
@Component({
selector: 'app-default',
templateUrl: './default.component.html',
styleUrls: ['./default.component.less'],
animations: [AnimationRoute]
})
网友评论