利用css、JavaScript及Ajax实现图片预加载的三种方法

图片的加载速度往往影响着网站整体的用户体验,尤其对于包含大量图片的网站。对图片进行预加载,不失为一个高效的解决方案。如何实现预加载?
本文将举例利用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

只需要简单编辑、加载所需要图片的路径和名称即可,很容易实现:


该方法尤其适用预加载大量的图片。如一个某画廊网站适用该技术,预加载图片数量达50多张。将该脚本应用到登陆页面,只要用户输入登陆账号,大部分画廊图片将被预加载。

javascript代码段2

该方法与上面的方法类似,也可预加载任意数量的图片。将下面的脚本添加入任何web也中,根据程序指令进行编辑即可。

        

正如缩减,没加载一个图片都需要创建一个变量,如“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 
            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。

你可能感兴趣的:(利用css、JavaScript及Ajax实现图片预加载的三种方法)