Angular动画实现的2种方式以及添加购物车动画实例代码


Posted in Javascript onAugust 09, 2018

前言

在前端应用中,动画是一个常见的场景。在使用了一系列的动画库之后,终于需要自己来实现一个动画了。这次的动画则是基于 Angular 框架。我的场景是一个类似于添加购物车的动画。在这个场景里,需要两个动画,一个是购物车数量的增加动画,一个则是折叠页面元素的动画。

在实现的过程上,我采用了两种不同的 Angular 动画的方式:

  • 使用 TypeScript 控制动画
  • 使用 @Component 中的 animations

Angular 动画基础

如 Angular 官网中的示例那样,要在 Angular 应用中添加动画是比较简单的一件事——前提是我们懂得添加的法则。如下是官网的示例:

@Component({
 selector: 'app-hero-list-basic',
 template: `
 <ul>
 <li *ngFor="let hero of heroes"
  [@heroState]="hero.state"
  (click)="hero.toggleState()">
 {{hero.name}}
 </li>
 </ul>
 `,
 styleUrls: ['./hero-list.component.css'],
 animations: [
 trigger('heroState', [
 state('inactive', style({
 backgroundColor: '#eee',
 transform: 'scale(1)'
 })),
 state('active', style({
 backgroundColor: '#cfd8dc',
 transform: 'scale(1.1)'
 })),
 transition('inactive => active', animate('100ms ease-in')),
 transition('active => inactive', animate('100ms ease-out'))
 ])
 ]
})

要使用动画,需要在模板中使用 [@heroState]语法,这里的 heroState 对应着 @Component 中的 heroState 相关的动画。

  • 在这个 trigger 中,我们定义了 inactive 和 active 两个不同的 state。即当模板中的 hero.state 发生变化的时候,我们就会找到对应的 state 的样式等等的内容。
  • 在这个 trigger 中,我们还定义了两个 transition,即当我们的 state 从 inactive => active 或者 active => inactive 时,我们就会执行后面的动画。

原理上,大概就是这么多了。然后,我就开始了我的动画之旅。

购物车数量增加动画

对于我的场景来说,要添加这个动画并不难。无非就是上一个值淡出,新的值淡入:

trigger('count', [
 transition('void => current', [
 animate(
 '400ms 150ms',
 keyframes([
  style({ opacity: 0.6, transform: 'translateY(0)', offset: 0 }),
  style({ opacity: 0.3, transform: 'translateY(-15px)', offset: 0.5 }),
  style({ opacity: 0, transform: 'translateY(-30px)', offset: 1 })
 ])
 )
 ]),
 transition('void => last', [
 animate(
 250,
 keyframes([
  style({ opacity: 0, transform: 'translateY(100%)', offset: 0 }),
  style({ opacity: 0.3, transform: 'translateY(15px)', offset: 0.5 }),
  style({ opacity: 0.8, transform: 'translateY(0)', offset: 1.0 })
 ])
 )
 ])
 ])

代码就是这么简单,这里用到了关键帧 keyframes,来进行一些简单的动画转换。

页面缩放动画

随后,我需要做的就是对页面的元素进行缩放等效果,这个时候就需要用到 AnimationBuilder 来实现了:

const myAnimation = this.animationBuilder.build([
 animate(
 1000,
 keyframes([
  style({ opacity: 0.8, transform: 'scale(0.8)', offset: 0.3 }),
  style({ opacity: 0.3, transform: 'scale(0.3)', offset: 0.5 }),
  style({ opacity: 0.2, transform: 'scale(0.2) translate(12000px, 8000px)', offset: 1 })
 ])
 )
 ]);

 const player = myAnimation.create(forkFormComponent);
 player.play();
 player.onDone(() => {
 const nativeElement = this.cartContainer.nativeElement;
 nativeElement.removeChild(nativeElement.childNodes[0]);
 this.renderer.setStyle(nativeElement, 'display', 'none');
 });

在那之前,我先复制了页面元素:

const formElement = this.formElement.nativeElement;

const forkFormComponent = this.cartContainer.nativeElement;
forkFormComponent.appendChild(formElement.cloneNode(true));

this.renderer.setStyle(forkFormComponent, 'display', 'block');
this.renderer.setStyle(forkFormComponent, 'position', 'absolute');
this.renderer.setStyle(forkFormComponent, 'top', '-300px');
this.renderer.setStyle(forkFormComponent, 'left', '0');

这样一来,就能复制页面的 DOM,然后实现缩放效果了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Prototype Function对象 学习
Jul 12 Javascript
面向对象设计模式的核心法则
Nov 10 Javascript
jquery简单的弹出层浮动层代码
Apr 27 Javascript
React.js入门学习第一篇
Mar 30 Javascript
JavaScript ES5标准中新增的Array方法
Jun 28 Javascript
浅析JavaScript中作用域和作用域链
Dec 06 Javascript
详解如何用webpack打包一个网站应用项目
Jul 12 Javascript
vue监听input标签的value值方法
Aug 27 Javascript
vue观察模式浅析
Sep 25 Javascript
js+html5 canvas实现ps钢笔抠图
Apr 28 Javascript
使用Vue 自定义文件选择器组件的实例代码
Mar 04 Javascript
js获取图片的base64编码并压缩
Dec 05 Javascript
Vue.js 通过jQuery ajax获取数据实现更新后重新渲染页面的方法
Aug 09 #jQuery
详解Vue开发微信H5微信分享签名失败问题解决方案
Aug 09 #Javascript
JQuery Ajax动态加载Table数据的实例讲解
Aug 09 #jQuery
详解在React中跨组件分发状态的三种方法
Aug 09 #Javascript
使用jquery DataTable和ajax向页面显示数据列表的方法
Aug 09 #jQuery
React中如何引入Angular组件详解
Aug 09 #Javascript
jQuery 实现批量提交表格多行数据的方法
Aug 09 #jQuery
You might like
为什么《星际争霸》是测试人工智能的理想战场
2019/12/03 星际争霸
ajax php 实现写入数据库
2009/09/02 PHP
php中获得视频时间总长度的另一种方法
2011/09/15 PHP
php读取mysql乱码,用set names XXX解决的原理分享
2011/12/29 PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
2014/04/08 PHP
PHP操作文件的一些基本函数使用示例
2014/11/18 PHP
无需数据库在线投票调查php代码
2016/07/20 PHP
thinkPHP框架实现的无限回复评论功能示例
2018/06/09 PHP
javascript实现des解密加密全过程
2014/04/03 Javascript
js确认删除对话框适用于a标签及submit
2014/07/10 Javascript
如何实现chrome浏览器关闭页面时弹出“确定要离开此面吗?”
2015/03/05 Javascript
JS实现文件动态顺序载入的方法
2015/03/07 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
2015/08/05 Javascript
跟我学习javascript的浮点数精度
2015/11/16 Javascript
jquery对dom节点的操作【推荐】
2016/04/15 Javascript
微信小程序中用WebStorm使用LESS
2017/03/08 Javascript
vue.js事件处理器是什么
2017/03/20 Javascript
JS sort排序详细使用方法示例解析
2020/09/27 Javascript
python3之微信文章爬虫实例讲解
2017/07/12 Python
python分治法求二维数组局部峰值方法
2018/04/03 Python
Python中使用logging和traceback模块记录日志和跟踪异常
2019/04/09 Python
kafka-python 获取topic lag值方式
2019/12/23 Python
python global和nonlocal用法解析
2020/02/03 Python
详解字符串在Python内部是如何省内存的
2020/02/03 Python
python接入支付宝的实例操作
2020/07/20 Python
python实现无边框进度条的实例代码
2020/12/30 Python
雅诗兰黛(Estee Lauder)英国官方网站:世界顶级化妆品牌
2016/12/29 全球购物
美国战术品牌:5.11 Tactical
2019/05/01 全球购物
德国家具折扣店:POCO
2020/02/28 全球购物
实习鉴定范文
2013/12/19 职场文书
中医学专业自荐信范文
2014/04/01 职场文书
学校法制宣传日活动总结
2014/11/01 职场文书
员工担保书范本
2015/09/22 职场文书
2016大学生就业指导课心得体会
2016/01/15 职场文书
golang 生成对应的数据表struct定义操作
2021/04/28 Golang
Vue通过懒加载提升页面响应速度
2021/05/10 Vue.js