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

如何让已加载的Animated WEBP动画从开头重新播放?

问题:Animated WEBP背景图重新显示时无法从头播放

问题详情

  • 使用jQuery开发,初始加载Animated WEBP作为DIV背景图时,动画可正常从头循环播放
  • 移除CSS类隐藏图片后,动画仍在后台持续运行
  • 再次添加类显示图片时,动画从之前的进度继续播放,无法从头开始

现有方案的弊端

目前可行的方案是给图片URL添加随机参数,但这会触发图片重新加载——页面中包含大量约1MB的Animated WEBP图,对网络较慢的用户体验极差。

需求

寻求无需重新加载、不依赖复杂第三方插件的方案,复用已加载的图片资源,让动画从头播放。

尝试过的无效代码

let promise = this.load_image('/images/' + image_url, img);

promise.then((res) => {
    this.loaded(); // 显示图片
});

load_image: async function(url, elem)
{
    return new Promise((resolve, reject) => {
        elem.onload = () => resolve(elem);
        elem.onerror = reject;
        elem.src = url;
    });
}

解决方案

以下几种方法均无需重新请求服务器,直接复用浏览器缓存的图片资源:

1. 克隆已加载的Image实例

如果已经预加载了Image对象,克隆它即可得到一个全新的实例,其动画会从头开始播放:

// 假设img是已预加载完成的Image实例
const clonedImg = img.cloneNode(true);
// 将克隆后的图片作为DIV背景图
$('.your-target-div').css('background-image', `url(${clonedImg.src})`);

克隆操作不会触发新的网络请求,浏览器会直接复用缓存的图片数据,同时新实例的动画状态会被重置。

2. 临时重置图片src(利用缓存)

通过临时将图片src设置为空白GIF,再还原为原URL的方式,触发动画重置:

function restartWebpAnimation(imgUrl, targetSelector) {
  const tempImg = new Image();
  tempImg.onload = () => {
    $(targetSelector).css('background-image', `url(${imgUrl})`);
  };
  // 先加载极小的空白GIF,触发状态重置
  tempImg.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAMLCwgAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==';
  // 短暂延迟后还原原URL(从缓存读取)
  setTimeout(() => {
    tempImg.src = imgUrl;
  }, 10);
}

// 使用示例
restartWebpAnimation('/images/your-animate.webp', '.target-div');

空白GIF体积可以忽略不计,原WEBP会直接从浏览器缓存读取,不会产生新的网络请求。

3. CSS动画替代(适合简单场景)

如果WEBP动画逻辑简单,可将其转为CSS关键帧动画,通过重置动画状态实现从头播放:

/* 模拟WEBP动画的关键帧(根据实际动画调整) */
@keyframes webp-loop {
  0% { background-position: 0 0; }
  100% { background-position: -1200px 0; }
}

.target-div {
  background-image: url('your-animate.webp');
  animation: webp-loop 1.5s infinite steps(12);
}

/* 隐藏时暂停动画 */
.target-div.hidden {
  animation-play-state: paused;
}

显示图片时重置动画:

$('.target-div').removeClass('hidden').css('animation', 'none');
// 短暂延迟后重新启用动画,触发从头播放
setTimeout(() => {
  $('.target-div').css('animation', 'webp-loop 1.5s infinite steps(12)');
}, 10);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:52:43