JS抛物线动画实例制作

 更新时间:2018年02月24日 15:43:45   作者:henry_chen  
本篇文章给大家详细分析了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

相关文章

  • layer.prompt输入层的例子

    layer.prompt输入层的例子

    今天小编就为大家分享一篇layer.prompt输入层的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • javascript 循环调用示例介绍

    javascript 循环调用示例介绍

    循环调用,如果已经获取到了结果,则退出循环,下面有个不错的示例,感兴趣的朋友可以尝试操作下
    2013-11-11
  • JavaScript 一行代码,轻松搞定浮动快捷留言-V2升级版

    JavaScript 一行代码,轻松搞定浮动快捷留言-V2升级版

    前天熬了大半宿发了一篇[一行代码轻松搞定快捷留言功能],同时发布了V1.0beta版的快捷留言功能和源代码,之所以是beta版,就是当时感觉虽然基本功能有了,但是还不够完善,特性也不一定合理
    2010-04-04
  • JavaScript函数定义的常见注意事项小结

    JavaScript函数定义的常见注意事项小结

    这篇文章主要介绍了JavaScript函数定义的常见注意事项,包含了常见的错误及注意事项,需要的朋友可以参考下
    2014-09-09
  • JS去掉字符串末尾的标点符号及删除最后一个字符的方法

    JS去掉字符串末尾的标点符号及删除最后一个字符的方法

    这篇文章主要介绍了JS去掉字符串末尾的标点符号及删除最后一个字符的方法,需要的朋友可以参考下
    2017-10-10
  • js生成二维码的示例代码

    js生成二维码的示例代码

    这篇文章主要介绍了js生成二维码的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • JavaScript中“+”的陷阱深刻理解

    JavaScript中“+”的陷阱深刻理解

    本文将详细介绍JavaScript中“+”的一些错误应用,需要的朋友可以参考下
    2012-12-12
  • 十分钟教你上手ES2020新特性

    十分钟教你上手ES2020新特性

    这篇文章主要介绍了十分钟教你上手ES2020新特性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • ajax请求get与post的区别总结

    ajax请求get与post的区别总结

    本篇文章是对ajax请求get与post的区别进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-11-11
  • JavaScript实现留言板案例

    JavaScript实现留言板案例

    这篇文章主要为大家详细介绍了JavaScript实现留言板案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03

最新评论