Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我可以用JS“预加载”一个图像作为CSS背景图像吗?_Javascript_Css_Image - Fatal编程技术网

Javascript 我可以用JS“预加载”一个图像作为CSS背景图像吗?

Javascript 我可以用JS“预加载”一个图像作为CSS背景图像吗?,javascript,css,image,Javascript,Css,Image,是否可以使用javascript将图像预先加载到页面中,以便随时将其用作CSS背景图像,而无需任何请求/上载延迟 如果是这样,怎么做?您甚至不需要使用JS来实现这一点,其缺点是延迟页面加载事件。包括以下内容: <img src="/path/to/image.jpg.png.gif.bmp" style="display: none" /> 由于@rlemon提供了预加载代码,正如上面一些小猫的回答中的一个警告,在页面加载后,一个特别大的背景图像应该作为隐藏背景/通过JavaScr

是否可以使用javascript将图像预先加载到页面中,以便随时将其用作CSS背景图像,而无需任何请求/上载延迟


如果是这样,怎么做?

您甚至不需要使用JS来实现这一点,其缺点是延迟页面加载事件。包括以下内容:

<img src="/path/to/image.jpg.png.gif.bmp" style="display: none" />

由于@rlemon提供了预加载代码,正如上面一些小猫的回答中的一个警告,在页面加载后,一个特别大的背景图像应该作为隐藏背景/通过JavaScript添加,因为内容图像延迟了window.onload的启动,因此可能会造成页面加载缓慢的感觉


考虑到听起来您正在使用动态内容,这可能是一个可接受的解决方案。它还允许您根据需要以编程方式进行预加载,这对维护来说可能更好。

我不认为使用隐藏的img标记是正确的方法,我宁愿使用一个新的Imgurl并附加一个onload事件,您可以将图像设置为所需元素的背景图像

img = new Image();
img.onload = function(){
  // set background-image
};
img.src = image_url;
请确保在附加onload之后放入img.src,否则可能会在附加事件之前加载映像

也许可以建立一个更完整的基础:

function preload(list, callback, imageCallback, errorCallback) {
  if (typeof(list) === "undefined"
      || list.length === 0) {
    return;
  }
  var len = list.length;
  var timers = {};
  var checkLen0 = function() {
    if (len === 0) {
      if (typeof(callback) === "function") {
        callback();
      }
      delete(timers)
    }
  }
  var onload = function() {
    clearTimeout(timers[img]);
    if (typeof(imageCallback) === "function") {
      imageCallback.call(img);
    }
    len--;
    checkLen0();
  }
  var onerror = function() {
    clearTimeout(timers[img]);
    if (typeof(errorCallback) === "function") {
      errorCallback.call(img);
    }
    len--;
    checkLen0();
  }
  for (var i = 0; i < list.length; i++ ) {
    var img = new Image();
    img.onload = onload;
    timers[img] = window.setTimeout(5000, onerror);
    img.src = list[i];
  }
}

虽然SomeKittens的答案是有效的,但它会延迟页面加载,正如Jimmy所评论的那样。如果您使用的是jquery,我会使用类似的方式来保持样式、结构和逻辑的分离:


当然,从那时起,您可以优化/更改它。这样做的好处是,您可以使用PHP动态创建脚本,并且可以将所有javascript作为一个单独的文件正确缓存。

有一个很好的框架用于此工作,名为Emerge.js

项目页面的报价:
Emerge.js是一个协调页面加载的框架。通常,当加载一个复杂的网页时,图像以随机顺序出现,导致不愉快的闪烁。要用漂亮协调的动画替换它,需要编程。Emerge.js无需编写任何Javascript代码,从而简化了任务。该框架使用声明性方法,为每个元素指定所需的行为,而不考虑实现。Emerge.js使用jQuery。

页面是在获取img之前还是之后完成加载动画?我会做一些测试,如果是在之后,我会考虑使用JavaScript或者页面会永远持续下去。load@jt0dd-您还可以在元素上设置背景图像,并为其提供背景位置/显示属性,使其不会呈现。@FranciscoPresencia-以这种方式添加到页面的图像将延迟window.onLoad,yesRisky,也许两次加载同一个图像?@Phaedra-不,除非响应中有一些标题,例如pragma指令,告诉UA不要麻烦缓存。你先搜索了吗?这就是为什么不应该使用onload,但是DOMContentLoaded@Pumbaa80-我相信用户在浏览器上看到“加载微调器”的时间比他们需要的时间长,这仍然是一个问题。老实说,我相信这是一个更好的策略。它允许您使用JS以编程方式将需要预加载的图像和它们添加到DOM中的图像绑定在一起。每次需要时手动添加图像可能会很快成为维护的地狱。请下载者解释一下,这个答案为什么没有帮助?嗯,我在问自己,这是否是一项有风险的业务,因为你可能过度使用这种方法,使较旧的浏览器响应速度降低,此外,在加载后台之前,您必须隐藏所有div内容,可能根本不需要下载投票者。我更改了数据src并将其放入,在javascript中使用了.html而不是attrdata src,以使其对较旧的浏览器更具响应性。此外,更改了javascript加载的背景图像位。还有什么需要改进的吗?数据src对我来说是一种更好的方式,也许在div元素中您需要一些内容。
img = new Image();
img.onload = function(){
  // set background-image
};
img.src = image_url;
function preload(list, callback, imageCallback, errorCallback) {
  if (typeof(list) === "undefined"
      || list.length === 0) {
    return;
  }
  var len = list.length;
  var timers = {};
  var checkLen0 = function() {
    if (len === 0) {
      if (typeof(callback) === "function") {
        callback();
      }
      delete(timers)
    }
  }
  var onload = function() {
    clearTimeout(timers[img]);
    if (typeof(imageCallback) === "function") {
      imageCallback.call(img);
    }
    len--;
    checkLen0();
  }
  var onerror = function() {
    clearTimeout(timers[img]);
    if (typeof(errorCallback) === "function") {
      errorCallback.call(img);
    }
    len--;
    checkLen0();
  }
  for (var i = 0; i < list.length; i++ ) {
    var img = new Image();
    img.onload = onload;
    timers[img] = window.setTimeout(5000, onerror);
    img.src = list[i];
  }
}
<style>
  .preload-img { display: none; }
</style>

...    

<div class = "preload-img">/path/to/image.jpg.png.gif.bmp</div>

...

<script>
$(document).ready(function(){
  $(".preload-img").each(function(){
    preloadImage = new Image();
    preloadImage.src = $(this).html();
    });
  });
</script>