非常實用的N張圖片預(yù)加載函數(shù)封裝

作為前端開發(fā)人員,在日常開發(fā)中我們總會與圖片打交道,如果是直接使用圖片的話那是非常簡單的,比如做背景圖之類。然而當(dāng)圖片很多時,比如做一些游戲或者是瀑布流的效果時,如果直接使用會導(dǎo)致圖片還沒加載完成就開始運行程序,這樣會使程序運行紊亂,為了解決這個問題我們需要對圖片進(jìn)行預(yù)加載。

一種簡單的辦法就是把圖片的src值放在一個數(shù)組中,用for循環(huán)對數(shù)組進(jìn)行遍歷,創(chuàng)建圖片對象并將遍歷的src值加到圖片對象的src屬性上,之后在寫一個onload的回調(diào)函數(shù)就可以使用圖片對象了。demo代碼如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            *{
                margin: 0px;
                padding: 0px;
            }
            body,html{
                height: 100%;
            }
            #wrap{
                width: 100%;
                height: 100%;
                background-color: red;
                position: relative;
            }
            #wrap p{
                position: absolute;
                left: 50%;
                top: 50%;
                transform: translate(-50%,-50%);
                font-size: 100px;
                
            }
        </style>
    </head>
    <body>
        <div id="wrap">
            <p>0%</p>
        </div>
        <div id="imgs"></div>
    </body>
    <script type="text/javascript">
        var arr = ["http://www.pp3.cn/uploads/allimg/111116/11021321R-4.jpg","http://img1.imgtn.bdimg.com/it/u=1521482949,816209794&fm=206&gp=0.jpg","http://pic5.nipic.com/20100121/4183722_103138000079_2.jpg","http://www.pp3.cn/uploads/allimg/111112/110G31K5-6.jpg"];
        
        //獲取p標(biāo)簽
        var p = document.querySelector("#wrap p");
        //獲取進(jìn)度條div
        var wrap = document.querySelector("#wrap");
        //獲取imgs的div
        var imgsDiv = document.querySelector("#imgs");
        //存放img對象的數(shù)組
        var imgsArr = [];
        for(var i = 0; i< arr.length; i++){
            //創(chuàng)建img對象
            var img = new Image();
            //給圖片設(shè)置src屬性
            img.src = arr[i];
            //存放img對象
            imgsArr.push(img);
            //圖片預(yù)加載(當(dāng)圖片記載完畢之后,走的回調(diào)調(diào)函數(shù))
            var count = 0;
            img.onload = function(){
                count++;
                //加載圖片百分比
                var rate = count / imgsArr.length * 100 + "%";
                //給p標(biāo)簽設(shè)置內(nèi)容(進(jìn)度)
                p
                .innerHTML = rate;
                
                //當(dāng)所有圖片加載完成之后,拼接到imgs這個div中 
                if(count >= imgsArr.length){
                    //當(dāng)所有圖片都加載完成,隱藏進(jìn)度條div
                    wrap.style.display = "none";
                    for(var j = 0; j < imgsArr.length; j++){
                        //插入img
                        imgsDiv.appendChild(imgsArr[j]);
                    }
                }
            }
            
            
        }
        
        
    </script>
</html>

很明顯如果圖片很多的話,光是寫數(shù)組就會很傷腦筋,而且上面的方法功能性不強,下面介紹一種更好的方法,對此我封裝了一個函數(shù)。

function loadingImg(obj){
   var loadEndImg = {};//定義  加載完成后的圖片對象
   var len = 0; //定義圖片的總張數(shù)
   var prog = 0;//定義加載的進(jìn)度
   for (var i in obj.loadImg){
    len++; //自動計算總張數(shù)
   }
   for (var i in obj.loadImg){
   //創(chuàng)建圖片對象
    var imgObj = new Image();
    imgObj.src = obj.loadImg[i];
    imgObj.key = i;
    imgObj.onload = function (){
     loadEndImg[this.key] = this;
     prog++;
     if (obj.prog){
      obj.prog(parseInt(prog/len*100));
     }
     if (prog>=len&&obj.complete){
      obj.complete(loadEndImg);
     }
    }
   }
  }

使用方法:我們可以自己寫一個對象傳入上面的函數(shù)。

loadingImg({
   loadImg: {
    img1:"img/cross_bg.png",
    img2:"img/game_bg.png",
    img3:"img/goddess0.png",
    img4:"img/goddess1.png",
    img5:"img/goddess2.png"
   },
    prog: function(num){
      $("#prog").html(num+"%");
//      console.log(num);
    if(num==100){
   //此時加載進(jìn)度為100%
    };
    },
   complete:init //加載完成的回調(diào)函數(shù)
  })
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,789評論 25 709
  • 1%的人控制99%的人:告訴你成為1%的人的6個方法 2017-03-21溝通技巧 1.拋掉以前的想法 如果你像9...
    ZhouWG閱讀 355評論 0 0

友情鏈接更多精彩內(nèi)容