成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

圖片懶加載通俗易懂

NervosNetwork / 692人閱讀

摘要:懶加載的意義這里懶的意思可以理解為延遲,如淘寶京東這些電商平臺有大量的圖片,如果上來就加載服務(wù)器表示壓力山大,所以就想出了懶加載這種克敵之法,用戶滾動到的區(qū)域才發(fā)送請求加載內(nèi)容原理將頁面中的標(biāo)簽指向一張小照片或者為空都可以,然后寫一個自定義

懶加載的意義

這里‘懶’的意思可以理解為延遲,如淘寶、京東這些電商平臺有大量的圖片,如果上來就加載服務(wù)器表示壓力山大,所以就想出了懶加載這種克敵之法,用戶滾動到的區(qū)域才發(fā)送請求加載內(nèi)容

原理

將頁面中的img標(biāo)簽src指向一張小照片或者為空都可以,然后寫一個自定義屬性比如(data-src)指向正確的圖片,其實就是用正確的照片替換src里面的照片

代碼

在寫代碼前,需要了解各種高度。先看這篇文章js坐標(biāo)位置

    
    
    Document
    


    
        
        
        
        
        
        
        
        
javascript
    var num = document.getElementsByTagName("img").length;
    var img = document.getElementsByTagName("img");
    var n = 0; //存儲圖片加載到的位置,避免每次都從第一張圖片開始遍歷
    lazyload(); //頁面載入完畢加載可是區(qū)域內(nèi)的圖片
    window.onscroll = lazyload;
    function lazyload() { //監(jiān)聽頁面滾動事件
        var seeHeight = document.documentElement.clientHeight; //可見區(qū)域高度
        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; //滾動條距離頂部高度
        for (var i = n; i < num; i++) {
            if (img[i].offsetTop < seeHeight + scrollTop) {
                if (img[i].getAttribute("src") == "") {
                    img[i].src = img[i].getAttribute("data-src");
                }
                n = i + 1;
            }
        }
    }
使用節(jié)流函數(shù)進(jìn)行性能優(yōu)化

如果直接將函數(shù)綁定在scroll事件上,當(dāng)頁面滾動時,函數(shù)會被高頻觸發(fā),這非常影響瀏覽器的性能。
我想實現(xiàn)限制觸發(fā)頻率,來優(yōu)化性能。

節(jié)流函數(shù):只允許一個函數(shù)在N秒內(nèi)執(zhí)行一次。下面是一個通俗易通的節(jié)流函數(shù):

    var num = document.getElementsByTagName("img").length;
    var img = document.getElementsByTagName("img");
    var n = 0; //存儲圖片加載到的位置,避免每次都從第一張圖片開始遍歷
    resizehandler(); //頁面載入完畢加載可是區(qū)域內(nèi)的圖片
    n=0;
    function resizehandler(){
        var seeHeight = document.documentElement.clientHeight; //可見區(qū)域高度
        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; //滾動條距離頂部高度
        for (var i = n; i < num; i++) {
            if (img[i].offsetTop < seeHeight + scrollTop) {
                if (img[i].getAttribute("src") == "") {
                    img[i].src = img[i].getAttribute("data-src");
                }
                n = i + 1;
            }
        }
    }
    function throttle(method,context){
        clearTimeout(method.tId);
        method.tId=setTimeout(function(){
            method.call(context);
        },500);
    }
    window.onscroll=function(){
        throttle(resizehandler,window);
    }
函數(shù)節(jié)流方案以下三種 時間戳方案
    var num = document.getElementsByTagName("img").length;
    var img = document.getElementsByTagName("img");
    var n = 0; //存儲圖片加載到的位置,避免每次都從第一張圖片開始遍歷
    lazyload(); //頁面載入完畢加載可是區(qū)域內(nèi)的圖片
    function lazyload() { //監(jiān)聽頁面滾動事件
        var seeHeight = document.documentElement.clientHeight; //可見區(qū)域高度
        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; //滾動條距離頂部高度
        for (var i = n; i < num; i++) {
            if (img[i].offsetTop < seeHeight + scrollTop) {
                if (img[i].getAttribute("src") == "") {
                    img[i].src = img[i].getAttribute("data-src");
                }
                n = i + 1;
            }
        }
    }
---------------------------------  以上代碼不在重復(fù)  --------------------------------
    var throttle = function(fun,delay){
        var perv = Date.now();
        return function(){
            var context = this;
            var now = Date.now();
            if (now-perv >= delay){
                fun.apply(context,arguments)
                prev = Date.now();
            }
        }
    }
    window.addEventListener("scroll",throttle(lazyload,1000))
定時器方案
    var throttle = function(fun,delay){
        var timer = null;
        return function(){
            var context = this;
            if(!timer){
                timer = setTimeout(function(){
                    fun.apply(context,arguments)
                    timer = null
                },delay)
            }
        }
    }
    window.addEventListener("scroll",throttle(lazyload,1000))
時間戳+定時器方案
    var throttle = function(fun,delay){
        var timer = null;
        var startTime = Date.now();
        return function() {
                var curTime = Date.now();
                var remaining = delay - (curTime - startTime);
                var context = this;
                var args = arguments;
                clearTimeout(timer);
                if (remaining <= 0) {
                        fun.apply(context, args);
                        startTime = Date.now();
                } else {
                        timer = setTimeout(fun, remaining);
                }
        }
    }
    window.addEventListener("scroll",throttle(lazyload,1000))

參考資料

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/101703.html

相關(guān)文章

  • lozad.js:加載神器

    摘要:是基于的輕量級高性能可配置的純并且無依賴的懶加載器,其能夠被用于進(jìn)行圖片等多種形式的元素。在上,至今短短的一個月的時間,已經(jīng)收獲了的。傳送門阮一峰老師使用教程懶加載懶加載其實就是延遲加載。 showImg(https://github.com/ApoorvSaxena/lozad.js/raw/master/banner/lozad-banner.jpg); Lozad.js 是基于 ...

    Magicer 評論0 收藏0
  • 前端基礎(chǔ)入門

    摘要:手把手教你做個人火的時候,隨便一個都能賺的盆滿缽滿,但是,個人沒有服務(wù)端,沒有美工,似乎就不能開發(fā)了,真的是這樣的嗎秘密花園經(jīng)典的中文手冊。涵蓋前端知識體系知識結(jié)構(gòu)圖書推薦以及入門視頻教程,全的簡直不要不要的了。 JavaScript 實現(xiàn)點擊按鈕復(fù)制指定區(qū)域文本 html5 的 webAPI 接口可以很輕松的使用短短的幾行代碼就實現(xiàn)點擊按鈕復(fù)制區(qū)域文本的功能,不需要依賴 flash。...

    shinezejian 評論0 收藏0
  • 通俗的方式理解關(guān)鍵渲染路徑

    摘要:縮短的長度能夠有效降低首屏?xí)r間。即便你使用打包工具只引用了一個外部腳本文件,但是如果這個腳本文件的傳輸延遲和執(zhí)行延遲,會導(dǎo)致后面的非關(guān)鍵資源的請求被延遲,雖然這不會減慢的首屏?xí)r間。 以通俗的方式理解關(guān)鍵渲染路徑 我在看了 google 的 Critical Rendering Path (中文)后, 想把 CRP(Critical Rendering Path) 用通俗易懂的方式描述出...

    Thanatos 評論0 收藏0

發(fā)表評論

0條評論

NervosNetwork

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<