html5小程序飞入购物车(抛物线绘制运动轨迹点)


Posted in HTML / CSS onOctober 19, 2020

前言:最近有朋友在做小程序的过程中,遇到开发过飞入购物车效果的功能的需求。针对这个情况一些网上的demo,多少会有一些不符合情景的问题(bug)存在,针对这一情况小编决定帮朋友写一个方案来帮助解决问题。

思考如果实现 ? 超级简单的!

无论是小程序还是h5飞入购物车无非就是 平抛 ,或者是 上抛 两种情况,对于这两种情况,初中就开始学习抛物线理论知识是完全可以搞定的,高中一年级物理学的自由落体运动,平抛运动就是抛物线理论的具体实现。

平抛运动

html5小程序飞入购物车(抛物线绘制运动轨迹点)

上抛运动

html5小程序飞入购物车(抛物线绘制运动轨迹点)

构建虚拟直角坐标系,抛物线绘制轨迹点

此方案的本质就是,根据购物车起点和终点,分别做为抛物线的两点,这样一个感念就是要以起始点作为直角坐标系(0,0)方便后续其他坐标点的运算。还有一个应该注意的是,如果是配置了上抛h偏移量 ,就要求最高点(顶点)坐标 此方案均适合 H5 ,小程序

/**
* 飞入购物车,轨迹点绘制
* @author  ?
* @param {Array} start`在这里插入代码片`Point 起点clientX, clientY值 (必要) 
* @param {Array} endPoint   终点clientX, clientY值 (必要)
* @param {number} point     点数          (必要) 
* @param {number} h         抛物线向上高度(上抛运动)  (可选)
* @param {number} hclientX  当存在h情况下,达到最高点时候的clientX值
* @return {Array}  [ left ,top ] 值组成的数组
*/
function flycart(startPoint, endPoint, point, h = 0, hclientX) {
   /* 
   设置startPoint 为(0,0)点 , 此抛物线经过(0,0)点 ,可以推到出模型关系式 y =  ax^2 + bx 或者 y = ax^ 2
   1 当存在 h 的情况,抛物线会y轴向上偏移 h, 此时的关系式 y = ax^2 + bx
   2 当不存在h 的情况 ,抛物线startPoint为顶点, 此时关系式 y = ax^2 
   */

   /* 参数校验 */
   function Validityparameter() {
       let isOkey = true
       Array.isArray(startPoint) && startPoint.length !== 2 && (isOkey = false)
       Array.isArray(endPoint) && endPoint.length !== 2 && (isOkey = false)
           (point.constructor !== Number) && (isOkey = false)
       return isOkey
   }

   /* 参数验证 */
   if (!Validityparameter()) {
       return []
   }

   /* A点横坐标 */
   const xA = 0
   /* A点纵坐标 */
   const yA = 0
   /* x轴偏移量 */
   const offsetX = startPoint[0]
   /* y轴偏移量 */
   const offsetY = startPoint[1]
   /* B点横坐标 */
   const xB = endPoint[0] - offsetX
   /* B纵坐标 */
   const yB = endPoint[1] - offsetY

   /* 根据B点坐标和最大高度h求系数a,b 参数*/
   let b = 0
   let a = 0

   /* 计算系数 a ,b */
   function handerComputer() {
       if (h < 10) {
           a = yB / Math.pow(xB, 2)
       } else {
           /* 因为一般购物车的情况都是向下,实际上我们购物车的坐标系是反向的,所以我们这里要把h 设置成负值 */
           h = -h
           /* 一元二次求解a,b ,现在知道一点  ( xB , yB ) 另外一点 ( maxHx,h )  */
           /* 有效达到最高点时候的x坐标 */
           const effectMaHx = hclientX && Math.abs(hclientX - offsetX) > 0 && Math.abs(hclientX - offsetX) < Math.abs(xB)
           /* 如果hclientX不满足要求,则选A , B 中点为   */
           let maxHx = effectMaHx ? (hclientX - offsetX) : (xB + xA) / 2
           /* 已知两点 求 a , b值  根据解方程式解得 y = ax^2 + bx  */
           a = ((yB / xB) - (h / maxHx)) / (xB - maxHx)
           /* 将 a 带入其中一个求解 b */
           b = (yB - a * Math.pow(xB, 2)) / xB
       }
   }


   /* 轨迹数组 */
   const travelList = []
   /* x 均等分 */
   const averageX = (xB - xA) / point

   /* 处理直线运动 */
   function handerLinearMotion(type) {
       if (type === 'X') {
           const averageY = (yB - yA) / point
           for (let i = 1; i <= point; i++) {
               travelList.push([offsetX, i * averageY + offsetY])
           }
       } else {
           for (let i = 1; i <= point; i++) {
               travelList.push([offsetX + i * averageX, offsetY])
           }
       }
       return travelList
   }

   /* 当 xB的绝对值小于10的情况,我们看作Y轴直线运功    */
   if (Math.abs(xB) < 10) {
       return handerLinearMotion('X')
   }
   /*当 yB的绝对值小于10的情况,我们看作x轴直线运功  */
   if (Math.abs(yB) < 10) {
       return handerLinearMotion('Y')
   }

   handerComputer()
   /* 绘制路径 */
   for (let i = 1; i <= point; i++) {
       const currentX = averageX * i
       const currentY = Math.pow(currentX, 2) * a + b * currentX - yA
       travelList.push([currentX + offsetX, currentY + offsetY])
   }

   return travelList
}

export default flycart

效果

html5小程序飞入购物车(抛物线绘制运动轨迹点)

小程序h5飞入购物车组件?

这里可以把这个方案和组件联系到一起,于是乎飞入购物车组件就搞定了,这里大家要记住的点

1此方案得到的是抛物线各点的left,top值,我们只需要定时改变飞入购物车的图片的left值 ,top就可以 2可以通过计数器功能来改变缩放比,说白了就是改变图片transform:scale值 3不要忘记给图片加上fixed固定定位哦:smile::smile::smile: 主要demo方法(仅供参考)

startCart(){
    /* 开启购物车 */
    /* this.start 储存起始点 clientY clientY  ,this.end储存最终点 clientX clientY*/
    this.start = {}
    this.start['x'] = this.data.current['x']
    this.start['y'] = this.data.current['y']
    const travelList = flycart([ this.start['x'] , this.start['y'] ] ,[ this.end['x'] , this.end['y'] ],25,50 )
    this.startAnimate(travelList)
        },
 startAnimate(travelList) {
    let index = 0
    this.setData({
        cartHidden: false,
        bus_x: this.start['x'],
        bus_y: this.start['y']
    })
    if(travelList.length===0) return
    this.timer = setInterval( ()=> {
        index++
        const currentPoint = travelList.shift()
        this.setData({
            bus_x: currentPoint[0],
            bus_y: currentPoint[1],
            scale: 1 - index / 25
        })
        if (travelList.length === 0) {
            clearInterval(this.timer)
            this.triggerEvent('close')
        }
    }, 33)
}

这里只做了 原生小程序飞入购物车组件 ,h5大致差别不大。

git地址如下

代码地址https://github.com/AlienZhaolin/flycart

到此这篇关于html5小程序飞入购物车(抛物线绘制运动轨迹点)的文章就介绍到这了,更多相关html5飞入购物车内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

HTML / CSS 相关文章推荐
7款设计巧妙的css3飘带状3D立体效果的导航菜单和表单窗口
Feb 04 HTML / CSS
使用css3实现超炫的loading加载动画效果
May 07 HTML / CSS
使用CSS3美化HTML表单的技巧演示
May 17 HTML / CSS
使用CSS3滤镜的filter:blur属性制作毛玻璃模糊效果的方法
Jul 08 HTML / CSS
css3 flex实现div内容水平垂直居中的几种方法
Mar 27 HTML / CSS
html5中去掉input type date默认样式的方法
Sep 06 HTML / CSS
html5-canvas中使用clip抠出一个区域的示例代码
May 25 HTML / CSS
html+css实现自定义图片上传按钮功能
Sep 04 HTML / CSS
HTML5的自定义属性data-*详细介绍和JS操作实例
Apr 10 HTML / CSS
HTML5中Localstorage的使用教程
Jul 09 HTML / CSS
HTML5 视频播放(video),JavaScript控制视频的实例代码
Oct 08 HTML / CSS
Html5获取用户当前位置的几种方式
Jan 18 HTML / CSS
app内嵌H5 webview 本地缓存问题的解决
Oct 19 #HTML / CSS
使用HTML5做的导航条详细步骤
Oct 19 #HTML / CSS
利用Node实现HTML5离线存储的方法
Oct 16 #HTML / CSS
HTML+CSS+JavaScript实现图片3D展览的示例代码
Oct 12 #HTML / CSS
HTML5逐步分析实现拖放功能的方法
Sep 30 #HTML / CSS
移动端HTML5 input常见问题(小结)
Sep 28 #HTML / CSS
HTML5超文本标记语言的实现方法
Sep 24 #HTML / CSS
You might like
PHP实现通过get方式识别用户发送邮件的方法
2015/07/16 PHP
Thinkphp框架开发移动端接口(2)
2016/08/18 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
php使用imagecopymerge()函数创建半透明水印
2018/01/25 PHP
innerHTML 和 getElementsByName 在IE下面的bug 的解决
2010/04/09 Javascript
JavaScript 命名空间 使用介绍
2013/08/29 Javascript
简单实现nodejs上传功能
2017/01/14 NodeJs
js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前
2017/04/27 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
Vue.js项目部署到服务器的详细步骤
2017/07/17 Javascript
微信小程序实现跟随菜单效果和循环嵌套加载数据
2017/11/21 Javascript
微信小程序中吸底按钮适配iPhone X方案
2017/11/29 Javascript
对vue中v-if的常见使用方法详解
2018/09/28 Javascript
javascript canvas检测小球碰撞
2020/04/17 Javascript
[00:12]DAC2018 no[o]ne亮相SOLO赛 他是否如他的id一样无人可挡?
2018/04/06 DOTA
python类参数self使用示例
2014/02/17 Python
python通过opencv实现批量剪切图片
2017/11/13 Python
Python语言实现将图片转化为html页面
2017/12/06 Python
pytorch permute维度转换方法
2018/12/14 Python
Python中的list与tuple集合区别解析
2019/10/12 Python
通过python检测字符串的字母
2020/02/18 Python
python函数enumerate,operator和Counter使用技巧实例小结
2020/02/22 Python
pytorch判断是否cuda 判断变量类型方式
2020/06/23 Python
美国迪克体育用品商店:DICK’S Sporting Goods
2018/07/24 全球购物
Coccinelle官网:意大利的著名皮具品牌
2019/05/15 全球购物
Shopee菲律宾:在线购买和出售
2019/11/25 全球购物
毕业生造价工程师求职信
2013/10/17 职场文书
会计职业生涯规划范文
2014/01/04 职场文书
清洁工岗位职责
2014/01/29 职场文书
金融管理应届生求职信
2014/02/20 职场文书
质量保证书格式模板
2015/02/27 职场文书
关于法制教育的宣传语
2015/07/13 职场文书
教师正风肃纪心得体会
2016/01/15 职场文书
教你漂亮打印Pandas DataFrames和Series
2021/05/29 Python
详解Redis在SpringBoot工程中的综合应用
2021/10/16 Redis
阿里面试Nacos配置中心交互模型是push还是pull原理解析
2022/07/23 Java/Android