淘宝加购物车动效实现,贝塞尔曲线的妙用

118 阅读2分钟

前言

在浏览京东购物时,我看到了加购物车的动效,被那种流畅的抛物线动画深深吸引,不是直线的两点动画,而是曲线的动画。

作为程序员,肯定要研究一下是怎么实现的。于是,我决定用Trae快速搭建一个类似的淘宝加购动画,让自己感受技术之美,这样自己也可以大大减少时间去开发。

效果图

image-20250827172924558

image-20250827172959814

具体的可以在线体验一下,Trae写的这个demo,看看你有没有兴趣

询问Trae

image-20250827172635195

Trae帮我新建一个文件夹,不会影响其他html页面

image-20250827172840625

Trae的实现思路

1. 位置计算

通过 getBoundingClientRect() 精确获取按钮和购物车的位置,确保动画起点和终点的准确性

2. 时间控制

使用 requestAnimationFrame 实现60fps的流畅动画,配合缓动函数让运动更加自然:

const progress = Math.min(elapsed / 
duration, 1);
const position = quadraticBezier
(progress, startPoint, 
controlPoint, endPoint);

3. 细节优化

  • 小球缩放效果:从1缩小到0.3,营造远离感
  • 透明度渐变:逐渐消失,避免突兀
  • 购物车抖动:到达时的反馈动画
  • 数字递增:购物车数量的平滑过渡

加购物车动画的灵魂在于那条优美的抛物线。Trae使用了二次贝塞尔曲线算法,通过控制点控制抛物线,实现流畅的动画效果。

// 二次贝塞尔曲线计算函数
function quadraticBezier(t, p0, p1, 
p2) {
    const x = Math.pow(1 - t, 2) * 
    p0.x + 2 * (1 - t) * t * p1.x + 
    Math.pow(t, 2) * p2.x;
    const y = Math.pow(1 - t, 2) * 
    p0.y + 2 * (1 - t) * t * p1.y + 
    Math.pow(t, 2) * p2.y;
    return { x, y };
}

这个公式让小红球从商品按钮优雅地飞向购物车,形成一条自然的抛物线轨迹。控制点的位置决定了曲线的弧度,我通过微调控制点的高度,让动画既有动感又不失优雅。

总结

通过以上步骤,我们实现了一个优雅的购物车动画效果。这个动画不仅提升了用户体验,还让页面更加生动有趣。

虽然最终看了Trae实现的代码,好像也不是很难,但是自己动手实现一遍,收获了很多。希望前端程序员看到自己好奇的东西,不要只是停留在表面,而是要自己动手,去实现它,去感受它,这也是快速成长的方法。

现在可以借助ai,例如Trae帮我们实现,然后再自己进行解读,理解它的实现原理,现在这个过程已经是大大减少时间成本,希望下次领导让你实现类似的,你可以有底气的说,10分钟就可以实现。

希望这个实现思路能对你有所帮助,如果你有任何问题或建议,欢迎随时向我提问。