refer :

https://angular.io/guide/animations

https://github.com/angular/angular/blob/master/packages/animations/src/animation_metadata.ts

https://github.com/angular/angular/commit/f1a9e3c (router)

angular 的动画建立在一堆的方法上:

1. trigger
触发器, 用来和 dom 交互 <div [@triggerName]="state" ></div>
trigger 负责定义各种 state 和它们之间变化来变化去 transition

  1. trigger('triggerA', [
  2. state('A', style...),
  3. state('B', style...),
  4. transition('A => B', animate...),
  5. transition('B => A', animate...)
  6. ])

2. State
angular 的概念是通过改变状态(state)来触发(trigger)动画(animate)
每个状态都定义了最终的样式

  1. state('A', style...)

3. transition
负责定义各种 state 之间错综复杂的转换关系

  1. transition('A => B', animate...)
  2. transition('A <=> B', animate...)
  3. transition('* => *', animate...) * is whatever
  4. transition(':enter', animate...)
  5. transition(':leave', animate...)
  6. transition('* => void', animate...) void表示无, whatever to null 也等于 :leave
  7. transition((fromState, toState) => boolean, animate...) 还可以写方法判断哦
  8. transition('A => B',[style,animate]) style 也可以放进来哦.
  9. transition('A => B',[animate,animate]) 数组 animate 会按序执行和 transition('A => B', sequence([animate,animate])) 是一样的
  10. transition('A => B',group(animate,animate)) 不想按序执行可以使用 group

到这里可以看出一个基本的流程
[@triggerName]="state" 监听了 state 的变化
一但变化发生触发器就查找匹配的 transition 然后执行 animate. 就这样简单

4. Style
就是定义 css 啦

  1. style({ display : 'none' })

5. animate
具体的动画定义

  1. animate("5s 10ms cubic-bezier(.17,.67,.88,.1)", style(...))

duration= 5second
delay=10ms
easing= cubic-bezier (ease-out 等等 css 有的都可以放)
最后加上 style 就可以动画了咯

  1. animate("5s", keyframes([
  2. style({opacity: 0, offset: 0}),
  3. style({opacity: 1, offset: 0.3})
  4. ]))

如果你想完全掌握节奏可以使用 keyframes + offset 做定义, offset 0.3 是百分比

6.group
就是把多个 animate 组合起来并发执行.

  1. group(animate,animate)

7.keyframes
上面说了

8.sequence
按顺序一个接一个执行, 和 group 刚好打对台, 一个 step by step, 另一个是并发

  1. sequence(animate,animate)

9.useAnimation

animate是可以封装的. 使用 animation 方法

  1. let fadeAnimation = animation([
  2. style({ opacity: '{{ start }}' }),
  3. animate('{{ time }}',
  4. style({ opacity: '{{ end }}'))
  5. ], { params: { time: '1000ms', start: 0, end: 1 }});

然后在任何想使用 animate 的地方改用 useAnimation

  1. useAnimation(fadeAnimation, {
  2. params: {
  3. time: '2s',
  4. start: 1,
  5. end: 0
  6. }
  7. })

10.query
任何你想使用 animate 的地方都可以使用 query
animate 会施法在当前的 element 上, 而通过 query 你可以施法在 element 的 child 上
query 支持 css 选择器的语法,还有一些 angular 特别的定义语法.

  1. query('css-selector',[animate...])

- Querying for newly inserted/removed elements using `query(":enter")`/`query(":leave")`

这里有个神技

  1. <div [@listAnimation]="items.length">
  2. <div *ngFor="let item of items">
  3. {{ item }}
  4. </div>
  5. </div>

通过 items.length 配上下面的 transition * => * + query child 就可以实现 items 在插入和移除时的动画了.

  1. transition('* => *', [
  2. query(':leave', [
  3. stagger(100, [
  4. animate..
  5. ])
  6. ]),
  7. query(':enter', [
  8. stagger(100, [
  9. animate..
  10. ])
  11. ])
  12. ])

- Querying all currently animating elements using `query(":animating")`
- Querying elements that contain an animation trigger using `query("@triggerName")`
- Querying all elements that contain an animation triggers using `query("@*")`
- Including the current element into the animation sequence using `query(":self")`

11.stagger
stagger 是配合 query 来使用的, 它的作用是当 query select 出很多 element 时,你希望它们不要并发, 而是隔着一个间隔时间.

  1. query('css-selector',[stagger(100,[animate])])

比如 select 出 2 个 element, 一个触发动画先,另一个则会等间隔 100ms 后才触发.

12.animateChild
animateChild 是一个 manual trigger 概念

  1. <div [@parentAnimation]="exp">
  2. <div [@childAnimation]="exp">
  3. one
  4. </div>
  5. </div>

angular 说, 当 parent trigger 触发后,child trigger by default 是不会被触发的 (不过我试了会 /.\)
而我们可以在 parent trigger 中通过 query('@child',[animateChild()]) 来手动触发 child trigger.
这个在做 router animate 时会用到哦.

router animation 实现 https://github.com/angular/angular/commit/f1a9e3c

其实也是依据上面这些方法来做的. 主要用了 parent, child, query, enter, leave, animateChild 这些概念.

angular2 学习笔记 ( animation 动画 )的更多相关文章

  1. Android学习笔记_39_tween动画的实现(Animation和Frame)

    一.Animation动画的实现及特点: 1.Tween动画,通过对 View 的内容进行一系列的图形变换 (包括平移.缩放.旋转.改变透明度)来实现动画效果.   动画效果的定义可以采用XML来做也 ...

  2. iOS学习笔记10-UIView动画

    上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...

  3. HTML学习笔记 cs动画基础(分列效果可用于做瀑布流) 第十五节 (原创) 参考使用表

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. webgl学习笔记四-动画

    写在前面 建议先阅读下前面我的三篇文章. webgl学习笔记一-绘图单点 webgl学习笔记二-绘图多点 webgl学习笔记三-平移旋转缩放   下面我们将讲解下如何让一个正方形动起来~不断擦除和重绘 ...

  5. Android学习笔记_55_Tween动画 (渐变、缩放、位移、旋转)

    Android 平台提供了两类动画. 一类是Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转.平移.放缩和渐变).第二类就是 Frame动画,即顺序的播放事先做好的图像,与gi ...

  6. Android学习笔记-tween动画之java实现

    Android动画分为Tween动画和Frame动画,近期学习了,体tween动画,现在讲学习的心得以及相关知识介绍如下. Tween又称为补间动画,可以把对象进行缩小.放大.旋转和渐变等操作.   ...

  7. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  8. 学习笔记-- android动画简述

    android支持三种类型的动画: ·属性动画  一种补间动画,通过在目标对象的任何属性的两个值之间应用赠了变化,可以生成一种动画效果.这种动画可以用来生成各种效果,例如:改变视图的颜色.透明条.淡入 ...

  9. 4月13日学习笔记——jQuery动画

    基本动画函数 $("#divPop").show(); $("#divPop").hide(); $("#divPop").toggle() ...

随机推荐

  1. UWP 使用Telerik Grid控件

    还是老规矩,看一下最终效果. 数据是从SQLite中读取,然后绑定到DataGrid中显示的. 先看一下XAML <grid:RadDataGrid Grid.Row="1" ...

  2. 数据处理框架:Pig

    Pig pig 是基于hadoop的一个数据处理框架. MapReduce是使用java开发的.Pig有一套自己的数据处理语言.Pig的数据处理过程要转化为MR 来运行. Pig的数据处理语言是数据流 ...

  3. Spring Boot 系列(八)@ControllerAdvice 拦截异常并统一处理

    在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder.@ModelAttribute,并应用到所有@Requ ...

  4. nodejs中的require,exports使用说明

    模块是一门语言编写大项目的基石,因此,了解如何组织.编写.编译.加载模块很重要.这里主要谈谈Node中的模块加载. 1.Node中的模块,主要使用require来加载模块,文件 require(&qu ...

  5. NGUI_slider

    十一.进度条UISlider 1.一般按以下规律使用进度条; 如果某一钟值,他有最大值,需要表达当前的值得占比,则可以使用不可拖动的进度条 如果某一值,他有最大值,需要玩家记性滑动设置,则可以使用可拖 ...

  6. python编程中的if __name__ == 'main与windows中使用多进程

    if __name__ == 'main 一个python的文件有两种使用的方法,第一是直接作为程序执行,第二是import到其他的python程序中被调用(模块重用)执行. 因此if __name_ ...

  7. nodejs简单数据迁移demo

    近期做数据迁移,采用nodejs框架,数据库为mysql.作为一枚菜鸟,在编码过程中,遇到众多奇葩问题,感谢民少给予的支持. 由于旧数据库中的数据,在之前设计中存在众多不合理的情况,因此在数据迁移中, ...

  8. Java线程中断机制-如何中断线程

    介绍: 对于线程一共分为五个状态:新建状态,就绪状态,阻塞状态,运行状态,死亡状态,有时候把阻塞状态又分为同步阻塞和等待阻塞. 有时想让主线程启动的一个子线程结束运行,我们就需要让这个子线程中断,不再 ...

  9. 如何正确使用Java异常处理机制

    文章来源:leaforbook - 如何正确使用Java异常处理机制作者:士别三日 第一节 异常处理概述 第二节 Java异常处理类 2.1 Throwable 2.1.1 Throwable有五种构 ...

  10. Oracle服务器和客户端的安装和卸载

    Oracle 11g服务器与客户端的完全卸载方式与前些版本有了改变: 一.卸载前准备: 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务. 二.批处理卸载 ...