最近在学习Angular2作为前端的框架,《Angular2使用笔记》系列用于记录过程中的一些使用和解决方法。
本文简单介绍angular2的动画效果,以及记录制作首页的过程。
angular2动画
关于Angular2动画
- 使用动画使得用户界面能在不同的状态之间更平滑的转场
- Angular2的动画系统赋予了制作各种动画效果的能力,以构建出与原生CSS动画性能相同的动画
- Angular2动画是基于标准的Web动画API(Web Animations API)构建的,它们在支持此API的浏览器中会用原生方式工作。至于其它浏览器,就需要一个填充库(polyfill)
状态与转场
Angular2动画是由状态和状态之间的转场效果所定义的。
- 状态
- 动画状态是一个由程序代码中定义的字符串值
- 状态的来源可以是简单的对象属性,也可以是由方法计算出来的值。能从组件模板中读取它
- state具体定义了每个状态的最终样式
- 一旦元素转场到那个状态,样式就会被应用到此元素上
- 当留在此状态时,样式也会一直保持着
 
 
- 转场
- 转场控制一条在一组样式和下一组样式之间切换的时间线
- 如果多个转场都有同样的时间线配置,就可以把它们合并进同一个transition定义中
- 对同一个转场的两个方向都使用相同的时间线,可以使用<=>简写语法
- *(通配符)状态:匹配任何动画状态,可用于定义那些不需要管当前处于什么状态的样式及转场
- void状态:表示元素没有被附加到视图,在定义“进场”和“离场”的动画时非常有用
 
可动的(Animatable)属性与单位
- 可以参与动画的属性 - 
- 位置(position)
- 大小(size)
- 变换(transform)
- 颜色(color)
- 边框(border)
 尺寸类属性(如位置、大小、边框等)包括一个数字值和一个用来定义长度单位的后缀。
 
- 动画时间线 - 
- 持续时间(duration):控制动画从开始到结束要花多长时间
- 延迟(delay):控制在动画已经触发但尚未真正开始转场之前要等待多久
- 缓动(easing)函数:用于控制动画在运行期间如何加速和减速
 
- 基于关键帧(Keyframes)的多阶段动画 - 
- 每个关键帧都可以被指定一个偏移量,用来定义该关键帧将被用在动画期间的哪个时间点
- 偏移量是一个介于0(表示动画起点)和1(表示动画终点)之间的数组
 
- 并行动画组(Group) 
制作index页面
页面结构如下:

添加index组件相关文件
- 添加index文件夹,用于管理Index组件的相关文件
 Index组件文件如下:| 1 2 3 4 5
 | index/  ├──index.ts                   * 导出该目录下组件  ├──index.component.ts         * 定义并导出Index组件  ├──index.style.css            * Index组件的css样式  └──index.template.html        * Index组件的html模板
 |  
 
定义Index组件
这里使用了前面章节创建的头部组件。前面我们将该组件放在主页面组件app.component.js中,这里我们将其移动到index页面组件中。
在index.component.js中:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
 | import { Component, trigger, state, style, transition, animate } from '@angular/core'; import { Header } from '../header'; @Component({   selector: 'index',    styleUrls: ['./index.style.css'],    templateUrl: './index.template.html',    directives: [Header],    animations: [          trigger('menuState', [        state('false', style({          height: '0px',         padding: '0px',         opacity: '0'       })),              transition('* => *', animate('100ms ease-in'))     ])   ] }) export class Index {      loading: string = 'init';   asidemenus: Array<any>;      changeState (view) {     this.loading = view;   }      toggleContent (index) {     this.asidemenus[index].show = !this.asidemenus[index].show;     this.changeState(this.asidemenus[index].click);   }   ngOnInit () {          this.asidemenus = [{         title: '基本资料',          click: 'init',          show: true,          menus: [{           text: '名字',            state: 'active',            click: 'name'          }, {           text: '邮箱',           state: 'active',           click: 'email'         }, {           text: 'github',           state: 'active',           click: 'github'         }]       }, {         title: '设置头像',         click: 'sethead',         show: true       }, {         title: '修改资料',         click: 'setinfo',         show: true       }, {         title: '其他',         click: 'other',         show: true       }];   } }
 | 
- 添加组件样式index.style.css,这里就不展示出来了
- index文件夹下index.ts中输出组件| 1
 | export * from './index.component';
 |  
 
添加组件模板
index.template.html文件,如下
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
 | <my-header></my-header> <div class="container-fluid row">     <aside class="col-md-2  col-md-offset-1" id="according">         <div class="panel-group" class="according" role="tablist" aria-multiselectable="true">                              *ng-for 中的*是Angular2中template语法的缩写,如果是全部的话,应该为                 <div ng-for #menu="$implicit" [ng-for-of]="asidemenus" #i="index"></div>             -->             <div class="panel panel-default list-group" *ngFor="#menu of asidemenus; #i = index">                 <div class="panel-heading" role="tab">                     <ul class="panel-title ">                         <li data-toggle="collapse" (click)="toggleContent(i)">                             {{ menu.title }}                         </li>                     </ul>                 </div>                 <div class="panel-collapse">                     <ul class="list-group">                                                  <li *ngFor="#item of menu.menus; #j = index;" @menuState="menu.show" class="list-group-item" role="button" (click)="changeState(item.click)">{{ item.text }}</li>                     </ul>                 </div>             </div>         </div>     </aside>     <article class="col-md-7">         <section class="index-content">             <p [hidden]="!(loading === 'init' || loading === 'name')">昵称:被删</p>             <p [hidden]="!(loading === 'init' || loading === 'email')">邮箱:wangbeishan@163.com</p>             <p [hidden]="!(loading === 'init' || loading === 'github')">github: <a href="https://github.com/godbasin">github.com/godbasin</a></p>             <div [hidden]="!(loading === 'sethead')">这里是设置头像页面</div>             <div [hidden]="!(loading === 'setinfo')">这里是修改资料页面</div>             <div [hidden]="!(loading === 'other')">这里是其他页面</div>         </section>     </article> </div>
 | 
添加Index路由
我们在app.routes.ts中添加index页面的路由。
添加样式
样式包括一些组件的样式,还有过渡css样式,这里就不列出来了。
结束语
不得不说,angular2中的动画效果跟Vue过渡也是很相像的呢。这些贴心的设定,很多时候都能帮我们减轻不少的负担呢。
此处查看项目代码(仅包含src部分)
此处查看页面效果
  
		
		
			查看Github有更多内容噢:https://github.com/godbasin
			
			更欢迎来被删的前端游乐场边撸猫边学前端噢