JS抛物线动画实例制作


Posted in Javascript onFebruary 24, 2018

在做无人便利小程序的项目中,某一天产品说要像某产商产品学习,给添加购物车增加抛物线小球动画。好吧,产品你最大,做!

先给大家看下效果图

JS抛物线动画实例制作

分析

这种不固定起始位置的动画,自然不能用 gif 图,所以只能用原生代码实现

那我们有什么工具来实现动画呢?

小程序提供了 JS API createAnimation 来创建动画

CSS animation

工具有了,我们再看一下什么是抛物线。

这里我们只讨论水平抛物线,水平抛物线从数学原理上来说就是【水平匀速、垂直加速的运动】,转换成代码层面就是在动画效果 timingFunction 中,水平动画采用 linear ,垂直动画采用 ease-in

所以我们需要把这个抛物线动画分解成 两个 同时 进行但 不同动画效果 的动画。

实现

小程序的实现

JS:

cartAnimation(x, y) { // x y 为手指点击的坐标,即球的起始坐标
  let self = this,
    cartY = app.globalData.winHeight - 50, // 结束位置(购物车图片)纵坐标
    cartX = 50, // 结束位置(购物车图片)的横坐标
    animationX = flyX(cartX, x), // 创建球的横向动画
    animationY = flyY(cartY, y), // 创建球的纵向动画
    this.setData({
      ballX: x,
      ballY: y,
      showBall: true
    })
  setTimeoutES6(100).then(() => { // 100 秒延时,确保球已经到位并显示
    self.setData({
      animationX: animationX.export(),
      animationY: animationY.export(),
    })
    return setTimeoutES6(400) // 400 是球的抛物线动画时长
  }).then(() => { // 400 秒延时后隐藏球
    this.setData({
      showBall: false,
    })
  })
}

function setTimeoutES6(sec) { // Promise 化 setTimeout
  return new Promise((resolve, reject) => {
    setTimeout(() => {resolve()}, sec)
  })
}

function flyX(cartX, oriX) { // 水平动画
  let animation = wx.createAnimation({
    duration: 400,
    timingFunction: 'linear',
  })
  animation.left(cartX).step()
  return animation
}

function flyY(cartY, oriY) { // 垂直动画
  let animation = wx.createAnimation({
    duration: 400,
    timingFunction: 'ease-in',
  })
  animation.top(cartY).step()
  return animation
}

HTML:

<view animation="{{animationY}}" style="position:fixed;top:{{ballY}}px;" hidden="{{!showBall}}">
  <view class="ball" animation="{{animationX}}" style="position:fixed;left:{{ballX}}px;"></view>
</view>

据我所知,用 transform: transtate() 来实现的动画会比 top & left 性能更优,但尝试下来发现并不能做到理想的交互效果,期待后续继续研究吧

H5 的实现

// todo
Javascript 相关文章推荐
iframe 父窗口和子窗口相互的调用方法集锦
Dec 15 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
Apr 08 Javascript
构造函数+原型模式构造js自定义对象(最通用)
May 12 Javascript
jquery实现右侧栏菜单选择操作
Mar 04 Javascript
jQuery bt气泡实现悬停显示及移开隐藏功能的方法
Jul 12 Javascript
BootStrap整体框架之基础布局组件
Dec 15 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
Nov 23 Javascript
解决layer弹出层msg的文字不显示的问题
Sep 11 Javascript
基于javascript实现贪吃蛇经典小游戏
Apr 10 Javascript
vue 通过绑定事件获取当前行的id操作
Jul 27 Javascript
Javascript柯里化实现原理及作用解析
Oct 22 Javascript
Vue.js中v-bind指令的用法介绍
Mar 13 Vue.js
浅谈VUE监听窗口变化事件的问题
Feb 24 #Javascript
使用watch监听路由变化和watch监听对象的实例
Feb 24 #Javascript
vue watch监听对象及对应值的变化详解
Feb 24 #Javascript
解决Vue不能检测数组或对象变动的问题
Feb 24 #Javascript
vue将对象新增的属性添加到检测序列的方法
Feb 24 #Javascript
jQuery实现碰到边缘反弹的动画效果
Feb 24 #jQuery
vue cli webpack中使用sass的方法
Feb 24 #Javascript
You might like
PHP实现多进程并行操作的详解(可做守护进程)
2013/06/18 PHP
ThinkPHP框架任意代码执行漏洞的利用及其修复方法
2014/07/04 PHP
PHP贪婪算法解决0-1背包问题实例分析
2015/03/23 PHP
PHP实现QQ空间自动回复说说的方法
2015/12/02 PHP
在WordPress中使用wp-cron插件来设置定时任务
2015/12/10 PHP
PHP引用返回用法示例
2016/05/28 PHP
PHP环境搭建的详细步骤
2016/06/30 PHP
PHP远程连接oracle数据库操作实现方法图文详解
2019/04/11 PHP
PHP连接MySQL数据库三种实现方法
2020/12/10 PHP
当自定义数据属性为json格式字符串时jQuery的data api问题探讨
2013/02/18 Javascript
jQuery实现鼠标滑过遮罩并高亮显示效果
2013/07/16 Javascript
javascript手工制作悬浮菜单
2015/02/12 Javascript
javascript实现列表滚动的方法
2015/07/30 Javascript
全面解析Javascript无限添加QQ好友原理
2016/06/15 Javascript
jQuery实现两个select控件的互移操作
2016/12/22 Javascript
extjs简介_动力节点Java学院整理
2017/07/17 Javascript
angular2路由切换改变页面title的示例代码
2017/08/23 Javascript
node 利用进程通信实现Cluster共享内存
2017/10/27 Javascript
详解如何将 Vue-cli 改造成支持多页面的 history 模式
2017/11/20 Javascript
vue组件 keep-alive 和 transition 使用详解
2019/10/11 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
如何在vue 中引入使用jquery
2020/11/10 jQuery
python+matplotlib演示电偶极子实例代码
2018/01/12 Python
Python 实现「食行生鲜」签到领积分功能
2018/09/26 Python
对python捕获ctrl+c手工中断程序的两种方法详解
2018/12/26 Python
django xadmin action兼容自定义model权限教程
2020/03/30 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
2020/04/08 Python
文明教师事迹材料
2014/01/16 职场文书
企业宣传方案
2014/03/04 职场文书
作文批改评语大全
2014/04/23 职场文书
2014教育局对照检查材料思想汇报
2014/09/23 职场文书
幼儿园小班教师个人工作总结
2015/02/06 职场文书
事业单位工作人员年度考核个人总结
2015/02/12 职场文书
母亲节寄语大全
2015/02/27 职场文书
24句精辟的现实社会语录,句句扎心,道尽人性
2019/08/29 职场文书
最新农村养殖致富:资金投入较低的创业项目有哪些?
2019/09/26 职场文书