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 相关文章推荐
JQuery onload、ready概念介绍及使用方法
Apr 27 Javascript
js兼容的placeholder属性详解
Aug 18 Javascript
jQuery之选项卡的简单实现
Feb 28 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
Sep 07 Javascript
jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题
May 31 Javascript
Backbone中View之间传值的学习心得
Aug 09 Javascript
三种方式实现瀑布流布局
Feb 10 Javascript
JS正则验证多个邮箱完整实例【邮箱用分号隔开】
Apr 19 Javascript
详解Angular中通过$location获取地址栏的参数
Aug 02 Javascript
vuex 实现getter值赋值给vue组件里的data示例
Nov 05 Javascript
JavaScript如何实现图片处理与合成
May 29 Javascript
详解webpack的clean-webpack-plugin插件报错
Oct 16 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简单静态页生成过程
2008/03/27 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
php伪静态之APACHE篇
2014/06/02 PHP
php筛选不存在的图片资源
2015/04/28 PHP
PHP快速排序quicksort实例详解
2016/09/28 PHP
关于PHP中字符串与多进制转换函数的实例代码
2016/11/03 PHP
php7 新增功能实例总结
2020/05/25 PHP
js同时按下两个方向键
2007/12/01 Javascript
window.onload和$(function(){})的区别介绍
2013/10/30 Javascript
JS正则表达式大全(整理详细且实用)
2013/11/14 Javascript
jQuery中bind,live,delegate与one方法的用法及区别解析
2013/12/30 Javascript
js实现div层缓慢收缩与展开的方法
2015/05/11 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
原生js和jQuery实现淡入淡出轮播效果
2015/12/25 Javascript
Angular2从搭建环境到开发步骤详解
2016/10/17 Javascript
js实现日历与定时器
2017/02/22 Javascript
原生JS实现N级菜单的代码
2017/05/21 Javascript
详解AngularJS用Interceptors来统一处理HTTP请求和响应
2017/06/08 Javascript
js学习心得_一个简单的动画库封装tween.js
2017/07/14 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
BootStrap TreeView使用实例详解
2017/11/01 Javascript
jquery中有哪些api jQuery主要API
2017/11/20 jQuery
基于vue实现一个神奇的动态按钮效果
2019/05/15 Javascript
[02:33]2018DOTA2亚洲邀请赛赛前采访——LGD
2018/04/04 DOTA
Centos7 下安装最新的python3.8
2019/10/28 Python
python应用Axes3D绘图(批量梯度下降算法)
2020/03/25 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
2020/06/04 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
SQL注入攻击的种类有哪些
2013/12/30 面试题
房屋维修协议书范本
2014/09/25 职场文书
具结保证书范本
2015/05/11 职场文书
汤姆索亚历险记读书笔记
2015/06/29 职场文书
公司团队口号霸气押韵
2015/12/24 职场文书
咖啡厅里的创业计划书
2019/08/21 职场文书
python超详细实现完整学生成绩管理系统
2022/03/17 Python
Python os和os.path模块详情
2022/04/02 Python