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

使用onMouseOver切换背景图首次触发闪白1秒的bug如何解决?

问题根源

该空白现象由图片未提前加载导致:
你只有触发onmouseover事件时才会给背景元素设置backgroundImage属性,此时浏览器才会发起对应年份获奖背景图的网络请求,请求下载的1秒左右时间就会出现空白。图片下载完成后会被浏览器本地缓存,后续再触发同一年份的悬浮操作就会直接读取缓存,不会再出现空白。刷新页面后缓存重置,问题就会复现。你提到的气泡缩放、透明度变换效果和该问题完全无关,不需要调整这部分逻辑。

解决方案

方案1:页面加载完成后预加载所有背景图

适合你当前年份范围不大(1950-2021共72张图)的场景,不需要修改原有悬浮逻辑,直接新增预加载代码即可:

// 页面加载完成后自动预加载所有年份的背景图
window.addEventListener('load', function() {
  for (let year = 1950; year <= 2021; year++) {
    // 仅创建临时Image对象触发下载,不需要插入页面DOM
    const tempImg = new Image();
    tempImg.src = `/imgs/jpg/yearswinner/${year}.jpg`;
  }
})

方案2:按需加载图片,加载完成后再替换背景

如果不想提前占用带宽加载所有图片,可修改你的onMouseOver逻辑,等目标图片加载完成后再替换背景,避免空白:

function onMouseOver(year){
  const element = document.getElementById('conf');
  const curYear = year.id; 

  for(let y=2021; y>=1950; y--){
    document.getElementById(y+100).value = curYear;
    document.getElementById(y+200).value = currentNumOfRounds;
  }
  
  // 先预加载目标背景图
  const targetBg = new Image();
  targetBg.src = `/imgs/jpg/yearswinner/${curYear}.jpg`;
  // 图片加载完成后再替换背景
  targetBg.onload = () => {
    element.style.backgroundImage = `url(${targetBg.src})`;
  }

  for(let i=2021; i>=1950; i--){
    if(i == curYear){
      document.getElementById(i).style.opacity = "1";
      document.getElementById(i).style.transition = "transform .2s";
      document.getElementById(i).style.transform = "scale(1.1)";
    }else{
      document.getElementById(i).style.opacity = "0.5";
      document.getElementById(i).style.transition = "transform .2s";
      document.getElementById(i).style.transform = "scale(0.9)";
    }          
  }     
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:24:10