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

为何JavaScript的mouseleave在图片间滑动时无法恢复原图?

原生JavaScript实现图片悬停切换

我一直在找原生JS实现图片悬停切换的示例——鼠标悬停时显示第二张图,离开时恢复原图。自己搭了个示例,顶部标题的mouseover/mouseleave逻辑正常,但下方两张图片的功能出了问题。

之前试过一种不太理想的方案:通过修改容器的innerHTML替换图片,但这种方式会重新创建<img>元素,容易出现视觉闪烁或事件异常。而且已有jQuery的可行方案,但我只想用原生JS解决。

下面是正确的原生JS实现方案:

HTML

<h4 id="myH4">Original Header</h4>

<!-- 用data属性存储原始图和悬停图地址 -->
<div class="img-container" data-original="https://comic.browserling.com/bytes.png" data-hover="https://blog.codepen.io/wp-content/themes/codepen/images/codepen-logo-midgray.svg">
  <img src="https://comic.browserling.com/bytes.png" alt="" />
</div>

<div class="img-container" data-original="https://www.thecoderpedia.com/wp-content/uploads/2020/06/Programming-Memes-Programmer-while-sleeping.jpg" data-hover="https://blog.codepen.io/wp-content/themes/codepen/images/codepen-logo-midgray.svg">
  <img src="https://www.thecoderpedia.com/wp-content/uploads/2020/06/Programming-Memes-Programmer-while-sleeping.jpg" alt="" />
</div>

JavaScript

// 批量处理所有图片容器
const imgContainers = document.querySelectorAll('.img-container');
imgContainers.forEach(container => {
  const img = container.querySelector('img');
  // 从data属性获取图片地址
  const originalSrc = container.dataset.original;
  const hoverSrc = container.dataset.hover;

  // 绑定悬停事件
  container.addEventListener('mouseover', () => {
    img.src = hoverSrc;
  });

  container.addEventListener('mouseleave', () => {
    img.src = originalSrc;
  });
});

// 保留原有标题交互逻辑
const header = document.querySelector('#myH4');
header.style = "background-color: lightgreen; text-align:center;";

header.addEventListener('mouseover', () => {
  header.textContent = 'Mouse Over';
});
header.addEventListener('mousedown', () => {
  header.textContent = 'Mouse Down';
});
header.addEventListener('mouseleave', resetHeader);
header.addEventListener('mouseup', resetHeader);

function resetHeader() {
  header.textContent = "Original Header";
}

为什么这个方案更好

  • 直接修改<img>的src属性,不会重新创建DOM元素,避免闪烁和事件丢失问题
  • 用data-*属性管理图片地址,代码更清晰,后续新增图片只需复制容器结构修改地址即可
  • 批量绑定事件,代码更简洁高效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:35:28