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

React中动画完成后无法触发卡片hover缩放效果求助

问题分析与解决方案

你的问题核心是CSS入场动画结束后,hover时的缩放效果被动画的transform状态覆盖——CSS动画的优先级高于普通hover伪类规则,若动画设置了fill-mode: forwards,会锁定transform属性,导致后续hover变换无法生效。

解决方案1:修改hover的transform为组合值

将自定义CSS中的.card:hover规则调整为同时保留入场后的平移状态与缩放效果,直接覆盖动画的transform值:

.card:hover {
  transform: translateX(0) scale(1.1); /* 组合平移与缩放,确保覆盖动画状态 */
}

解决方案2:改用Tailwind过渡类实现入场动画(推荐)

放弃CSS @keyframes,改用Tailwind的过渡类实现入场效果,彻底避免动画优先级冲突:

  1. 调整卡片初始className:
<div
  key={index}
  className="card bg-cover bg-center bg-no-repeat rounded-lg w-64 h-96 md:w-72 md:h-[28rem] lg:w-80 lg:h-[32rem] opacity-0 -translate-x-20 transition-all duration-800 ease-in-out hover:scale-110"
  style={{ backgroundImage: `url(${card.imageUrl})` }}
>
  <div className="text-white p-4">
    <h3 className="text-lg font-bold">{card.text}</h3>
  </div>
</div>
  1. 通过JS监听滚动触发入场(实现依次出现效果):
// 示例:使用IntersectionObserver监听区域可见性
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      entry.target.querySelectorAll('.card').forEach((card, idx) => {
        setTimeout(() => {
          card.classList.remove('opacity-0', '-translate-x-20');
          card.classList.add('opacity-1', 'translate-x-0');
        }, idx * 200); // 依次入场的延迟时间
      });
    }
  });
});

if (sectionRef.current) observer.observe(sectionRef.current);

这种方式通过类切换实现入场,动画结束后无锁定状态,Tailwind的hover:scale-110可正常生效。

额外注意点

  • 若坚持使用CSS @keyframes,动画结束后要移除动画类,避免其优先级持续压制hover规则;
  • 不要同时混用Tailwind hover类与自定义CSS hover规则,防止样式冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 12:42:03