利用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

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

<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。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容