在 safari 上预加载图像以更改背景图像 [重复]

Posted

技术标签:

【中文标题】在 safari 上预加载图像以更改背景图像 [重复]【英文标题】:Preloading images on safari for background image change [duplicate] 【发布时间】:2017-08-03 10:04:58 【问题描述】:

我有一个每 12 秒更改一次的背景。 在 Chrome、Firefox 和 Opera 中,背景更改工作正常,但在 Safari 中,浏览器总是再次加载图像,并且在第一个周期的每个图像更改时都会出现闪烁。关于如何解决这个问题的任何想法。

这就是我处理背景变化的方式:

var img2 = new Image();
var img3 = new Image();
img2.src="/img/bg2.png";
img3.src="/img/bg3.png";
Meteor.setInterval(function()
    let elem = $(".header-2");
    if(elem.hasClass("bg1"))
        elem.removeClass("bg1");
        elem.addClass("bg2");
        let src = 'url('+img2.src.replace(location.origin,'')+')';
        elem.css("background-image", src);
    
    else if(elem.hasClass("bg2"))
        elem.removeClass("bg2");
        elem.addClass("bg3");
        let src = 'url('+img3.src.replace(location.origin,'')+')';
        elem.css("background-image", src);
    
    else
        elem.removeClass("bg3");
        elem.addClass("bg1");
    
, 12*1000)

css 类:

.header-2.bg1 
    background-image: url('/img/bg1.png');

.header-2.bg2 


.header-2.bg3 


【问题讨论】:

不是在计时器滴答时更改图像的src,而是可以有几个元素,每个元素都加载了它的图像,然后更改z-index 以将你想要的元素放在前面想?如果图像具有透明度,您可以通过将其不透明度设置为零来使隐藏元素不可见。 【参考方案1】:

在图像上发生onload 事件后更改背景应确保在更新页面上的任何内容之前完全加载图像。

这种方式在JS中添加事件并保持背景变化。

var bgs = ['http://3.bp.blogspot.com/_EqZzf-l7OCg/TNmdtcyGBZI/AAAAAAAAAD8/KD5Y23c24go/s1600/homer-simpson-1280x1024.jpg', 'http://cdn.thedailybeast.com/content/dailybeast/articles/2015/03/31/neil-degrasse-tyson-defends-scientology-and-the-bush-administration-s-science-record/jcr:content/image.img.2000.jpg/1432067001553.cached.jpg','http://www.mrwallpaper.com/wallpapers/Huge-Bear.jpg'],
  count = 1,
  header2 = document.getElementsByClassName('header-2')[0];

setInterval(function() 
  var img2 = new Image(),
    url = bgs[count];
  img2.onload = function() 
    header2.style.backgroundImage = 'url(' + url + ')';
  
  img2.src = url;
  (count < (bgs.length - 1)) ? count++ : count = 0;
,1000)
body 
  margin: 0;

.header-2 
  background-position: top center;
  background-repeat: no-repeat;
  background-size: cover;
  height: 100vh;
  margin: 0;
  background-image: url('http://3.bp.blogspot.com/_EqZzf-l7OCg/TNmdtcyGBZI/AAAAAAAAAD8/KD5Y23c24go/s1600/homer-simpson-1280x1024.jpg');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<header class="header-2"></header>

您也可以在代码中使用相同的方法来控制部分代码。在这里,我只是在您的区间中设置了一个data-bg 属性,然后使用数据选择器通过 CSS 控制background-image(以及其他任何东西)

var bgs = ['http://3.bp.blogspot.com/_EqZzf-l7OCg/TNmdtcyGBZI/AAAAAAAAAD8/KD5Y23c24go/s1600/homer-simpson-1280x1024.jpg', 'http://cdn.thedailybeast.com/content/dailybeast/articles/2015/03/31/neil-degrasse-tyson-defends-scientology-and-the-bush-administration-s-science-record/jcr:content/image.img.2000.jpg/1432067001553.cached.jpg', 'http://www.mrwallpaper.com/wallpapers/Huge-Bear.jpg'],
  count = 0,
  header2 = document.getElementsByClassName('header-2')[0];

setInterval(function() 

  var img2 = new Image(),
      url = bgs[count];

  img2.onload = function() 
    header2.setAttribute('data-bg', count);
  

  img2.src = url;

  (count < (bgs.length - 1)) ? count++ : count = 0;
, 1000)
body 
  margin: 0;

.header-2 
  background-position: top center;
  background-repeat: no-repeat;
  background-size: cover;
  height: 100vh;
  margin: 0;
  background-image: url('http://3.bp.blogspot.com/_EqZzf-l7OCg/TNmdtcyGBZI/AAAAAAAAAD8/KD5Y23c24go/s1600/homer-simpson-1280x1024.jpg');

.header-2[data-bg="1"] 
  background-image: url('http://cdn.thedailybeast.com/content/dailybeast/articles/2015/03/31/neil-degrasse-tyson-defends-scientology-and-the-bush-administration-s-science-record/jcr:content/image.img.2000.jpg/1432067001553.cached.jpg');

.header-2[data-bg="2"] 
  background-image: url('http://www.mrwallpaper.com/wallpapers/Huge-Bear.jpg');
&lt;header class="header-2" &gt;&lt;/header&gt;

【讨论】:

【参考方案2】:

这可能是由于在执行脚本之前图像未正确加载,通过调用函数 onload() 可以解决问题。

【讨论】:

以上是关于在 safari 上预加载图像以更改背景图像 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Safari 浏览器无法处理 Click 事件以显示加载图像

Safari中的SVG Fragment Sprite + CSS背景图像

将 createObjectURL 的结果分配给图像无法在移动 Safari 上加载资源

更改通过背景图像加载的 SVG 图像的填充颜色 [重复]

如何制作一个完全响应的背景图像,即使在 iPhone Safari 中也可以使用?

背景图像在 Safari 中未正确拉伸