You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React实现商品飞入购物车动画 jQuery代码转React方案

React 实现飞入购物车动画

实现思路

完全对齐原jQuery示例的交互,用原生API实现,不需要引入jQuery或第三方动画库,符合React开发规范:

  • 点击加购按钮时,先获取当前商品图片在视口里的位置
  • 生成一个临时克隆的图片节点,固定定位在原图片位置,z-index调到最高不被其他元素遮挡
  • 给克隆节点加CSS过渡,移动到购物车图标位置的同时把宽高缩到0
  • 动画结束后删掉临时节点,同步更新购物车的金额、数量状态

代码修改步骤

1. 补充引入的Hook

把原来react的引入行替换成下面的,加useRef用来拿DOM元素位置:

import React, { useState, useRef } from 'react';

2. 给图片容器绑定ref

在组件里isHovering状态声明的下方,加ref声明:

const productImgWrapRef = useRef(null);

找到类名为styles.imageContainer的div标签,加上ref属性:

<div className={styles.imageContainer} ref={productImgWrapRef}>

3. 补全addToCartAnimation方法

提前给页面里的购物车图标元素加固定id cart-icon方便定位,方法代码如下:

const addToCartAnimation = () => {
  const originEl = productImgWrapRef.current;
  const cartEl = document.getElementById('cart-icon');
  if (!originEl || !cartEl) return;

  // 获取原图片和购物车的视口坐标
  const originRect = originEl.getBoundingClientRect();
  const cartRect = cartEl.getBoundingClientRect();

  // 创建克隆的临时图片节点
  const cloneImg = document.createElement('img');
  cloneImg.src = originEl.querySelector('img').src;
  // 初始位置和原图片完全重合
  cloneImg.style.cssText = `
    position: fixed;
    z-index: 9999;
    left: ${originRect.left}px;
    top: ${originRect.top}px;
    width: ${originRect.width}px;
    height: ${originRect.height}px;
    object-fit: cover;
    border-radius: 4px;
    transition: all 800ms ease-in-out;
    pointer-events: none;
  `;
  document.body.appendChild(cloneImg);

  // 触发重绘保证动画正常执行
  cloneImg.getBoundingClientRect();

  // 动画终点:移动到购物车位置,缩小到0
  cloneImg.style.left = `${cartRect.left}px`;
  cloneImg.style.top = `${cartRect.top}px`;
  cloneImg.style.width = '0px';
  cloneImg.style.height = '0px';
  cloneImg.style.opacity = '0';

  // 动画结束后清理临时节点,更新购物车状态
  setTimeout(() => {
    cloneImg.remove();
    // 此处替换为你项目里的购物车更新逻辑:累加价格、加商品数量即可
  }, 800);
}

补充说明

  • 临时克隆的节点是直接挂在body下的,动画完就删除,不会干扰React虚拟DOM的渲染逻辑,不存在冲突问题
  • 如果不方便给购物车加id,也可以用class选择器获取元素,和原jQuery写法逻辑一致,只是id选择器的匹配效率更高
  • 过渡的缓动效果可以根据项目UI风格自行调整,800ms的动画时长和原jQuery示例完全一致

内容的提问来源于stack exchange,提问作者Jolan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 14:27:34