import React, { useRef } from 'react';
const ProductLayout = () => {
// 添加锚点
const somebox = useRef(null);
const AnimationBall = (left, top) => {
// 生成小球
const someball = document.createElement('div');
someball.style.position = 'absolute';
someball.style.left = left - 10 + 'px';
someball.style.top = top - 10 + 'px';
someball.style.width = '20px';
someball.style.height = '20px';
someball.style.borderRadius = '50%';
someball.style.backgroundColor = 'red';
someball.style.transition = 'left .6s linear, top .6s cubic-bezier(0.5,-0.5,1,1)';
document.body.appendChild(someball);
// 使用 requestAnimationFrame 替代 setTimeout
requestAnimationFrame(() => {
someball.style.left = somebox.current.offsetLeft + somebox.current.offsetWidth / 2 + 'px';
someball.style.top = somebox.current.offsetTop + 'px';
});
someball.ontransitionend = function () {
someball.remove();
};
};
const handleAddToCart = (e) => {
const { clientX, clientY } = e;
AnimationBall(clientX, clientY);
};
return (
<div>
<div>
<button onClick={(e) => handleAddToCart(e)}
style={{ borderRadius: '5px', backgroundColor: 'rgb(243,99,61)', color: 'white', float: "right" }}
>加入购物车</button>
</div>
<div ref={somebox} style={{ position: 'fixed', bottom: '12px', right: '20px' }}>
购物车
</div>
</div>
);
};
export default ProductLayout;
React使用函数组件实现小球动画
最新推荐文章于 2024-06-21 15:55:59 发布