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 相关文章推荐
菜鸟javascript基础资料整理3 正则
Dec 06 Javascript
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
Apr 14 Javascript
JavaScript动态插入script的基本思路及实现函数
Nov 11 Javascript
JavaScript中的setMilliseconds()方法使用详解
Jun 11 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
Aug 18 Javascript
jQuery 实现倒计时天,时,分,秒功能
Jul 31 jQuery
Puppeteer环境搭建的详细步骤
Sep 21 Javascript
Three.JS实现三维场景
Dec 30 Javascript
vue实现鼠标经过动画
Oct 16 Javascript
vue.js实现左边导航切换右边内容
Oct 21 Javascript
js实现验证码干扰(动态)
Feb 23 Javascript
JavaScript 对象创建的3种方法
Nov 17 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 程序员的调试技术小结
2009/11/15 PHP
PHP面向对象学习笔记之二 生成对象的设计模式
2012/10/06 PHP
PHP基础知识介绍
2013/09/17 PHP
php查询ip所在地的方法
2014/12/05 PHP
PHP编写RESTful接口
2016/02/23 PHP
PHP中利用sleep函数实现定时执行功能实现代码
2016/08/25 PHP
Paypal实现循环扣款(订阅)功能
2017/03/23 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
2018/09/29 PHP
PHP重载基础知识回顾
2020/09/10 PHP
js 效率组装字符串 StringBuffer
2009/12/23 Javascript
js截取固定长度的中英文字符的简单实例
2013/11/22 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
2014/03/28 Javascript
jQuery实现加入购物车飞入动画效果
2015/03/14 Javascript
轻松实现javascript数据双向绑定
2015/11/11 Javascript
JavaScript设置、获取、清除单值和多值cookie的方法
2015/11/17 Javascript
微信小程序“摇一摇”的实例代码
2017/07/20 Javascript
详解如何创建并发布一个 vue 组件
2018/11/08 Javascript
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
解决vue 单文件组件中样式加载问题
2019/04/24 Javascript
JS事件流与事件处理程序实例分析
2019/08/16 Javascript
关于element的表单组件整理笔记
2021/02/05 Javascript
Python实现的redis分布式锁功能示例
2018/05/29 Python
python批量修改图片大小的方法
2018/07/24 Python
python实现五子棋人机对战游戏
2020/03/25 Python
Python函数中的可变长参数详解
2019/09/12 Python
基于Python解密仿射密码
2019/10/21 Python
基于python实现学生信息管理系统
2019/11/22 Python
Python爬虫实现HTTP网络请求多种实现方式
2020/06/19 Python
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
GMP办公室主任岗位职责
2014/03/14 职场文书
装修活动策划方案
2014/08/27 职场文书
2014年学生工作总结
2014/11/20 职场文书
烛光里的微笑观后感
2015/06/17 职场文书
运动会3000米加油稿
2015/07/21 职场文书
《火烧云》教学反思
2016/02/23 职场文书
python迷宫问题深度优先遍历实例
2021/06/20 Python