图片的加载速度往往影响着网站整体的用户体验,尤其对于包含大量图片的网站。对图片进行预加载,不失为一个高效的解决方案。如何实现预加载?
本文将举例利用css、javascript、ajax实现图片预加载的三大方法:
预加载图片是提高用户体验的一个很好地方法。图片预加载到浏览器中,访问者可顺利的在你的网站上冲浪,并享受到几块的加载速度。这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速、无缝的发布,也可帮助用户在浏览网站内容时获得更好的用户体验。
本文分享的三个不同的预加载技术,来增加网站的性能和可用性。
方法一:用css和javascript实现预加载
实现预加载图片有很多方法,就包括使用css、javascript以及两者的各种组合。
这些奇数可根据不同设计场景设计出相应的解决方案,十分高效。
单纯使用css,可容易、高效的预加载图片,代码如下:
#pre-01{background:url(http://domain.tld/image-01.png) no-repeat -9999px -9999px;}
#pre-02{background:url(http://domain.tld/image-02.png) no-repeat -9999px -9999px;}
#pre-03{background:url(http://domain.tld/image-03.png) no-repeat -9999px -9999px;}
将这三个ID选择器应用到(X)html元素中,我们便可通过css的background属性将图片预加载到屏幕外的背景上。只要这些图片的路径保持不变,当他们在web页面的其他地方被调用时,浏览器就会在渲染过程中使用预加载(缓存)的图片。简单、高效、不需要任何javascript。
该方法虽然高效,但仍有改进余地。使用该方法加载的图片会同页面的其他内容一起加载,增加了页面的整体加载时间。为了解决这个问题,我们增加一些javascript代码,来推迟预加载的时间,直到页面加载完毕。代码如下:
//better image preloading @http://perishablepress.com/press/2009/12/28/2-ways-preload-images-css-javascript-ajax/
function preloader(){
if(docuemnt.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);
在该脚本的第二部分,我们使用addLoadEvent()函数来延迟preloader()函数的加载时间,直到页面加载完毕。
如果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.lengthl 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/gallery/image-001.jif";
img2.src = "http://domain.tld/gallery/image-002.jif";
img3.src = "http://domain.tld/gallery/image-003.jif";
}
//--><!]]>
</script>
</div>
正如缩减,没加载一个图片都需要创建一个变量,如“img1 = new Image()”,及图片原地址声明,
如"img3.src = "http://domain.tld/gallery/image-003.jif";"。参考该模式,你可根据需要加载任意多的图片。
我们又对该方法进行了改进。将该脚本封装入一个函数中,并使用addLoadEvent(),延迟预加载事件,直到页面加载完毕。
function preloader(){
if(document.images){
var img1 = new Image();
var img2 = new Image();
var img3 = new Image();
img1.src = "http://domain.tld/gallery/image-001.jif";
img2.src = "http://domain.tld/gallery/image-002.jif";
img3.src = "http://domain.tld/gallery/image-003.jif";
}
}
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实现图片预加载的方法。该方法利用DOm,不仅仅预加载图片,
还会预加载css、javascript等相关的东西。使用ajax,比直接使用javascript,优越之处在于javascript和css的加载不会影响到当前 页面。
该方法简洁、高效。
window.onload = function() {
setTimeout(function(){
//XHR to request a JS and a 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('');
//preload image
new Image().src = 'http://domain.tld/preload.png';
},1000);
};
```
上面代码预加载了"preload.JS"、"preload.css"和"preload.png"。1000毫秒的超时是为了防止脚本挂起,而导致正常页面出现功能问题。
下面,我们看看如何利用javascript来实现该加载过程:
window.onload = function() {
setTimeout(function(){
//reference to <head>
var head = document.getElementByTagName('head')[0];
//a new CSS
var css = docuemnt.createElement('link');
css.type = 'text/css';
css.rel = 'stylesheet';
css.href = 'http://domain.tld/preload.css';
//a new JS
var js = document.createElement('script');
js.type = 'text/javascript';
js.src = 'ttp://domain.tld/preload.js';
//preload JS and CSS
head.appendChild(css);
head.appendChild(JS);
//preload image
new Image().src = 'http://domain.tld/preload.png';
},1000);
};
这里我们通过DOM创建三个元素来实现三个文件的预加载。正如上面提到的那样,使用ajax,加载文件不会应用到加载页面上。
从这点上看,ajax方法优越于javascript。