【问题标题】:Preloading images in HTML在 HTML 中预加载图像
【发布时间】:2015-10-22 10:01:37
【问题描述】:

我想预加载这 4 张图片。我试过这个:

<img src="img/1.jpg" style="display:none">
<img src="img/1a.jpg" style="display:none">
<img src="img/1b.jpg" style="display:none">
<img src="img/1c.jpg" style="display:none">

它不起作用,所以我尝试了这个:

new Image().src = "img/1.jpg";
new Image().src = "img/1a.jpg";
new Image().src = "img/1b.jpg";
new Image().src = "img/1c.jpg";

JS 方法与背景一起工作,但与这些无关。

【问题讨论】:

  • 可以描述“预加载”吗?
  • @guest271314:大概是在页面加载但最初没有显示时加载,以避免稍后显示时的延迟。
  • @NathanTuggy 是的。不确定是否在 windowdocument 或其他父 element load 事件“预加载”? , 不包括在 OP 中?
  • @guest271314:虽然知道确切的时间确实很有用,但我不确定它是否至关重要。
  • 您打算如何处理这些图像?那我的影响解决方案。还有什么让你认为你所尝试的东西不起作用,据我所知,他们应该这样做。

标签: javascript jquery html image-preloader


【解决方案1】:

尝试使用$.Deferred().queue()

var images = ["http://lorempixel.com/1200/800/cats/"
             , "http://lorempixel.com/1200/800/nature/"
             , "http://lorempixel.com/1200/800/animals/"
             , "http://lorempixel.com/1200/800/technics/"
             ];
    // do stuff when image loaded
    var loadImage = function loadImage(elem) {
      return $(elem).fadeTo(500, "1.0", "linear"); 
    };
    
    // load images
    var loadImages = function loadImages(urls, image, complete) {
        // `this` : `document`
        urls.forEach(function(imageSrc, i) {
          var img = new Image;
          var dfd = new $.Deferred();
          // return `this` : `document`
          dfd.then(function(ready) {
              loadImage(ready);   
              return this
          }, function(error) {
             console.log(error)
          })
          .always(function() {
             console.log(complete, urls.length);
             return urls.length === complete 
                    ? $(this)
                      .data("complete", complete + " images loaded")
                      .dequeue("images") // when all images loaded
                    : this
    
          });
          // log errors
          img.onerror = dfd.reject;
          img.onload = function(e) {
            complete = this.complete ? ++complete : complete;
            dfd.resolveWith(document, [
              image.eq(i).prop("src", this.src)
              ]
            );
    
          };
          img.src = imageSrc
          });
          // return `this` : `document`
          return this
    };
    

    $(window).load(function() {
        // init `loadImages`
        var complete = 0;
        // call `loadImages`,
        // `this` context : `document` 
        loadImages.call(document, images, $(".image"), complete)
    
    });
    
    $(document).ready(function() {
        // notify when all images loaded
        $(this).queue("images", function() {
          console.log($(this).data())
        });               
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<!-- note , `src` attribute not included -->
<img class="image" style="opacity:0.0" alt="1">
<img class="image" style="opacity:0.0" alt="1a">
<img class="image" style="opacity:0.0" alt="1b">
<img class="image" style="opacity:0.0" alt="1c">

【讨论】:

    【解决方案2】:

    这实际上从未向 DOM 附加任何内容,我使用数组来保存创建图像的引用,并将它们传递给可选的回调

    var paths =  [
        "img/1.jpg",
        "img/1a.jpg",
        "img/1b.jpg",
        "img/1c.jpg"
    ];
    
    preloadImages(paths);
    
    function preloadImages(paths, callback) {
        var images = [];
        var loaded = 0;
    
        paths.forEach(function (path) {
            var img = new Image();
            img.src = path;
            img.onload = onImagePreloaded;
            images.push(img);
        });
    
    
        function onImagePreloaded() {
            loaded++;
            if (loaded === paths.length && callback) {
                 callback(images);
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      不要将图像本身设置为display: none;,而是将其设置在容器上。

      CSS:

      .preload {
          display: none;
      }
      

      HTML:

      <div class="preload">
          <img src="img/1.jpg">
          <img src="img/1a.jpg">
          <img src="img/1b.jpg">
          <img src="img/1c.jpg">
      </div>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多