简体   繁体   English

以HTML预加载图像

[英]Preloading images in HTML

I want to preload these 4 images. 我想预加载这4张图片。 I tried this: 我尝试了这个:

<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">

It didn't work so I tried this instead: 它没有用,所以我尝试了一下:

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

The JS method worked with the background but not with these. JS方法适用于背景,但不适用于这些背景。

Try utilizing $.Deferred() , .queue() 尝试利用$.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"> 

This never actually appends anything to the DOM, I used an array to keep references of the created images, and pass them to an optional callback 这实际上从未向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);
        }
    }
}

Instead of setting the images themselves to display: none; 而不是将图像本身设置为display: none; , set it on the container. ,将其放在容器上。

CSS: CSS:

.preload {
    display: none;
}

HTML: 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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM