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 相关文章推荐
解决JS中乘法的浮点错误的方法
Jan 03 Javascript
jquery使用ajax实现微信自动回复插件
Apr 28 Javascript
js实现的点击div区域外隐藏div区域
Jun 30 Javascript
Underscore.js常用方法总结
Feb 28 Javascript
Bootstrap三种表单布局的使用方法
Jun 21 Javascript
AngularJS用户选择器指令实例分析
Nov 04 Javascript
通过修改360抢票的刷新频率和突破8车次限制实现方法
Jan 04 Javascript
vue.js移动端app之上拉加载以及下拉刷新实战
Sep 11 Javascript
js时间戳与日期格式之间转换详解
Dec 11 Javascript
完美解决iview 的select下拉框选项错位的问题
Mar 02 Javascript
ES6中Promise的使用方法实例总结
Feb 18 Javascript
Vue通过provide inject实现组件通信
Sep 03 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
缅甸的咖啡简史
2021/03/04 咖啡文化
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
php连接数据库代码应用分析
2011/05/29 PHP
Yii2中OAuth扩展及QQ互联登录实现方法
2016/05/16 PHP
详解PHP中foreach的用法和实例
2016/10/25 PHP
用Javascript 获取页面元素的位置的代码
2009/09/25 Javascript
一行代码告别document.getElementById
2012/06/01 Javascript
JS跨域总结
2012/08/30 Javascript
Javascript 检测键盘按键信息及键码值对应介绍
2013/01/03 Javascript
Jquery插件仿百度搜索关键字自动匹配功能
2016/05/11 Javascript
jquery+Jscex打造游戏力度条
2020/09/12 Javascript
jQuery动态生成不规则表格(前后端)
2017/02/21 Javascript
Angular+Node生成随机数的方法
2017/06/16 Javascript
Angular实现的日程表功能【可添加及隐藏显示内容】
2017/12/27 Javascript
解决Js先触发失去焦点事件再执行点击事件的问题
2018/08/30 Javascript
解决vue项目nginx部署到非根目录下刷新空白的问题
2018/09/27 Javascript
vue ssr 实现方式(学习笔记)
2019/01/18 Javascript
node.js使用http模块创建服务器和客户端完整示例
2020/02/10 Javascript
[07:27]DOTA2卡尔工作室 英雄介绍水晶室女篇
2013/06/21 DOTA
python中使用xlrd、xlwt操作excel表格详解
2015/01/29 Python
Python魔术方法详解
2015/02/14 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
使用python编写监听端
2018/04/12 Python
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
python3使用GUI统计代码量
2019/09/18 Python
CSS3实现同时执行倾斜和旋转的动画效果
2016/10/27 HTML / CSS
HTML5文档结构标签
2017/04/21 HTML / CSS
建筑学推荐信
2013/11/03 职场文书
业务主管岗位职责范本
2013/12/25 职场文书
运动会获奖感言
2014/02/11 职场文书
新闻学专业求职信
2014/07/28 职场文书
2015年社区综治工作总结
2015/04/21 职场文书
2016年领导干部廉政承诺书
2016/03/24 职场文书
HR在给员工开具离职证明时,需要注意哪些问题?
2019/07/03 职场文书
Vue ECharts实现机舱座位选择展示功能
2022/05/15 Vue.js
MyBatis核心源码深度剖析SQL语句执行过程
2022/05/20 Java/Android