【问题标题】:SVG Background Flickering Once on HoverSVG背景在悬停时闪烁一次
【发布时间】:2022-01-12 04:51:45
【问题描述】:

我有一个带有 svg 背景的按钮,它的悬停也有一个 svg 背景。当我在页面加载后第一次将鼠标悬停在它上面时,会出现闪烁,但随后的任何悬停都没有闪烁。我认为这可能是加载问题,但即使我在页面上单独加载两个图像或预加载图像,此闪烁仍然会发生,因此它不是加载问题。怎么回事?

.minus{
    background: url(https://www.svgrepo.com/show/294589/shuffle-random.svg);
background-size: cover;
    border: 0;
    display: block;
    height: 20px;
    width: 20px;
}

.minus:hover{
    background: url(https://www.svgrepo.com/show/240096/shuffle-random.svg);
}
<button class="minus">

【问题讨论】:

标签: html css svg


【解决方案1】:

这是因为未加载隐藏元素/资产(非活动选择器或display: none 等)。您必须手动预加载它。

这里有一些想法:

注意:服务器 https://www.svgrepo.com/ 有时会以 403 Forbidden 响应。所以你可能看不到任何图像。 (见控制台)

使用 CSS 预加载

.minus {
  background: url(https://www.svgrepo.com/show/294589/shuffle-random.svg);
  background-size: cover;
  border: 0;
  display: block;
  height: 20px;
  width: 20px;
}

.minus:hover {
  background: url(https://www.svgrepo.com/show/240096/shuffle-random.svg);
}

body:after {
  /* display: none -- does not work anymore due to latest optimizations.*/
  display: block;
  overflow: hidden;
  width: 0;
  height: 0;
  content: url(https://www.svgrepo.com/show/240096/shuffle-random.svg);
}
<button class="minus"></button>

这只是一种方法。这可能取决于您的框架。您也可以在 JavaScript 中执行此操作(加载图像)。或者换个思路:使用平铺的精灵作为(一个)图像,然后在悬停时移动背景位置。或者一次加载两者。

使用精灵

.minus {
  background: 
    url(https://www.svgrepo.com/show/294589/shuffle-random.svg),
    url(https://www.svgrepo.com/show/240096/shuffle-random.svg);
  background-size: cover;
  background-position: 0, 20px;
  background-repeat: no-repeat;
  border: 0;
  display: block;
  height: 20px;
  width: 20px;
}

.minus:hover {
  background-position: 0;
}
<button class="minus"></button>

在 HTML 中预加载图像

.minus {
  background: url(https://www.svgrepo.com/show/294589/shuffle-random.svg);
  background-size: cover;
  border: 0;
  display: block;
  height: 20px;
  width: 20px;
}

.minus:hover {
  background: url(https://www.svgrepo.com/show/240096/shuffle-random.svg);
}

#preload {
  /* In this case / context display hidden works. */
  display: none;
}
<div id="preload">
  <img src="https://www.svgrepo.com/show/240096/shuffle-random.svg">
</div>

<button class="minus"></button>

在 JavaScript 中预加载图片

[
  'https://www.svgrepo.com/show/294589/shuffle-random.svg',
  'https://www.svgrepo.com/show/240096/shuffle-random.svg',
].forEach((imageUrl) => {
  new Image().src = imageUrl;
});
.minus {
  background: url(https://www.svgrepo.com/show/294589/shuffle-random.svg);
  background-size: cover;
  border: 0;
  display: block;
  height: 20px;
  width: 20px;
}

.minus:hover {
  background: url(https://www.svgrepo.com/show/240096/shuffle-random.svg);
}
&lt;button class="minus"&gt;&lt;/button&gt;

使用关键字搜索网络,例如:css 背景图像悬停闪烁预加载等

【讨论】:

  • 即使我在悬停之前将两个图像(悬停和非悬停)都加载到按钮旁边的页面上,闪烁仍然发生,并在问题中说明这不是预问题加载图像。
  • @Hitokage 是的,我已经读过了。但我重现了您的问题,发现它一个预加载问题。您可以通过在单击“运行代码片段”之前重新加载此页面来重现它。你的例子在闪烁。但是我所有的例子都以不同的方式解决了这个问题。但是,如果这对您来说仍然是一个问题,请查看此答案中的“使用精灵”解决方案。这是解决此问题的另一种方法。试试看,如果这能解决您的问题,请告诉我。我相信它会解决它。 :)
  • 我不知道你的代码也猜不出来。也许你错过了什么?我在 Chrome 97 上测试了所有 sn-ps 并且可以重现您的问题。对我来说,我所有的解决方案都有效。包括第一页的图像。请注意,Chrome(和其他浏览器)有许多优化来减少数据加载。例如。不会加载带有display: none 或非活动选择器的隐藏图像。 ...您使用哪个框架?如果您有存储库(例如在 GitHub 上),我可以查看您的项目。但是很高兴听到我的回答中的一种解决方案对您有用。如果有帮助,请考虑单击此答案的 ✓。
  • 我感觉到你了。我也没有任何问题。所以我对解决这个问题很感兴趣。请记住,您正在从另一个域加载图像。这比加载本地文件需要更长的时间。它也类似于游戏引擎,您必须在其中预加载图像。否则你会遇到同样的问题。浏览器不会自动预加载您在应用程序中拥有的所有可能的资产(图像)。出于性能原因并减少数据流量。一些框架可能会自动处理这个问题,所以你不必担心。 ...
  • ... 但是您可以通过重新考虑像 sprite 解决方案这样的实现来解决这个问题。这也来自游戏开发。只需将您想要的所有图像连续放置并裁剪以仅显示一个。再次查看我上面的示例并在网上搜索它。要么加载你想要的所有图片网址。将所有图像放在一个图形程序中。例如:下载两个图像并将其放在一起。并排。在 css 中,您只需将背景大小和位置设置为仅显示一侧。左为空闲,右为悬停。 ...解决预加载问题的一个想法。
猜你喜欢
  • 2019-06-06
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 2019-07-14
  • 1970-01-01
相关资源
最近更新 更多