
本文介绍在鼠标移动事件中动态切换预览图片时,如何避免重复为 元素设置相同 src,从而防止不必要的资源加载和潜在的闪烁问题。核心方法是通过比对当前 img.src 与目标 URL 是否一致来实现条件赋值。
本文介绍在鼠标移动事件中动态切换预览图片时,如何避免重复为 `` 元素设置相同 `src`,从而防止不必要的资源加载和潜在的闪烁问题。核心方法是通过比对当前 `img.src` 与目标 url 是否一致来实现条件赋值。
在你当前的代码中,onMove 事件每帧触发(尤其在快速移入按钮区域时),导致 img.src 被反复赋值为同一个 URL。即使值未变,浏览器仍会触发一次新的资源加载尝试(尤其在开发工具 Network 面板中可见重复请求),可能引发图片重绘、闪烁或性能浪费。
✅ 正确做法是:仅当目标 src 与当前 img.src 不同时才更新。注意,img.src 返回的是解析后的绝对 URL(如 http://localhost:3000/dist/img/1.jpg),而 el.dataset.src 是相对路径(如 ./dist/img/1.jpg)。直接比较二者可能因协议、域名、路径格式不同而始终为 false,导致误判。
推荐使用以下健壮写法:
onMove(e) {
const el = e.target;
if (el.type === 'button') {
const img = tail.querySelector('img');
// 使用 dataset.src 与 img.currentSrc 对比(currentSrc 更可靠,反映实际加载源)
if (img.currentSrc !== el.dataset.src) {
img.src = el.dataset.src;
}
}
gsap.to(tail, {
x: e.clientX,
y: e.clientY,
duration: 0.05 // 建议添加轻量动画缓动,提升跟随平滑度
});
}? 关键说明:
-
img.currentSrc返回浏览器当前实际加载或准备加载的 URL(优先级高于src),且在未加载时为空字符串,适合用于“是否已加载该图”的判断; - 若需严格匹配原始路径(如服务端路径一致性要求),可统一标准化路径(例如用
new URL(el.dataset.src, location).href构建绝对地址再比较),但多数场景下currentSrc已足够; - 补充
duration: 0.05可避免 GSAP 瞬时定位带来的抖动,提升视觉体验。
⚠️ 注意事项:
- 确保
img元素在onEnter中创建后始终存在,否则tail.querySelector('img')可能返回null,需加空值校验; - 若支持多图预加载或懒加载,建议配合
loading="lazy"或decoding="async"属性优化性能; - 在高频
mousemove场景下,也可考虑节流(throttle)onMove,但本例中仅做src比较开销极低,通常无需额外节流。
总结:防止 img.src 重复设置的本质是「状态感知 + 条件更新」。通过 currentSrc 判断真实加载状态,而非依赖原始 dataset 值,即可兼顾准确性、兼容性与性能。

















