如何在Flutter中实现卡牌向另一卡牌移动的动画效果?
实现卡牌向目标卡牌移动的动画效果
要实现你视频里展示的卡牌移动动画,核心就是让卡牌元素从当前位置平滑过渡到目标卡牌的坐标位置,下面给你两种实用的实现方案:
方案1:纯CSS+原生JS(轻量简单)
适合不需要复杂动画控制的场景,用CSS过渡配合JS修改位置:
- 先给移动卡牌设置基础样式:
.moving-card { position: absolute; transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1); /* 用贝塞尔曲线让动画更顺滑 */ z-index: 10; /* 确保移动时不被其他卡牌遮挡 */ } .card-container { position: relative; /* 作为移动卡牌的定位父容器 */ }
- 编写JS触发逻辑(比如点击卡牌时触发):
// 获取元素 const movingCard = document.querySelector('.moving-card'); const targetCard = document.querySelector('.target-card'); const container = document.querySelector('.card-container'); // 点击移动卡牌触发动画 movingCard.addEventListener('click', () => { // 获取目标卡牌相对于容器的位置 const targetRect = targetCard.getBoundingClientRect(); const containerRect = container.getBoundingClientRect(); // 计算目标坐标(相对于容器) const targetX = targetRect.left - containerRect.left; const targetY = targetRect.top - containerRect.top; // 设置移动卡牌的目标位置 movingCard.style.left = `${targetX}px`; movingCard.style.top = `${targetY}px`; });
方案2:用GSAP动画库(精细控制)
如果需要更复杂的动画效果(比如路径曲线、中途变速、回调逻辑),GSAP是个不错的选择:
- 引入GSAP(直接用CDN)
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.2/dist/gsap.min.js"></script>
- 编写动画代码:
const movingCard = document.querySelector('.moving-card'); const targetCard = document.querySelector('.target-card'); // 触发动画(比如点击目标卡牌) targetCard.addEventListener('click', () => { // 获取目标卡牌的位置 const targetPos = { x: targetCard.offsetLeft, y: targetCard.offsetTop }; // 执行移动动画 gsap.to(movingCard, { x: targetPos.x, y: targetPos.y, duration: 0.6, ease: 'power2.out', onComplete: () => { // 动画完成后可以做的事,比如合并卡牌、隐藏移动卡牌 movingCard.style.display = 'none'; } }); });
关键注意点
- 坐标计算要注意容器的定位方式,避免出现偏移问题;
- 移动卡牌的
position必须设为absolute或fixed才能修改left/top; - 如果页面有滚动,要加上滚动偏移量的计算,避免动画位置错误。
内容的提问来源于stack exchange,提问作者Yassine Mih
相关产品推荐
相关产品推荐

