利用CSS、JavaScript及Ajax实现高效的图片预加载

作者:交互手记时间:2026-10-27 15:34:36浏览:447

本文详细解析了利用CSS、JavaScript及Ajax三种技术实现图片预加载的方法。通过CSS背景图定位、JavaScript动态创建Image对象以及Ajax异步请求,分别介绍了不同场景下的预加载策略,旨在提升页面加载速度与用户体验。

CSS与JavaScript结合预加载

实现图片预加载有多种技术路径,涵盖CSS、JavaScript以及两者的混合应用。这些方案能够灵活适配不同的设计需求,提供高效的加载体验。

代码示例如下:

 
#preload-01 { background: url(http://domain.tld/image-01.png) no-repeat -9999px -9999px; }
#preload-02 { background: url(http://domain.tld/image-02.png) no-repeat -9999px -9999px; }
#preload-03 { background: url(http://domain.tld/image-03.png) no-repeat -9999px -9999px; }

将上述三个ID选择器应用于HTML元素,即可通过CSS的background属性将图片加载至屏幕外的背景区域。只要图片路径一致,当页面其他部分调用这些图片时,浏览器会直接使用缓存中的预加载图片,无需额外请求。这种方法简单且高效,完全不需要JavaScript支持。


尽管该方法高效,但仍存在改进空间。使用此法时,图片会与页面其他内容同步加载,从而增加整体页面的加载时间。为解决这一问题,可以引入JavaScript代码,将预加载操作推迟至页面加载完成之后。


代码示例如下:

 
// 更优的图片预加载方案 @ <a href="http://perishablepress.com/press/2009/12/28/3-ways-preload-images-css-javascript-ajax/">http://perishablepress.com/press/2009/12/28/3-ways-preload-images-css-javascript-ajax/</a>
function preloader() {
if (document.getElementById) {
document.getElementById("preload-01").style.background = "url(http://domain.tld/image-01.png) no-repeat -9999px -9999px";
document.getElementById("preload-02").style.background = "url(http://domain.tld/image-02.png) no-repeat -9999px -9999px";
document.getElementById("preload-03").style.background = "url(http://domain.tld/image-03.png) no-repeat -9999px -9999px";
} 
} 
function addLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
} else {
window.onload = function() {
if (oldonload) {
oldonload();
} 
func();
} 
} 
} 
addLoadEvent(preloader);

脚本的第一部分通过获取具有特定ID的元素,并设置其background属性,从而实现不同图片的预加载。


脚本的第二部分利用addLoadEvent()函数,将preloader()函数的执行推迟到页面完全加载之后。


若用户的浏览器不支持JavaScript,图片将不会被预加载,但在页面调用图片时会正常显示,不影响基本功能。



方法二:仅使用JavaScript实现预加载

纯JavaScript预加载方案

上述方法虽然高效,但在实际应用中可能耗时较多。相比之下,我更倾向于使用纯JavaScript来实现图片预加载。以下提供两种适用于所有现代浏览器的预加载方法。



JavaScript代码段1



只需简单编辑并加载所需图片的路径与名称即可实现,操作简便:


代码示例如下:

 
<div class="hidden">
<script type="text/javascript">
<!--//--><![CDATA[//><!--
var images = new Array()
function preload() {
for (i = 0; i < preload.arguments.length; i++) {
images[i] = new Image()
images[i].src = preload.arguments[i]
} 
} 
preload(
"http://domain.tld/gallery/image-001.jpg",
"http://domain.tld/gallery/image-002.jpg",
"http://domain.tld/gallery/image-003.jpg"
) 
//--><!]]> 
</script>
</div>

该方法特别适用于预加载大量图片的场景。例如,我的画廊网站利用此技术预加载了50多张图片。将此脚本应用于登录页面,当用户输入账号时,大部分画廊图片即可被预加载。



JavaScript代码段2



该方法与上述方法类似,同样支持预加载任意数量的图片。将以下脚本添加到任何Web页面中,并根据实际需求进行编辑即可。


代码示例如下:

 
<div class="hidden">
<script type="text/javascript">
<!--//--><![CDATA[//><!--
if (document.images) {
img1 = new Image();
img2 = new Image();
img3 = new Image();
img1.src = "http://domain.tld/path/to/image-001.gif";
img2.src = "http://domain.tld/path/to/image-002.gif";
img3.src = "http://domain.tld/path/to/image-003.gif";
} 
//--><!]]> 
</script>
</div>

如所见,每加载一个图片都需要创建一个变量(如“img1 = new Image();”)及图片源地址声明(如“img3.src = "../path/to/image-003.gif";”)。参考此模式,可根据需要加载任意数量的图片。


我们对该方法进行了进一步优化,将脚本封装入一个函数中,并使用addLoadEvent()函数,将预加载时间推迟至页面加载完毕。


代码示例如下:

 
function preloader() {
if (document.images) {
var img1 = new Image();
var img2 = new Image();
var img3 = new Image();
img1.src = "http://domain.tld/path/to/image-001.gif";
img2.src = "http://domain.tld/path/to/image-002.gif";
img3.src = "http://domain.tld/path/to/image-003.gif";
} 
} 
function addLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
} else {
window.onload = function() {
if (oldonload) {
oldonload();
} 
func();
} 
} 
} 
addLoadEvent(preloader);

方法三:使用Ajax实现预加载

基于Ajax的预加载技术

前述方法虽然实用,但或许不够优雅。接下来介绍一种使用Ajax实现图片预加载的方法。该方法利用DOM技术,不仅预加载图片,还能预加载CSS、JavaScript等相关资源。相比直接使用JavaScript,Ajax的优势在于JavaScript和CSS的加载不会干扰当前页面的显示。此方法简洁且高效。


代码示例如下:

 
window.onload = function() {
setTimeout(function() {
// XHR 请求 JS 和 CSS
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://domain.tld/preload.js');
xhr.send('');
xhr = new XMLHttpRequest();
xhr.open('GET', 'http://domain.tld/preload.css');
xhr.send('');
// 预加载图片
new Image().src = "http://domain.tld/preload.png";
}, 1000);
}; 

上述代码预加载了“preload.js”、“preload.css”和“preload.png”。设置1000毫秒的超时时间是为了防止脚本挂起,从而避免影响正常页面的功能。


接下来,我们看看如何通过JavaScript实现类似的加载过程:


代码示例如下:

 
window.onload = function() {
setTimeout(function() {
// 获取 <head> 引用
var head = document.getElementsByTagName('head')[0];
// 创建新的 CSS
var css = document.createElement('link');
css.type = "text/css";
css.rel = "stylesheet";
css.href = "http://domain.tld/preload.css";
// 创建新的 JS
var js = document.createElement("script");
js.type = "text/javascript";
js.src = "http://domain.tld/preload.js";
// 预加载 JS 和 CSS
head.appendChild(css);
head.appendChild(js);
// 预加载图片
new Image().src = "http://domain.tld/preload.png";
}, 1000);
}; 

在此示例中,我们通过DOM创建三个元素来实现三个文件的预加载。如前所述,使用Ajax加载文件不会直接应用到当前页面上。从这个角度看,Ajax方法优于纯JavaScript方法。

作者最新文章