【问题标题】:Issue pre-loading an image from cache in Firefox or Edge在 Firefox 或 Edge 中从缓存中预加载图像的问题
【发布时间】:2016-09-17 17:30:19
【问题描述】:

我有一个网页,它在鼠标悬停时更改元素的 background-image url(使用 :hover css 伪类)。

.myClass {
  width: 100px;
  height: 100px;
  background-repeat: no-repeat;
  background-image: url("a-icon.png");
  background-size: 100px;
}

.myClass:hover {
  background-image: url("b-icon.png");
}

为了避免浏览器第一次获取“热”图像时出现闪烁,我使用以下 JavaScript 代码来预加载图像:

(new Image()).src = hotImgUrl;

这适用于 Firefox 和 Edge如果他们还没有图像的缓存版本(即在第一次访问时)。 但是,如果您在浏览器缓存图像后重新加载页面,它就不再起作用,并且当您将鼠标悬停在图像上时会出现闪烁。

Chrome 和 Safari 没有这个问题。

我在下面创建了一个示例,它显示了问题。

//pre-load hot image:
(new Image()).src = "http://icons.iconarchive.com/icons/iconexpo/speech-balloon-orange/128/speech-balloon-orange-b-icon.png";
.myClass {
  width: 100px;
  height: 100px;
  background-repeat: no-repeat;
  background-image: url('http://icons.iconarchive.com/icons/iconexpo/speech-balloon-orange/128/speech-balloon-orange-a-icon.png');
  background-size: 100px;
}
.myClass:hover {
  background-image: url("http://icons.iconarchive.com/icons/iconexpo/speech-balloon-orange/128/speech-balloon-orange-b-icon.png");
}
<div class="myClass"></div>

这是 Firefox/Edge 的错误吗?还是我以错误的方式解决这个问题?任何帮助将不胜感激!

【问题讨论】:

    标签: javascript css image caching


    【解决方案1】:

    试试这个:

    //pre-load hot image:
    (new Image()).src = "http://icons.iconarchive.com/icons/iconexpo/speech-balloon-orange/128/speech-balloon-orange-b-icon.png";
    .myClass {
      width: 100px;
      height: 100px;
      background-repeat: no-repeat;
      background-image: url('http://icons.iconarchive.com/icons/iconexpo/speech-balloon-orange/128/speech-balloon-orange-a-icon.png');
      background-size: 100px;
    }
    
    .myClass:hover:after {
      content: '';
      display:block;
      width: 100px;
      height:100px;
      background-size: 100px;
      background-image: url("http://icons.iconarchive.com/icons/iconexpo/speech-balloon-orange/128/speech-balloon-orange-b-icon.png");
    }
    &lt;div class="myClass"&gt;&lt;/div&gt;

    不确定它是否会有所帮助,但至少尝试一下。

    【讨论】:

    • 谢谢你,亚历克斯 - 这实际上效果很好。但是,如果“热”图像包含 alpha 部分,则会出现问题 - 您将通过 alpha 部分看到下面的图像。
    【解决方案2】:

    您可以将 2 张图片统一为 1 张图片,并且可以仅更改背景位置。所以图片会在页面打开时加载。

    div{
    background:url("http://www.csstr.com/3.png");
      width:100px;
      height:95px;
      
      background-position:0 center;
    }
    
    div:hover{
    
      background-position:100px center;
    
    }
    &lt;div&gt;&lt;/div&gt;

    【讨论】:

    • 感谢 u238 - 这是一个很好的解决方案,但不幸的是,我需要使用 2 个单独的图像,因此对我不起作用。它供组件使用,允许您为“热”状态指定单独的图像。
    【解决方案3】:

    那么这个呢?打开页面时加载了2张图片,我们只需要设置z-indexes。

    div {
    
    position:relative;
      
    }
    
    
    img {
    
      position:absolute;
      left:0;
      top:0;
    
    }
    
    #pic1{
    
    z-index:50;
    
    }
    
    #pic2{
      z-index:40;
    }
    
    div:hover #pic2{
    
    z-index:55;
      
    }
    <div>
      
      <img src="http://icons.iconarchive.com/icons/iconexpo/speech-balloon-orange/128/speech-balloon-orange-a-icon.png" id="pic1"/>
      
      <img src="http://icons.iconarchive.com/icons/iconexpo/speech-balloon-orange/128/speech-balloon-orange-b-icon.png" id="pic2"/>
      
    </div>  

    【讨论】:

    • 再次感谢!这是对我的用例的改进,但它与亚历克斯的回答一样受到了同样的困扰——“热”图标中的 alpha 将允许基本图像显示出来。
    • 我是个白痴——我可以用可见性替换 z-index,这样就可以了。这意味着我必须重构组件的工作方式,但这会解决我的问题。我很犹豫是否接受这个作为目前的答案,但如果您可以编辑您的答案以添加有关使用可见性的注释,我将很乐意接受它。
    • 你是否接受我的回答并不重要,如果你找到了解决方案。顺便说一句,如果图片大小相同,无需更改可见性,z-index 将起作用。无论如何,正如我所说,如果你找到了解决方案,那就是重点。
    • z-index 只有在图像完全不透明时才有效,我相信?例如。编辑您的代码以使#pic2 的不透明度为 0.5 以了解我的意思。
    • 我认为没有。 z-index 设置元素的堆栈顺序。我的意思是,在示例中,有 2 张图片大小完全相同。其中一个具有较大的 z-index,因此它位于前景中,因此我们可以看到这个,而另一个位于第一个后面,因此我们看不到它。
    猜你喜欢
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 2014-01-07
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 2016-07-27
    相关资源
    最近更新 更多