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 dom 操作详解 js加强
Jul 13 Javascript
用Javascript 获取页面元素的位置的代码
Sep 25 Javascript
js/jquery判断浏览器的方法小结
Sep 02 Javascript
CSS3实现动态背景登录框的代码
Jul 28 Javascript
Javascript的表单验证-初识正则表达式
Mar 18 Javascript
JavaScript简单拖拽效果(1)
May 17 Javascript
Vue2.0用户权限控制解决方案的示例
Feb 10 Javascript
ES6知识点整理之函数对象参数默认值及其解构应用示例
Apr 17 Javascript
浅谈 Webpack 如何处理图片(开发、打包、优化)
May 15 Javascript
详解一次Vue低版本安卓白屏问题的解决过程
May 30 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
Oct 17 Javascript
vue + elementUI实现省市县三级联动的方法示例
Oct 29 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 中文和编码判断代码
2010/05/16 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
PHP屏蔽关键字实现方法
2016/11/17 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
2017/10/11 PHP
PHP实现的文件浏览器功能简单示例
2019/09/12 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
事件模型在各浏览器中存在差异
2010/10/20 Javascript
腾讯UED 漂亮的提示信息效果代码
2011/09/12 Javascript
javaScript数组迭代方法详解
2016/04/14 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
vue引入新版 vue-awesome-swiper插件填坑问题
2018/01/25 Javascript
vue的安装及element组件的安装方法
2018/03/09 Javascript
layui实现数据表格点击搜索功能
2020/03/26 Javascript
利用JS响应式修改vue实现页面的input值
2019/09/02 Javascript
微信小程序如何实现在线客服功能
2019/10/16 Javascript
K-近邻算法的python实现代码分享
2017/12/09 Python
python抖音表白程序源代码
2019/04/07 Python
详解10个可以快速用Python进行数据分析的小技巧
2019/06/24 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
2019/08/12 Python
Python流程控制语句的深入讲解
2020/06/15 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
2020/07/13 Python
vscode+PyQt5安装详解步骤
2020/08/12 Python
北美领先的牛仔品牌:Buffalo David Bitton
2017/05/22 全球购物
高分子材料与工程专业推荐信
2013/12/01 职场文书
顶撞领导检讨书
2014/01/29 职场文书
中文专业学生自我评价范文
2014/02/06 职场文书
师说教学反思
2014/02/07 职场文书
《再见了,亲人》教学反思
2014/02/26 职场文书
小学生寒假家长评语
2014/04/16 职场文书
比赛口号大全
2014/06/10 职场文书
节电标语大全
2014/06/23 职场文书
教师个人工作总结范文2015
2015/10/14 职场文书
奶茶店的创业计划书该怎么写?
2019/07/15 职场文书
2019最新版劳务派遣管理制度
2019/08/16 职场文书
python 用递归实现通用爬虫解析器
2021/04/16 Python
实操Python爬取觅知网素材图片示例
2021/11/27 Python