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制作的放大效果的popup对话框(未添加任何jquery plugin)分享
Apr 28 Javascript
js判断ie版本号的简单实现代码
Mar 05 Javascript
JS实现模拟风力的雪花飘落效果
May 13 Javascript
javascript字符串与数组转换汇总
May 26 Javascript
easyUI实现(alert)提示框自动关闭的实例代码
Nov 07 Javascript
Angular.js实现注册系统的实例详解
Dec 18 Javascript
Angular4 中内置指令的基本用法
Jul 31 Javascript
vue弹窗消息组件的使用方法
Sep 24 Javascript
js中实例与对象的区别讲解
Jan 21 Javascript
回顾Javascript React基础
Jun 15 Javascript
LayUi使用switch开关,动态的去控制它是否被启用的方法
Sep 21 Javascript
vue+elementUI组件table实现前端分页功能
Nov 15 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
我的论坛源代码(一)
2006/10/09 PHP
用PHP+java实现自动新闻滚动窗口
2006/10/09 PHP
PHP+MYSQL实现用户的增删改查
2015/03/24 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
php 中phar包的使用教程详解
2018/10/26 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
Array.slice()与Array.splice()的返回值类型
2006/10/09 Javascript
EXTJS记事本 当CompositeField遇上RowEditor
2011/07/31 Javascript
JS 无限级 Select效果实现代码(json格式)
2011/08/30 Javascript
自己写的兼容ie和ff的在线文本编辑器类似ewebeditor
2012/12/12 Javascript
PHP开发者必须掌握的6个关键字
2014/04/14 Javascript
微信小程序 http请求详细介绍
2016/10/09 Javascript
jQuery中$.ajax()方法参数解析
2016/10/22 Javascript
JS对象深度克隆实例分析
2017/03/16 Javascript
vue实现导航栏效果(选中状态刷新不消失)
2017/12/13 Javascript
React styled-components设置组件属性的方法
2018/08/07 Javascript
js实现图片无缝循环轮播
2019/10/28 Javascript
Vue检测屏幕变化来改变不同的charts样式实例
2020/10/26 Javascript
[02:51]DOTA2 2015国际邀请赛中国区预选赛第一日战报
2015/05/27 DOTA
Python爬取qq music中的音乐url及批量下载
2017/03/23 Python
python实现从pdf文件中提取文本,并自动翻译的方法
2018/11/28 Python
Python 一句话生成字母表的方法
2019/01/02 Python
python利用百度云接口实现车牌识别的示例
2020/02/21 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
2020/09/29 Python
用pushplus+python监控亚马逊到货动态推送微信
2021/01/29 Python
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
Unix里面如何在后台运行程序
2016/10/14 面试题
鲜果饮品店创业计划书
2014/01/21 职场文书
研修第一天随笔感言
2014/02/15 职场文书
供货协议书范本
2014/04/22 职场文书
领导班子在批评与自我批评座谈会上的发言
2014/09/28 职场文书
2015年春训学习心得体会范文
2015/03/09 职场文书
销售员自我评价
2015/03/11 职场文书
mysql timestamp比较查询遇到的坑及解决
2021/11/27 MySQL
JS前端轻量fabric.js系列物体基类
2022/08/05 Javascript