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动态添加及删除表单上传元素的方法(附demo源码下载)
Jan 15 Javascript
简单实现js悬浮导航效果
Feb 05 Javascript
jquery实现超简单的瀑布流布局【推荐】
Mar 08 Javascript
详解Vue路由钩子及应用场景(小结)
Nov 07 Javascript
解决Jstree 选中父节点时被禁用的子节点也会选中的问题
Dec 27 Javascript
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
Jan 20 Javascript
解决vue项目打包后提示图片文件路径错误的问题
Jul 04 Javascript
vuex实现及简略解析(小结)
Mar 01 Javascript
Vue 2.0 中依赖注入 provide/inject组合实战
Jun 20 Javascript
js动态获取时间的方法分析
Aug 02 Javascript
mpvue微信小程序开发之实现一个弹幕评论
Nov 24 Javascript
Vue中keep-alive的两种应用方式
Jul 15 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的ob_start();控制您的浏览器cache!
2007/02/14 PHP
php 魔术函数使用说明
2010/02/21 PHP
解析mysql left( right ) join使用on与where筛选的差异
2013/06/18 PHP
使用PHP函数scandir排除特定目录
2014/06/12 PHP
js代码实现微博导航栏
2015/07/30 PHP
PHPTree――php快速生成无限级分类
2018/03/30 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
2018/07/20 PHP
一个简单的javascript类定义例子
2009/09/12 Javascript
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
关于延迟加载JavaScript
2015/05/05 Javascript
JavaScript代码实现禁止右键、禁选择、禁粘贴、禁shift、禁ctrl、禁alt
2015/11/17 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
分享Bootstrap简单表格、表单、登录页面
2017/08/04 Javascript
MUI顶部选项卡的用法(tab-top-webview-main)详解
2017/10/08 Javascript
JavaScript中七种流行的开源机器学习框架
2018/10/11 Javascript
React Hooks 实现和由来以及解决的问题详解
2020/01/17 Javascript
使用Python的Supervisor进行进程监控以及自动启动
2014/05/29 Python
Python+tkinter使用40行代码实现计算器功能
2018/01/30 Python
Windows下python3.6.4安装教程
2018/07/31 Python
python的debug实用工具 pdb详解
2019/07/12 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
python 插入日期数据到Oracle实例
2020/03/02 Python
python实现图像高斯金字塔的示例代码
2020/12/11 Python
CSS3圆角边框和边界图片效果实例
2016/07/01 HTML / CSS
CSS3改变浏览器滚动条样式
2019/01/04 HTML / CSS
佳能德国网上商店:Canon德国
2017/03/18 全球购物
亚洲最大的眼镜批发商和零售商之一:Glasseslit
2018/10/08 全球购物
Abbacino官网:包、钱包和女士配饰
2019/04/15 全球购物
环境科学专业研究生求职信
2013/10/02 职场文书
师范教师大学生职业生涯规划范文
2014/01/05 职场文书
餐饮管理自我介绍信
2014/01/15 职场文书
总经理文秘岗位职责
2014/02/03 职场文书
请假条标准格式规范
2014/04/10 职场文书
运动会搞笑广播稿
2014/10/14 职场文书
Mybatis是这样防止sql注入的
2021/12/06 Java/Android
Oracle数据库中通用的函数实例详解
2022/03/25 Oracle