使用Angular4动画为页面添彩
首先我们看一下效果展示的demo Basic Variation Stagger Final 样例为了介绍这个新的动画,我们将用一个只有home和about页面的简单应用来做演示。我们将要用内容向左飞出然后用下图所示的交错进入的效果实现一个很酷的路由页面切换
动画依赖安装独立引入Angular 4里的动画部分,这样可以使你的项目更轻便,如果你不想用动画的话只要直接拿掉就可以了 首先,我们把下列依赖独立引入你的项目: app.module.ts import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; @NgModule({ imports: [ BrowserModule,BrowserAnimationsModule,... ],declarations: [ App,bootstrap: [ App ] }) export class AppModule { }
正如我们所见,我们的例子将由顶部导航和主体内容部分组成。各个内容部分将共享同一个导航栏,我们使用 app.module.ts @Component({ selector: 'my-app',template: ` <nav> <a routerLink="/home" routerLinkActive="active">Home</a> <a routerLink="/about" routerLinkActive="active">About</a> </nav> <main> <router-outlet></router-outlet> </main> ` }) export class App { } 我们使用静态路由来创建不同的导航链接。然后我们用 <a href="#/home" class="active">Home</a> 添加路由转换让我们改变默认的路由变换设置。首先我们需要加上动画触发器属性
我们用
app.module.ts @Component({ selector: 'my-app',animations: [ routerTransition ],template: ` <main [@routerTransition]="getState(o)"> <router-outlet #o="outlet"></router-outlet> </main> ` }) export class App { getState(outlet) { return outlet.activatedRouteData.state; } } 设置路由在Angular里面,路由会去尝试匹配路由定义和当前的url,同一个生效的配置优先级由上到下 app.routing.ts const routes = [ { path: '',redirectTo: 'home',pathMatch: 'full' },{ path: 'home',component: Home,data: { state: 'home' } },{ path: 'about',component: About,data: { state: 'about' } },{ path: '**',component: NotFound } ]; export const AppRouting = RouterModule.forRoot(routes,{ useHash: true }); 路由设置告诉路由当匹配到Home和About页面的路径时去实例化对应的组件。注意这个 我们也需要设置两个为了通常展示的特殊路由。这个空路径的路由将提供一个默重定向到主页的路由以防导航去了一个非我们需要的路径。其他的路由或者未定义的路由展示一个用户友好的404页面就好 为了这个例子,因为Plunker的原因我们使用一个哈希定位的策略。如果我们需要后端我们可以沿用普通的路径跳转,但是如果没有后端来展示404错误的话我们就使用这个策略来重定向未知路径到index.html Angular 动画让我们隆重介绍Angular动画。Angular是基于最新的Web Animations API,我们使用动画触发器(animation triggers)来定义一系列状态和变换属性。我们也可以用CSS样式来改写实现我们想要的效果 主要的原则是开始和结尾的动画样式由我们自定义,中间变换的计算过程交给工具本身
当然,可以通过设置时间来设置中间动画,比如1s,1.2s,200ms。其他的就是大家熟悉的CSS动画的速度属性比如 而Angular 4.2以上的版本里我们可以用顺序(sequence)和组合(group)来让动画一个接一个执行还是同时执行;查询(query)可以操作子元素而交错(stagger)可以创造一个很棒的连锁效果 这些事件将触发一个动画:
在路由转换的前后关系中,要注意,组件正在被移除并作为导航的一部分被添加到视图中的过程。 定义动画首先让我们看一下如何使用Angular动画来让内容向左滑出
最初,定义我们的触发器 这是个通过两个独立转换
router.animations.ts import {trigger,animate,style,group,animateChild,query,stagger,transition} from '@angular/animations'; export const routerTransition = trigger('routerTransition',[ transition('* <=> *',[ /* order */ /* 1 */ query(':enter,:leave',style({ position: 'fixed',width:'100%' }),{ optional: true }),/* 2 */ group([ // block executes in parallel query(':enter',[ style({ transform: 'translateX(100%)' }),animate('0.5s ease-in-out',style({ transform: 'translateX(0%)' })) ],query(':leave',[ style({ transform: 'translateX(0%)' }),style({ transform: 'translateX(-100%)' } ],]) ]) ]) 我们在第二个参数里定义了一个顺序执行通用转换的数组 。第一个参数呢,使用了一个新的查询指令去选择新的路径组件和离开的组件;查询指令可以使用类似CSS伪类的选择器方式选中,比如一些特殊的关键词: 在第一次查询中, 接下来,我们将设置一个组合使得内部动画同时执行。 让我们想象一下,我们从Home切换到About页面,第一次查询将会匹配这个被加了
注意这种实现方式与我们将触发器绑定到我们想要动画的元素的动画中的用例不同。
加上交错动画一旦我们的基础部分完成了,我们可以很容易在这个基础上用查询和交错控制加上一些新的效果
export const routerTransition = trigger('routerTransition',...),/* 2 */ query('.block',style({ opacity: 0 })),/* 3 */ group([ // block executes in parallel query(':enter',[...]),]),/* 4 */ query(':enter .block',stagger(400,[ style({ transform: 'translateY(100px)' }),animate('1s ease-in-out',style({ transform: 'translateY(0px)',opacity: 1 })),])),]) ]) 最终,我们使用转换(transform)和透明(opacity)来垂直向上滑动进入并淡入。 最终步骤作为最终的润色,我添加了一些反向交错离开Home组件的代码并且也加入了贝塞尔曲线来优化路径,最后效果如下图
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |