Clean, easy, effective. You don’t need no stinking JavaScript to preload your images. Nope. Try some tasty CSS and (X)HTML instead! Here’s how.. (only two steps!)
Step 1 — Place this in your CSS file:
div#preloaded-images {
position: absolute;
overflow: hidden;
left: -9999px;
top: -9999px;
height: 1px;
width: 1px;
}
Step 2 — Place this at the bottom of your (X)HTML document:
<div id="preloaded-images">
<img src="http://perishablepress.com/image-01.png" width="1" height="1" alt="" />
<img src="http://perishablepress.com/image-02.png" width="1" height="1" alt="" />
<img src="http://perishablepress.com/image-03.png" width="1" height="1" alt="" />
</div>
..and that’s a wrap! All images are preloaded and ready for calling as you please. Completely valid, standards-compliant image preloading via CSS and (X)HTML!!
68 Responses
Perishable – February 17, 2008 •
Hi Nanda, thanks for continuing the conversation ;) Reading your comment, I am assuming that WordPress ate the “
<div>” placed directly before the “s” in your first sentence. If so, I would argue that an empty<div>(or any other element) qualifies as “non-semantic” markup, which should also be avoided within a strictly web-standards context. Admittedly, an empty element is an improvement over one that is filled with images, however, I think that your second, CSS-only method serves as a far better solution overall. Do you know if there are any browsers for which the CSS-only technique does not work?Nanda – February 17, 2008 •
The CSS only method is certainly better, it will work in any browser that supports background images, so far I’ve had no problems in any modern browsers (including IE 6).
Perishable – February 17, 2008 •
Excellent — thanks for sharing this method with us. I am going to experiment a bit and perhaps check a few crusty browsers for support. After spending some quality time with the technique, I will update this article and post an “new and improved” version! Thanks again for your help! :)
Duarte – May 2, 2008 •
Hello Perishable.
Interesting method, but won’t it work if you just use
display:none;?Perishable – May 4, 2008 •
Hi Duarte,
Yes, I think this method will work when using
display:none;. I have yet to test it, but logically it makes sense. Such images are still loaded by the browser, yet not displayed to the user. Thus, the images will have been “preloaded”. A very elegant improvement indeed, Duarte — thank you! ;)Duarte – May 5, 2008 •
Glad i could help Perishable, btw congratulations on the great website and articles you provide, i have learned a lot. Thank you.
Vilmer – May 7, 2008 •
Thank you for this very useful post. I make ’360 degrees virtual tours’ and had the problem that visitors had to wait for a more than 1 megabyte image to load after a change of scene. Now I have implemented your code, with the display:none command, without using an external css file, and the images load in a few seconds now!
See the source of the link to one of my tours above.
Thanx! And pls let me know if it works on all browsers, since I only have iexplorer 7 and the latest firefox..
Perishable – May 7, 2008 •
Sounds great, Vilmer — thanks for the feedback concerning your very practical application of the CSS-preloading technique. As for the cross-compatibility, I have not tested every browser on earth, but can definitely reassure you that the image-preloading method will work for a vast majority of your visitors. I think just about any modern browser (e.g., Firefox, Opera, IE7+, Safari, etc.) supports it.
zjk – May 13, 2008 •
the best way i found actually is
display:none;of course you should put a .htaccessfile with these lines in your media online directory:ExpiresActive onExpiresDefault "access plus 30 minutes"(ref:http://httpd.apache.org/docs/2.0/mod/mod_expires.html)
now i try to cleanup some, the whole animation loading as long as it sometimes look a bit and rough ^^
anyway with an infinite and unpredictable number of image to preload, i suggest to improve a bit this functionnality… (i’m actually trying to find how to catch an event like “all images are preload,
display:block;the whole thing”)if you have ideas…
Perishable – May 13, 2008 •
Careful with that htaccess, zjk! Setting default content expiration is great, so long as you specify expiration times for specific file types (e.g.,
.js,.css,.html, etc.) as needed. Depending on your needs, a default expiration value of30 minutesmay work fine for, say, images and flash files, but you may want to optimize performance by handling other file types differently.John – May 14, 2008 •
For hiding images it is possible to use
z-indexPerishable – May 14, 2008 •
Ah yes, good call — thanks for the reminder :)