本文详细解析了利用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方法。