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 UI 应用不同Theme的办法
Sep 12 Javascript
js 处理URL实用技巧
Nov 23 Javascript
JS 实现Json查询的方法实例
Apr 12 Javascript
jQuery实现div浮动层跟随页面滚动效果
Feb 11 Javascript
JavaScript限定图片显示大小的方法
Mar 11 Javascript
javascript获取网页各种高宽及位置的方法总结
Jul 27 Javascript
功能强大的Bootstrap使用手册(一)
Aug 02 Javascript
javascript实现文字无缝滚动
Dec 27 Javascript
基于vue-video-player自定义播放器的方法
Mar 21 Javascript
Vue基本使用之对象提供的属性功能
Apr 30 Javascript
深入理解Vue keep-alive及实践总结
Aug 21 Javascript
Vue如何获取数据列表展示
Dec 11 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 字符串编码截取函数(兼容utf-8和gb2312)
2009/05/02 PHP
php实现利用phpexcel导出数据
2013/08/24 PHP
PHP mail()函数使用及配置方法
2014/01/14 PHP
PHP设计模式之单例模式原理与实现方法分析
2018/04/25 PHP
JS 字符串连接[性能比较]
2009/05/10 Javascript
JQueryEasyUI datagrid框架的基本使用
2013/04/08 Javascript
javascript读写XML实现广告轮换(兼容IE、FF)
2013/08/09 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
Jquery promise实现一张一张加载图片
2015/11/13 Javascript
详解nodejs中exports和module.exports的区别
2017/02/17 NodeJs
详解angular2实现ng2-router 路由和嵌套路由
2017/03/24 Javascript
jQuery实现的简单获取索引功能示例
2018/06/04 jQuery
mui js控制开关状态、修改switch开关的值方法
2019/09/03 Javascript
微信小程序 导入图标实现过程详解
2019/10/11 Javascript
JS绘图Flot如何实现动态可刷新曲线图
2020/10/16 Javascript
python实现sublime3的less编译插件示例
2014/04/27 Python
零基础写python爬虫之爬虫的定义及URL构成
2014/11/04 Python
Python实现PS滤镜的万花筒效果示例
2018/01/23 Python
详解python破解zip文件密码的方法
2020/01/13 Python
关于Python turtle库使用时坐标的确定方法
2020/03/19 Python
HTML5全屏(Fullscreen)API详细介绍
2015/04/24 HTML / CSS
阿里旅行:飞猪
2017/01/05 全球购物
FC-Moto英国:欧洲最大的摩托车服装和头盔商店之一
2019/08/25 全球购物
省三好学生申请材料
2014/01/22 职场文书
中专自我鉴定
2014/02/05 职场文书
模具设计与制造专业推荐信
2014/02/16 职场文书
公证书标准格式
2014/04/10 职场文书
会计学自荐信
2014/06/03 职场文书
安全目标责任书
2014/07/22 职场文书
党员个人剖析材料(四风问题)
2014/10/07 职场文书
学生检讨书范文
2015/01/27 职场文书
综合测评个人总结
2015/03/03 职场文书
2016年校长新年寄语
2015/08/17 职场文书
2019请假条的基本格式及范文!
2019/07/05 职场文书
mysql在项目中怎么选事务隔离级别
2021/05/25 MySQL
Ajax 的初步实现(使用vscode+node.js+express框架)
2021/06/18 Javascript