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 相关文章推荐
将函数的实际参数转换成数组的方法
Jan 25 Javascript
基于豆瓣API+Angular开发的web App
Jan 02 Javascript
Bootstrap中表单控件状态(验证状态)
Aug 04 Javascript
巧用Vue.js+Vuex制作专门收藏微信公众号的app
Nov 03 Javascript
浅析script标签中的defer与async属性
Nov 30 Javascript
jQuery实现简单的回到顶部totop功能示例
Oct 16 jQuery
Angular2 父子组件通信方式的示例
Jan 29 Javascript
Vue 全家桶实现移动端酷狗音乐功能
Nov 16 Javascript
将Vue组件库更换为按需加载的方法步骤
May 06 Javascript
微信小程序 获取手机号 JavaScript解密示例代码详解
May 14 Javascript
微信小程序实现单个或多个倒计时功能
Nov 01 Javascript
JavaScript parseInt0.0000005打印5原理解析
Jul 23 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
回答PHPCHINA上的几个问题:URL映射
2007/02/14 PHP
一些使用频率比较高的php函数
2008/10/03 PHP
PHP开发过程中常用函数收藏
2009/12/14 PHP
使用cookie实现统计访问者登陆次数
2013/06/08 PHP
Yii框架实现邮箱激活的方法【数字签名】
2016/10/18 PHP
Thinkphp框架中D方法与M方法的区别
2016/12/23 PHP
js类型检查实现代码
2010/10/29 Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
2012/08/22 Javascript
Javascript模块化编程(一)AMD规范(规范使用模块)
2013/01/17 Javascript
js 关键词高亮(根据ID/tag高亮关键字)案例介绍
2013/01/21 Javascript
jQuery点击tr实现checkbox选中的方法
2013/03/19 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
用JS在浏览器中创建下载文件
2014/03/05 Javascript
js获取当前页面的url网址信息
2014/06/12 Javascript
9款2014最热门jQuery实用特效推荐
2014/12/07 Javascript
JavaScript控制table某列不显示的方法
2015/03/16 Javascript
jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结
2015/12/24 Javascript
Three.js学习之文字形状及自定义形状
2016/08/01 Javascript
VC调用javascript的几种方法(推荐)
2016/08/09 Javascript
AngularJs上传前预览图片的实例代码
2017/01/20 Javascript
详解vue.js全局组件和局部组件
2017/04/10 Javascript
javascript基于定时器实现进度条功能实例
2017/10/13 Javascript
Vue实现带进度条的文件拖动上传功能
2018/02/23 Javascript
[01:34]传奇从这开始 2016国际邀请赛中国区预选赛震撼开启
2016/06/26 DOTA
python修改注册表终止360进程实例
2014/10/13 Python
python 实现判断ip连通性的方法总结
2018/04/22 Python
Linux下多个Python版本安装教程
2018/08/15 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
2019/12/18 Python
Django认证系统user对象实现过程解析
2020/03/02 Python
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
The Athlete’s Foot新西兰:新西兰最大的运动鞋零售商
2019/12/23 全球购物
《孔繁森》教学反思
2014/04/17 职场文书
党校党性分析材料
2014/12/19 职场文书
检讨书大全
2015/01/27 职场文书
2019年关于小学生课外阅读情况的分析报告
2019/12/02 职场文书
Vue和Flask通信的实现
2021/05/19 Vue.js