Angular2使用笔记5--动画和制作index页面
更新日期:
最近在学习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
5index/
├──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
73import { Component, trigger, state, style, transition, animate } from '@angular/core';
// 添加Header组件,默认从header文件夹的index.ts中获取
import { Header } from '../header';
({
selector: 'index', // 设置模板元素
styleUrls: ['./index.style.css'], // 样式文件引入
templateUrl: './index.template.html', // 模板文件引入
directives: [Header], // 注入指令
animations: [
// 设置动画,@menuState属性动画效果
trigger('menuState', [
state('false', style({ // menu.show为false时状态
height: '0px',
padding: '0px',
opacity: '0'
})),
// 转场的动画效果
transition('* => *', animate('100ms ease-in'))
])
]
})
export class Index {
// 定义并初始化菜单显示状态
loading: string = 'init';
asidemenus: Array<any>;
// 更新loading
changeState (view) {
this.loading = view;
}
// 显示隐藏子菜单效果并更新loading
toggleContent (index) {
this.asidemenus[index].show = !this.asidemenus[index].show;
this.changeState(this.asidemenus[index].click);
}
ngOnInit () {
// 设定menu的初始值
this.asidemenus = [{
title: '基本资料', // title用于储存该菜单显示名称
click: 'init', // click用于储存该菜单对应点击时loading的状态值
show: true, // show用于保存菜单是否隐藏的状态
menus: [{
text: '名字', // title用于储存该菜单显示名称
state: 'active', // state用于储存该菜单状态
click: 'name' // click用于储存该菜单对应点击时loading的状态值
}, {
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">
<!--@menuState属性动画效果-->
<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页面的路由。
- 引入Index组件
这里因为该文件夹下也有一个index.ts的文件,所以直接使用”./index”路径的话会有问题,所以我们写到具体的路径。1
2// 当然最好大家不要使用这种易冲突的名字
import { Index } from './index/index'; - 添加路由
1
2
3
4
5export const routes: RouterConfig = [
{ path: 'login', component: Login },
{ path: 'index', component: Index },
{ path: '**', component: Login }
];
添加样式
样式包括一些组件的样式,还有过渡css样式,这里就不列出来了。
结束语
不得不说,angular2中的动画效果跟Vue过渡也是很相像的呢。这些贴心的设定,很多时候都能帮我们减轻不少的负担呢。
此处查看项目代码(仅包含src部分)
此处查看页面效果
码生艰难,写文不易,给我家猪囤点猫粮了喵~
查看Github有更多内容噢:https://github.com/godbasin
更欢迎来被删的前端游乐场边撸猫边学前端噢
如果你想要关注日常生活中的我,欢迎关注“牧羊的猪”公众号噢