圖片懶加載實(shí)現(xiàn)及其原理

懶加載或者按需加載凹炸,是一種很好的優(yōu)化網(wǎng)頁或應(yīng)用的方式汞斧。這種方式實(shí)際上是先把你的代碼在一些邏輯斷點(diǎn)處分離開熊咽,然后在一些代碼塊中完成某些操作后漓糙,立即引用或即將引用另外一些新的代碼塊。這樣加快了應(yīng)用的初始加載速度谚咬,減輕了它的總體體積鹦付,因?yàn)槟承┐a塊可能永遠(yuǎn)不會(huì)被加載。

我們之前看到的懶加載一般是這樣的形式:

  • . 瀏覽一個(gè)網(wǎng)頁择卦,準(zhǔn)備往下拖動(dòng)滾動(dòng)條
  • . 拖動(dòng)一個(gè)占位圖片到視窗
  • . 占位圖片被瞬間替換成最終的圖片

我們可以在示例中看到懶加載是如何使用的敲长,網(wǎng)頁首先用一張輕量級(jí)的圖片占位,當(dāng)占位圖片被拖動(dòng)到視窗互捌,瞬間加載目標(biāo)圖片潘明,然后替換占位圖片。
下圖所示 :

黑色的 是占位圖片

當(dāng)用戶滾動(dòng)時(shí) 將隱藏的圖片顯示出來(已經(jīng)進(jìn)行了優(yōu)化 當(dāng)用戶打開網(wǎng)頁時(shí) 會(huì)顯示一部分圖片)先調(diào)用一次 start () 增強(qiáng)用戶體驗(yàn)

image.png

當(dāng)一個(gè)元素出現(xiàn)在我們眼前 小于 窗口高度 加上窗口滾動(dòng)的高度的時(shí)候 就意味著 到達(dá)目標(biāo)點(diǎn) 可以開始加載圖片 或者其他內(nèi)容

對(duì)返回結(jié)果進(jìn)行判斷 結(jié)果為true時(shí) 開始執(zhí)行加載任務(wù) start ()

function isShow($node){
          
            return $node.offset().top <= $(window).height() + $(window).scrollTop()
}

完整代碼如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
    <title>圖片懶加載</title>
</head>
<style>
    .container{
        max-width: 800px;
        margin: 0 auto;
    }
    .container::after {
        content: '';
        display: block;
        clear: both;
    }
    .container img{
        float: left;
        width: 50%;
       
    }
    /* 目標(biāo)元素 */
    h1 {
        clear: both;
    }

</style>
<body>
    <div class="container">
        <img src="http://smashinghub.com/wp-content/uploads/2014/08/cool-loading-animated-gif-3.gif" alt="1"
            data-src="http://cdn.jirengu.com/book.jirengu.com/img/1.jpg">
        <img src="http://smashinghub.com/wp-content/uploads/2014/08/cool-loading-animated-gif-3.gif" alt="2"
            data-src="http://cdn.jirengu.com/book.jirengu.com/img/2.jpg">
        <img src="http://smashinghub.com/wp-content/uploads/2014/08/cool-loading-animated-gif-3.gif" alt="3"
            data-src="http://cdn.jirengu.com/book.jirengu.com/img/3.jpg">
        <img src="http://smashinghub.com/wp-content/uploads/2014/08/cool-loading-animated-gif-3.gif" alt="4"
            data-src="http://cdn.jirengu.com/book.jirengu.com/img/4.jpg">
        <img src="http://smashinghub.com/wp-content/uploads/2014/08/cool-loading-animated-gif-3.gif" alt="5"
            data-src="http://cdn.jirengu.com/book.jirengu.com/img/5.jpg">
        <img src="http://smashinghub.com/wp-content/uploads/2014/08/cool-loading-animated-gif-3.gif" alt="6"
            data-src="http://cdn.jirengu.com/book.jirengu.com/img/6.jpg">
        <img src="http://smashinghub.com/wp-content/uploads/2014/08/cool-loading-animated-gif-3.gif" alt="7"
            data-src="http://cdn.jirengu.com/book.jirengu.com/img/7.jpg">
        <img src="http://smashinghub.com/wp-content/uploads/2014/08/cool-loading-animated-gif-3.gif" alt="8"
            data-src="http://cdn.jirengu.com/book.jirengu.com/img/8.jpg">
            <img src="http://smashinghub.com/wp-content/uploads/2014/08/cool-loading-animated-gif-3.gif" alt="9"
            data-src="http://cdn.jirengu.com/book.jirengu.com/img/15.jpg">
        <img src="http://smashinghub.com/wp-content/uploads/2014/08/cool-loading-animated-gif-3.gif" alt="10"
            data-src="http://cdn.jirengu.com/book.jirengu.com/img/16.jpg">
        <img src="http://smashinghub.com/wp-content/uploads/2014/08/cool-loading-animated-gif-3.gif" alt="11"
            data-src="http://cdn.jirengu.com/book.jirengu.com/img/17.jpg">
        <img src="http://smashinghub.com/wp-content/uploads/2014/08/cool-loading-animated-gif-3.gif" alt="12"
            data-src="http://cdn.jirengu.com/book.jirengu.com/img/18.jpg">       
        <img src="http://smashinghub.com/wp-content/uploads/2014/08/cool-loading-animated-gif-3.gif" alt="13"
            data-src="http://cdn.jirengu.com/book.jirengu.com/img/17.jpg">
        <img src="http://smashinghub.com/wp-content/uploads/2014/08/cool-loading-animated-gif-3.gif" alt="14"
            data-src="http://cdn.jirengu.com/book.jirengu.com/img/18.jpg">     
        <!-- <h1 id="target">hello</h1> -->
        <img src="http://smashinghub.com/wp-content/uploads/2014/08/cool-loading-animated-gif-3.gif" alt="15"
            data-src="http://cdn.jirengu.com/book.jirengu.com/img/15.jpg">
        <img src="http://smashinghub.com/wp-content/uploads/2014/08/cool-loading-animated-gif-3.gif" alt="16"
            data-src="http://cdn.jirengu.com/book.jirengu.com/img/16.jpg">
        <img src="http://smashinghub.com/wp-content/uploads/2014/08/cool-loading-animated-gif-3.gif" alt="17"
            data-src="http://cdn.jirengu.com/book.jirengu.com/img/17.jpg">
        <img src="http://smashinghub.com/wp-content/uploads/2014/08/cool-loading-animated-gif-3.gif" alt="18"
            data-src="http://cdn.jirengu.com/book.jirengu.com/img/18.jpg">  
            <img src="http://smashinghub.com/wp-content/uploads/2014/08/cool-loading-animated-gif-3.gif" alt="15"
            data-src="http://cdn.jirengu.com/book.jirengu.com/img/15.jpg">
        <img src="http://smashinghub.com/wp-content/uploads/2014/08/cool-loading-animated-gif-3.gif" alt="16"
            data-src="http://cdn.jirengu.com/book.jirengu.com/img/16.jpg">
        <img src="http://smashinghub.com/wp-content/uploads/2014/08/cool-loading-animated-gif-3.gif" alt="17"
            data-src="http://cdn.jirengu.com/book.jirengu.com/img/17.jpg">
        <img src="http://smashinghub.com/wp-content/uploads/2014/08/cool-loading-animated-gif-3.gif" alt="18"
            data-src="http://cdn.jirengu.com/book.jirengu.com/img/18.jpg">            
    </div>
    <script>
        //滾動(dòng)事件
          start () //打開頁面 調(diào)用一次 
        $(window).on('scroll',function(){
            start () //滾動(dòng)頁面是 調(diào)用一次   方便管理 
        })
        //加載函數(shù) 
        function start (){
            $('.container img').not('[data-isLoaded]').each(function(){
                var $node = $(this)
               if( isShow( $node) ){
                   //緩沖效果 
                    setTimeout(function(){
                    loadIng( $node)
                    },500)
                
               }
            })
        }
        // 頁面邏輯
        function isShow($node){
            // 當(dāng)一個(gè)元素出現(xiàn)在我們眼前    小于 窗口高度 加上窗口滾動(dòng)的高度的時(shí)候    就意味著  到達(dá)目標(biāo)點(diǎn) 
            // 可以開始加載圖片 或者其他內(nèi)容
            return $node.offset().top <= $(window).height() + $(window).scrollTop()
            
        }
        // 顯示狀態(tài)
        function loadIng($img){
            // 獲取目標(biāo)元素 并替換 
            $img.attr('src', $img.attr('data-src'))
            //性能優(yōu)化   進(jìn)行判斷   已經(jīng)加載的  不會(huì)再進(jìn)行加載  
            $img.attr('data-isLoaded', 1)
        }
    </script>
</body>

</html>

該示例 用jQuery 實(shí)現(xiàn) 秕噪,對(duì)代碼進(jìn)行最大優(yōu)化

//性能優(yōu)化 進(jìn)行判斷 已經(jīng)加載的 不會(huì)再進(jìn)行重復(fù)加載

$img.attr('data-isLoaded', 1)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钳降,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子腌巾,更是在濱河造成了極大的恐慌遂填,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澈蝙,死亡現(xiàn)場離奇詭異吓坚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)灯荧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門礁击,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逗载,你說我怎么就攤上這事哆窿。” “怎么了厉斟?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵挚躯,是天一觀的道長。 經(jīng)常有香客問我擦秽,道長码荔,這世上最難降的妖魔是什么漩勤? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮缩搅,結(jié)果婚禮上越败,老公的妹妹穿的比我還像新娘。我一直安慰自己誉己,他們只是感情好眉尸,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布域蜗。 她就那樣靜靜地躺著巨双,像睡著了一般。 火紅的嫁衣襯著肌膚如雪霉祸。 梳的紋絲不亂的頭發(fā)上筑累,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音丝蹭,去河邊找鬼慢宗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛奔穿,可吹牛的內(nèi)容都是我干的镜沽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼贱田,長吁一口氣:“原來是場噩夢啊……” “哼缅茉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起男摧,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤蔬墩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后耗拓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拇颅,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年乔询,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了樟插。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡竿刁,死狀恐怖黄锤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情们妥,我是刑警寧澤猜扮,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站监婶,受9級(jí)特大地震影響旅赢,放射性物質(zhì)發(fā)生泄漏齿桃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一煮盼、第九天 我趴在偏房一處隱蔽的房頂上張望短纵。 院中可真熱鬧,春花似錦僵控、人聲如沸香到。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悠就。三九已至,卻和暖如春充易,著一層夾襖步出監(jiān)牢的瞬間梗脾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工盹靴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炸茧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓稿静,卻偏偏與公主長得像梭冠,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子改备,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348