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

点击触发后播放一次thunder.gif并恢复rain.gif的实现问题

解决方法

这个问题我太熟了!你遇到的核心问题是浏览器执行代码的速度太快——刚把图片地址改成thunder.gif,立刻又替换成rain.gif,浏览器根本没来得及渲染显示闪电动图。解决思路很简单:给切回原gif的操作加个延迟,延迟时长刚好等于你的thunder.gif完整播放一遍的时间。

第一步:确定闪电动图的时长

先打开你的thunder.gif,用播放器或者在线工具查看它播放完整一次需要多久(比如是1.5秒,也就是1500毫秒),记下来这个数值。

第二步:修改你的playThunder函数

把原来的函数改成下面这样,核心是用setTimeout()延迟执行切回操作:

function playThunder() {
  // 先触发雷声音频
  startAudio();
  // 获取图片元素(提前缓存,避免重复DOM查询)
  const rainImg = document.getElementById("theImage");
  // 切换到闪电动图
  rainImg.src = "thunder.gif";
  // 延迟切回下雨动图,这里的1500替换成你实际的闪电gif时长(单位:毫秒)
  setTimeout(() => {
    rainImg.src = "rain.gif";
  }, 1500);
}

为什么这样能行?

setTimeout会告诉浏览器:“先别执行里面的代码,等指定的毫秒数过去后再执行”。这就给了thunder.gif足够的时间加载、播放完整一遍,之后才会自动切回原来的下雨动图。

可选进阶优化:防止重复触发

如果担心用户快速多次点击按钮,导致图片切换混乱,可以加个简单的“锁”机制:

// 加个状态变量,标记是否正在播放闪电效果
let isThunderPlaying = false;

function playThunder() {
  // 如果正在播放,直接返回,不执行后续操作
  if (isThunderPlaying) return;
  
  isThunderPlaying = true;
  startAudio();
  const rainImg = document.getElementById("theImage");
  rainImg.src = "thunder.gif";
  
  setTimeout(() => {
    rainImg.src = "rain.gif";
    // 播放完成后解锁,允许下次点击
    isThunderPlaying = false;
  }, 1500);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 12:37:48