网站已运行 0 · 00小时 · 00 · 00
目录

使用gsap配合wordpress制作动画效果时,鼠标快速滑动导致动画失效问题

使用gsap配合wordpress制作动画效果时,鼠标快速滑动导致动画失效问题

如上图所示,是我使用gsap在wordpress中制作的鼠标悬停动画。

问题:

鼠标快速滑过多张图片时,按钮和文字的动画效果会失效,导致本该下滑消失的按钮依然停留在页面上。 

解决方案:

问题的本质:动画竞争(Tween Conflict)

当你快速划过时,短时间内发生以下情况:

鼠标进入 → 执行一次 .to()(进入动画)

还没播完,又触发鼠标离开 → 执行一次新的 .to()(离开动画)

GSAP 默认会让两个动画共存,同时去修改同一个属性(比如 bottom 或 opacity)

结果:

动画 A 还没播完

动画 B 把值又改了

两者互相打架,导致有时动画直接跳到终点、不播放、或者被覆盖得不完全

这就是你看到的「有时候离开动画不生效」的真正原因。
解决方式 1:overwrite: ‘auto’

GSAP 的 overwrite 参数告诉它如何处理“重复动画”:

作用
false默认,不覆盖。动画可以共存(容易冲突)
true杀掉该目标上所有旧动画(粗暴但安全)
'auto'只杀掉与新动画作用相同属性的旧动画(智能)

表示:

“如果这个元素上已经有别的动画在改 bottom,那我就中断它。”

所以当你快速 hover 时,旧动画被新动画即时接管,状态保持同步。

✅ 优点:平滑、自动
⚠️ 缺点:有时候还在同时 tween 其他属性,会被保留(但一般没问题)

🧩 解决方式 2:

gsap.killTweensOf([btn, short]);

这是一种手动清除旧动画的方式,相当于自己管理“overwrite”的逻辑。
意思是:

“在做新动画前,把这些元素上还没结束的动画全杀掉。”

这确保不会有两个 .to() 同时作用在同一目标上。

✅ 优点:彻底干净,不管它在 tween 什么属性,全部杀掉
⚠️ 缺点:太频繁使用会略微影响性能(但一般无感)。 

完整代码:

				
					const product_item = document.querySelectorAll('#s5 .product_item');

product_item.forEach((item) => {
  const btn = item.querySelector('.btn');
  const short = item.querySelector('.product_short');

  item.addEventListener('mouseenter', () => {
    gsap.killTweensOf([btn, short]);
    gsap.to(btn, { bottom: 0, duration: 0.3, overwrite: 'auto' });
    gsap.to(short, { opacity: 0, duration: 0.2, overwrite: 'auto' });
  });

  item.addEventListener('mouseleave', () => {
    gsap.killTweensOf([btn, short]);
    gsap.to(btn, { bottom: '-20%', duration: 0.2, overwrite: 'auto' });
    gsap.to(short, { opacity: 1, duration: 0.3, overwrite: 'auto' });
  });
});
				
			
Picture of SZYMWP

SZYMWP

如果你有WordPress建站方面的需求或是对文章内容有疑惑等,欢迎加我的微信

标签云:
目录
目录
标签云: