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 相关文章推荐
js使用正则实现ReplaceAll全部替换的方法
Aug 22 Javascript
jQuery简单验证上传文件大小及类型的方法
Jun 02 Javascript
Vue.js实现实例搜索应用功能详细代码
Aug 24 Javascript
chorme 浏览器记住密码后input黄色背景处理方法(两种)
Nov 22 Javascript
Vue加载组件、动态加载组件的几种方式
Aug 31 Javascript
基于Vue实现可以拖拽的树形表格实例详解
Oct 18 Javascript
vue-froala-wysiwyg 富文本编辑器功能
Sep 19 Javascript
node实现mock-plugin中间件的方法
Dec 25 Javascript
JS正则表达式验证端口范围(0-65535)
Jan 06 Javascript
javascript 数组(list)添加/删除的实现
Dec 17 Javascript
浅谈react路由传参的几种方式
Mar 23 Javascript
详解JavaScript中的执行上下文及调用堆栈
Apr 29 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
php adodb操作mysql数据库
2009/03/19 PHP
PHP sprintf() 函数的应用(定义和用法)
2012/06/29 PHP
Fine Uploader文件上传组件应用介绍
2013/01/06 PHP
PHP构造函数与析构函数用法示例
2016/09/28 PHP
利用JS重写Cognos右键菜单的实现代码
2010/04/11 Javascript
jQuery中insertBefore()方法用法实例
2015/01/08 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
2016/09/20 Javascript
Javascript 跨域知识详细介绍
2016/10/30 Javascript
输入框点击时边框变色效果的实现方法
2016/12/26 Javascript
如何利用JQuery实现从底部回到顶部的功能
2016/12/27 Javascript
Angular之指令Directive用法详解
2017/03/01 Javascript
浅析bootstrap原理及优缺点
2017/03/19 Javascript
jQuery EasyUI 为Combo,Combobox添加清除值功能的实例
2017/04/13 jQuery
AngularJS实现进度条功能示例
2017/07/05 Javascript
解决Vue2.0 watch对象属性变化监听不到的问题
2018/09/11 Javascript
Vue列表渲染的示例代码
2018/11/01 Javascript
React 父子组件通信的实现方法
2019/12/05 Javascript
vue实现页面切换滑动效果
2020/06/29 Javascript
微信小程序入门之指南针
2020/10/22 Javascript
[03:44]2014DOTA2国际邀请赛 71专访:DK战队赛前讨论视频遭泄露
2014/07/13 DOTA
[48:22]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Windows下搭建python开发环境详细步骤
2020/07/20 Python
Python采用Django制作简易的知乎日报API
2016/08/03 Python
Python socket网络编程TCP/IP服务器与客户端通信
2017/01/05 Python
python使用zip将list转为json的方法
2018/12/31 Python
django主动抛出403异常的方法详解
2019/01/04 Python
Python OpenCV调用摄像头检测人脸并截图
2020/08/20 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
水芝澳美国官网:H2O Plus
2016/10/15 全球购物
网上开商店的创业计划书
2014/01/19 职场文书
小学生民族团结演讲稿
2014/08/27 职场文书
2014市府办领导班子“四风问题”对照检查材料思想汇报
2014/09/24 职场文书
2015年幼儿园个人工作总结
2015/04/25 职场文书
法律意见书范本
2015/06/04 职场文书
世界名著读书笔记
2015/06/25 职场文书
CSS3中Animation实现简单的手指点击动画的示例
2021/07/15 HTML / CSS