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 相关文章推荐
jquery tablesorter.js 支持中文表格排序改进
Dec 09 Javascript
Web开发者必备的12款超赞jQuery插件
Dec 03 Javascript
在jquery中处理带有命名空间的XML数据
Jun 13 Javascript
js事件监听机制(事件捕获)总结
Aug 08 Javascript
JavaScript删除数组元素的方法
Mar 20 Javascript
jquery+ajax请求且带返回值的代码
Aug 12 Javascript
jQuery添加和删除输入文本框标签代码
May 20 Javascript
jQuery图片瀑布流的简单实现代码
Mar 15 Javascript
Vue+Webpack完美整合富文本编辑器TinyMce的方法
Nov 30 Javascript
js如何获取访问IP、地区、当前操作浏览器
Jul 23 Javascript
vue 导航内容设置选中状态样式的例子
Nov 01 Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
May 22 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
自己做矿石收音机
2021/03/02 无线电
用在PHP里的JS打印函数
2006/10/09 PHP
php 页面执行时间计算代码
2008/12/04 PHP
Yii2实现UploadedFile上传文件示例
2017/02/15 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
2019/10/30 PHP
什么是JavaScript
2009/08/13 Javascript
Javascript 类与静态类的实现(续)
2010/04/02 Javascript
jQuery学习笔记之jQuery.fn.init()的参数分析
2014/06/09 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
js判断是否为空和typeof的用法(详解)
2016/10/07 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
Nodejs 获取时间加手机标识的32位标识实现代码
2017/03/07 NodeJs
jquery实现侧边栏左右伸缩效果的示例
2017/12/19 jQuery
一文读懂ES7中的javascript修饰器
2019/05/06 Javascript
微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)
2019/05/10 Javascript
Javascript实现秒表计时游戏
2020/05/27 Javascript
Vue时间轴 vue-light-timeline的用法说明
2020/10/29 Javascript
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
python实现图片处理和特征提取详解
2017/11/13 Python
python编程线性回归代码示例
2017/12/07 Python
Python的多维空数组赋值方法
2018/04/13 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
python实现读取excel文件中所有sheet操作示例
2019/08/09 Python
Python实现多线程/多进程的TCP服务器
2019/09/03 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
2019/09/25 Python
Python更新所有已安装包的操作
2020/02/13 Python
PyQt中使用QtSql连接MySql数据库的方法
2020/07/28 Python
法国购买二手电子产品网站:Asgoodasnew
2020/03/27 全球购物
施惠特软件测试面试题以及笔试题
2015/05/13 面试题
营业员实习自我鉴定
2013/12/07 职场文书
教师党员先进性教育自我剖析材料思想汇报
2014/09/24 职场文书
初中信息技术教学计划
2015/01/22 职场文书
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python
JS 基本概念详细介绍
2021/10/16 Javascript
python全面解析接口返回数据
2022/02/12 Python
Apache POI操作批量导入MySQL数据库
2022/06/21 Servers