I'm working on a jquery based homepage with 5 or so hidden divs, each containing several background css images.
The issue is that the browser doesn't load css images into the DOM until the visibility of the parent layer is shown, causing images to slowly load in when the layer becomes visible.
Solutions I've already considered:
preloading the images via js:
$(function() {
function preloadImg(image) {
var img = new Image();
img.src = image;
}
preloadImg('/images/home/search_bg_selected.png');
});
This solution seems to load the image into the dom twice...once when the js loads it, and then again when the div layer that loads it becomes visible... so it makes 2 HTTP calls, thus not working.
Any other solutions for this problem that I'm missing?
To preload responsive images, new attributes were recently added to the <link> element: imagesrcset and imagesizes . They are used with <link rel="preload"> and match the srcset and sizes syntax used in <img> element. This kicks off a request using the same resource selection logic that srcset and sizes will apply.
Even today (oct 2017), the most common browser Chrome will download all 'img' element sources, even if they're hidden. It won't download hidden background images.
When you said other ways do you mean ones that don't use Javascript?
<script language="JavaScript">
function preloader()
{
// counter
var i = 0;
// create object
imageObj = new Image();
// set image list
images = new Array();
images[0]="image1.jpg"
images[1]="image2.jpg"
images[2]="image3.jpg"
images[3]="image4.jpg"
// start preloading
for(i=0; i<=3; i++)
{
imageObj.src=images[i];
}
}
</script>
Other none JS ways are to place some html in your page somewhere so it's not seen:
<image src="picture.jpg" width="1" height="1" border="0">
or HTML...
<img src="images/arrow-down.png" class="hiddenPic" />
...and CSS...
.hiddenPic {
height:1px;
width:1px;
}
More JavaScript Methods:
function preload(images) {
if (document.images) {
var i = 0;
var imageArray = new Array();
imageArray = images.split(',');
var imageObj = new Image();
for(i=0; i<=imageArray.length-1; i++) {
//document.write('<img src="' + imageArray[i] + '" />');// Write to page (uncomment to check images)
imageObj.src=images[i];
}
}
}
Then load the images using something like:
<script type="text/javascript">
preload('image1.jpg,image2.jpg,image3.jpg');
</script>
CSS preloading is easy.
Example:
body:after{
display:none;
content: url(img01.png) url(img02.png) url(img03.png) url(img04.png)
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With