• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

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

    发布者: 雪落无声 | 发布时间: 2025-6-16 12:32| 查看数: 32| 评论数: 0|帖子模式

    前言:最近有朋友在做小程序的过程中,遇到开发过飞入购物车效果的功能的需求。针对这个情况一些网上的demo,多少会有一些不符合情景的问题(bug)存在,针对这一情况小编决定帮朋友写一个方案来帮助解决问题。
    思考如果实现 ? 超级简单的!
    无论是小程序还是h5飞入购物车无非就是 平抛 ,或者是 上抛 两种情况,对于这两种情况,初中就开始学习抛物线理论知识是完全可以搞定的,高中一年级物理学的自由落体运动,平抛运动就是抛物线理论的具体实现。
    平抛运动


    上抛运动

    构建虚拟直角坐标系,抛物线绘制轨迹点
    此方案的本质就是,根据购物车起点和终点,分别做为抛物线的两点,这样一个感念就是要以起始点作为直角坐标系(0,0)方便后续其他坐标点的运算。还有一个应该注意的是,如果是配置了上抛h偏移量 ,就要求最高点(顶点)坐标 此方案均适合 H5 ,小程序
    1. /**
    2. * 飞入购物车,轨迹点绘制
    3. * @author  👽
    4. * @param {Array} start`在这里插入代码片`Point 起点clientX, clientY值 (必要)
    5. * @param {Array} endPoint   终点clientX, clientY值 (必要)
    6. * @param {number} point     点数          (必要)
    7. * @param {number} h         抛物线向上高度(上抛运动)  (可选)
    8. * @param {number} hclientX  当存在h情况下,达到最高点时候的clientX值
    9. * @return {Array}  [ left ,top ] 值组成的数组
    10. */
    11. function flycart(startPoint, endPoint, point, h = 0, hclientX) {
    12.    /*
    13.    设置startPoint 为(0,0)点 , 此抛物线经过(0,0)点 ,可以推到出模型关系式 y =  ax^2 + bx 或者 y = ax^ 2
    14.    1 当存在 h 的情况,抛物线会y轴向上偏移 h, 此时的关系式 y = ax^2 + bx
    15.    2 当不存在h 的情况 ,抛物线startPoint为顶点, 此时关系式 y = ax^2
    16.    */

    17.    /* 参数校验 */
    18.    function Validityparameter() {
    19.        let isOkey = true
    20.        Array.isArray(startPoint) && startPoint.length !== 2 && (isOkey = false)
    21.        Array.isArray(endPoint) && endPoint.length !== 2 && (isOkey = false)
    22.            (point.constructor !== Number) && (isOkey = false)
    23.        return isOkey
    24.    }

    25.    /* 参数验证 */
    26.    if (!Validityparameter()) {
    27.        return []
    28.    }

    29.    /* A点横坐标 */
    30.    const xA = 0
    31.    /* A点纵坐标 */
    32.    const yA = 0
    33.    /* x轴偏移量 */
    34.    const offsetX = startPoint[0]
    35.    /* y轴偏移量 */
    36.    const offsetY = startPoint[1]
    37.    /* B点横坐标 */
    38.    const xB = endPoint[0] - offsetX
    39.    /* B纵坐标 */
    40.    const yB = endPoint[1] - offsetY

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

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


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

    66.    /* 处理直线运动 */
    67.    function handerLinearMotion(type) {
    68.        if (type === 'X') {
    69.            const averageY = (yB - yA) / point
    70.            for (let i = 1; i <= point; i++) {
    71.                travelList.push([offsetX, i * averageY + offsetY])
    72.            }
    73.        } else {
    74.            for (let i = 1; i <= point; i++) {
    75.                travelList.push([offsetX + i * averageX, offsetY])
    76.            }
    77.        }
    78.        return travelList
    79.    }

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

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

    95.    return travelList
    96. }

    97. export default flycart
    复制代码
    效果

    小程序h5飞入购物车组件?
    这里可以把这个方案和组件联系到一起,于是乎飞入购物车组件就搞定了,这里大家要记住的点
    1此方案得到的是抛物线各点的left,top值,我们只需要定时改变飞入购物车的图片的left值 ,top就可以 2可以通过计数器功能来改变缩放比,说白了就是改变图片transform:scale值 3不要忘记给图片加上fixed固定定位哦:smile::smile::smile: 主要demo方法(仅供参考)
    1. startCart(){
    2.     /* 开启购物车 */
    3.     /* this.start 储存起始点 clientY clientY  ,this.end储存最终点 clientX clientY*/
    4.     this.start = {}
    5.     this.start['x'] = this.data.current['x']
    6.     this.start['y'] = this.data.current['y']
    7.     const travelList = flycart([ this.start['x'] , this.start['y'] ] ,[ this.end['x'] , this.end['y'] ],25,50 )
    8.     this.startAnimate(travelList)
    9.         },
    10. startAnimate(travelList) {
    11.     let index = 0
    12.     this.setData({
    13.         cartHidden: false,
    14.         bus_x: this.start['x'],
    15.         bus_y: this.start['y']
    16.     })
    17.     if(travelList.length===0) return
    18.     this.timer = setInterval( ()=> {
    19.         index++
    20.         const currentPoint = travelList.shift()
    21.         this.setData({
    22.             bus_x: currentPoint[0],
    23.             bus_y: currentPoint[1],
    24.             scale: 1 - index / 25
    25.         })
    26.         if (travelList.length === 0) {
    27.             clearInterval(this.timer)
    28.             this.triggerEvent('close')
    29.         }
    30.     }, 33)
    31. }
    复制代码
    这里只做了 原生小程序飞入购物车组件 ,h5大致差别不大。
    git地址如下
    代码地址https://github.com/AlienZhaolin/flycart
    到此这篇关于html5小程序飞入购物车(抛物线绘制运动轨迹点)的文章就介绍到这了,更多相关html5飞入购物车内容请搜索脚本之家以前的文章或继续浏览下面的相关文章,希望大家以后多多支持脚本之家!

    来源:https://www.jb51.net/html5/748832.html
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表