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遍历 table的脚本
Jul 23 Javascript
javascript SocialHistory 检查访问者是否访问过某站点
Aug 02 Javascript
jquery 快速回到页首的方法
Dec 05 Javascript
Javascript排序算法之计数排序的实例
Apr 05 Javascript
为什么JS中eval处理JSON数据要加括号
Apr 13 Javascript
学习javascript面向对象 javascript实现继承的方式
Jan 04 Javascript
jQuery 弹出层插件(推荐)
May 24 Javascript
jQuery的ajax下载blob文件
Jul 21 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
Jun 19 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
Aug 17 Javascript
layer.js open 隐藏滚动条的例子
Sep 05 Javascript
JS实现移动端双指缩放和旋转方法
Dec 13 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 Directory 函数的详解
2013/03/07 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
php中array_column函数简单实现方法
2016/07/11 PHP
PHP删除数组中指定下标的元素方法
2018/02/03 PHP
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
laravel 如何实现引入自己的函数或类库
2019/10/15 PHP
Javascript实现CheckBox的全选与取消全选的代码
2010/07/20 Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
2011/03/05 Javascript
Javascript中3种实现继承的方法和代码实例
2014/08/12 Javascript
JavaScript对象数组的排序处理方法
2015/10/21 Javascript
vue动态组件实现选项卡切换效果
2017/03/08 Javascript
利用nodeJs anywhere搭建本地服务器环境的方法
2018/05/12 NodeJs
vue百度地图 + 定位的详解
2019/05/13 Javascript
html中创建并调用vue组件的几种方法汇总
2020/11/17 Javascript
Python multiprocessing模块中的Pipe管道使用实例
2015/04/11 Python
python对配置文件.ini进行增删改查操作的方法示例
2017/07/28 Python
Numpy 将二维图像矩阵转换为一维向量的方法
2018/06/05 Python
解决csv.writer写入文件有多余的空行问题
2018/07/06 Python
python批量修改图片大小的方法
2018/07/24 Python
一行python实现树形结构的方法
2019/08/09 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
2019/10/30 Python
解决python图像处理图像赋值后变为白色的问题
2020/06/04 Python
python3检查字典传入函数键是否齐全的实例
2020/06/05 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
2020/06/23 Python
详细分析Python可变对象和不可变对象
2020/07/09 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
2020/09/26 Python
利用CSS3实现文字折纸效果实例代码
2018/07/10 HTML / CSS
String这个类型的class为何定义成final?
2012/11/13 面试题
为什么要用EJB
2014/04/17 面试题
高二物理教学反思
2014/02/08 职场文书
党员组织关系介绍信
2014/02/13 职场文书
应届生求职自荐信
2014/07/04 职场文书
绿色环保家庭事迹材料
2014/08/31 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
用React Native制作一个简单的游戏引擎
2021/05/27 Javascript
Mybatis 一级缓存和二级缓存原理区别
2022/09/23 Java/Android