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 相关文章推荐
用javascript实现给图片加链接
Aug 15 Javascript
用JQuery在网页中实现分隔条功能的代码
Aug 09 Javascript
Jquery原生态实现表格header头随滚动条滚动而滚动
Mar 18 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
Aug 22 Javascript
jquery实现简单实用的弹出层效果代码
Oct 15 Javascript
el表达式 写入bootstrap表格数据页面的实例代码
Jan 11 Javascript
详解微信小程序 wx.uploadFile 的编码坑
Jan 23 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
Apr 23 jQuery
详解webpack+gulp实现自动构建部署
Jun 29 Javascript
seajs和requirejs模块化简单案例分析
Aug 26 Javascript
vue计算属性无法监听到数组内部变化的解决方案
Nov 06 Javascript
微信小程序实现转盘抽奖
Sep 21 Javascript
浅谈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操作数组的一些函数整理介绍
2011/07/17 PHP
destoon实现VIP排名一直在前面排序的方法
2014/08/21 PHP
Laravel中任务调度console使用方法小结
2017/05/07 PHP
简单通用的JS滑动门代码
2008/12/19 Javascript
随鼠标上下滚动的jquery代码
2013/12/05 Javascript
判断某个字符在一个字符串中是否存在的js代码
2014/02/28 Javascript
javascript实例分享---具有立体效果的图片特效
2014/06/08 Javascript
10分钟学会写Jquery插件实例教程
2014/09/06 Javascript
从数据库读取数据后将其输出成html标签的三种方法
2014/10/13 Javascript
javascript实现校验文件上传控件实例
2015/04/20 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
基于JS代码实现实时显示系统时间
2016/06/16 Javascript
微信小程序实现点击按钮移动view标签的位置功能示例【附demo源码下载】
2017/12/06 Javascript
element-ui循环显示radio控件信息的方法
2018/08/24 Javascript
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
微信小程序sessionid不一致问题解决
2019/08/30 Javascript
vue中使用百度脑图kityminder-core二次开发的实现
2019/09/26 Javascript
[46:42]DOTA2-DPC中国联赛正赛 Aster vs Magma BO3 第二场 3月5日
2021/03/11 DOTA
本地文件上传到七牛云服务器示例(七牛云存储)
2014/01/11 Python
python命令行参数sys.argv使用示例
2014/01/28 Python
浅谈python中的实例方法、类方法和静态方法
2017/02/17 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
2018/01/04 Python
django数据库migrate失败的解决方法解析
2018/02/08 Python
python中字符串变二维数组的实例讲解
2018/04/03 Python
Python实现聊天机器人的示例代码
2018/07/09 Python
Python实现动态添加属性和方法操作示例
2018/07/25 Python
Python接口测试文件上传实例解析
2020/05/22 Python
keras自动编码器实现系列之卷积自动编码器操作
2020/07/03 Python
Html5导航栏吸顶方案原理与对比实现
2020/06/10 HTML / CSS
美国顶级户外凉鞋品牌:Chacos
2017/03/27 全球购物
绩效工资实施方案
2014/03/15 职场文书
三孔导游词
2015/02/05 职场文书
2016七一建党节慰问信
2015/11/30 职场文书
党员干部学法用法心得体会
2016/01/21 职场文书
详解Python flask的前后端交互
2022/03/31 Python
使用python生成大量数据写入es数据库并查询操作(2)
2022/09/23 Python