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函数(json)附详细说明
May 25 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
May 02 Javascript
JavaScript中实现异步编程模式的4种方法
Sep 24 Javascript
一个php+js实时显示时间问题
Oct 12 Javascript
聊一聊jQuery插件uploadify使用方法
Aug 24 Javascript
JS实现侧边栏鼠标经过弹出框+缓冲效果
Mar 29 Javascript
Angular 4依赖注入学习教程之简介(一)
Jun 04 Javascript
在vue项目中安装使用Mint-UI的方法
Dec 27 Javascript
Bootstrap Table实现定时刷新数据的方法
Aug 13 Javascript
Vue实现移动端左右滑动效果的方法
Nov 27 Javascript
详解jQuery中的getAll()和cleanData()
Apr 15 jQuery
vue使用localStorage保存登录信息 适用于移动端、PC端
May 27 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 SPL标准库之数据结构堆(SplHeap)简单使用实例
2015/05/12 PHP
PHP面向对象学习之parent::关键字
2017/01/18 PHP
Javascript实例教程(19) 使用HoTMetal(6)
2006/12/23 Javascript
js实现的网页颜色代码表全集
2007/07/17 Javascript
jquery 将disabled的元素置为enabled的三种方法
2009/07/25 Javascript
基于jquery的鼠标拖动效果代码
2012/05/30 Javascript
JavaScript中创建类/对象的几种方法总结
2013/11/29 Javascript
jquery 隐藏与显示tr标签示例代码
2014/06/06 Javascript
jquery.validate使用时遇到的问题
2015/05/25 Javascript
jquery+html5烂漫爱心表白动画代码分享
2015/08/24 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
2016/05/05 Javascript
原生js获取元素样式的简单方法
2016/08/06 Javascript
JavaScript使用类似break机制中断forEach循环的方法
2018/11/13 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
2019/05/16 Javascript
[02:30]联想杯DOTA2完美世界全国高校联赛—北京站现场
2015/11/16 DOTA
[02:49]2018DOTA2亚洲邀请赛主赛事决赛日战况回顾 Mineski鏖战5局夺得辉耀
2018/04/10 DOTA
对于Python装饰器使用的一些建议
2015/06/03 Python
python使用Matplotlib画饼图
2018/09/25 Python
python3实现zabbix告警推送钉钉的示例
2019/02/20 Python
Python 数据可视化pyecharts的使用详解
2019/06/26 Python
python3.7.3版本和django2.2.3版本是否可以兼容
2020/09/01 Python
如何利用Python 进行边缘检测
2020/10/14 Python
Django执行源生mysql语句实现过程解析
2020/11/12 Python
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
2021/03/17 Javascript
韩国三星旗下的一家超市连锁店:Home Plus
2016/07/30 全球购物
英国女士家居服网站:hush
2017/08/09 全球购物
英国设计的甲板鞋和船鞋:Chatham
2018/12/06 全球购物
SAZAC的动物连体衣和动物睡衣:Kigurumi Shop
2020/03/14 全球购物
泰国最新活动和优惠:Megatix
2020/05/07 全球购物
预备党员2014全国两会学习心得体会
2014/03/10 职场文书
委托函范文
2015/01/29 职场文书
2016年大学迎新晚会工作总结
2015/10/15 职场文书
小学生组织委员竞选稿
2015/11/21 职场文书
2016年感恩父亲节活动总结
2016/04/01 职场文书
详解MySQL InnoDB存储引擎的内存管理
2021/04/08 MySQL
MySQL分区路径子分区再分区
2022/04/13 MySQL