移動端圖片延遲加載


由於國內的電信網絡性價比的限制,和手機處理能力的差異,在設計一個無線應用的時候,

為用戶節省流量是一個非常重要的考慮因素。可以說每一個字節都應該為客戶端節省。

節約流量可以從以下幾個方面關注:

一、使用緩存 比如 利用瀏覽器本地存儲 前面已經討論過

二、延遲加載代碼 (觸底檢測,通過接口獲取數據)

三、資源的延遲加載,圖片出現在可視區域再加載,(不考慮自動播放的情況下)音頻視頻按用戶點擊加載。

今天簡單說一下圖片延遲加載的實現方式。

例子基於jQuery 和 jQuery mobile 

原理:用戶滑動屏幕,屏幕滾動結束(用jQuery 提供的 window scrollstop 事件合適 ) 檢測出現在viewport中的圖片。

替換圖片的 真正 src 屬性即可。

技巧:滾動結束之后不要立即檢測加載,設置一秒延時,也許用戶會立即開始下一次滾屏,基於現在的網絡環境,1秒的延時可以說明用戶真正想查看這些內容。用微信的朋友可以仔細體驗一下這一點。

由於有時鍾的控制,當用戶頻繁快速翻動屏幕,不會發大量請求。

主要代碼:

var refreshTimer = null,
	mebook = mebook || {};

/*
*滾動結束 屏幕靜止一秒后檢測哪些圖片出現在viewport中
*和PC端不同 由於無線速度限制 和手機運算能力的差異 1秒鍾的延遲對手機端的用戶來說可以忍受
*/
$(window).on('scrollstop', function () {
	if (refreshTimer) {
		clearTimeout(refreshTimer);
		refreshTimer = null;
	}
	refreshTimer = setTimeout(refreshAll, 1e3);
});
	
	
$.belowthefold = function (element) {
    var fold = $(window).height() + $(window).scrollTop();
    return fold <= $(element).offset().top;
};

$.abovethetop = function (element) {
    var top = $(window).scrollTop();
    return top >= $(element).offset().top + $(element).height();
};

/*
*判斷元素是否出現在viewport中 依賴於上兩個擴展方法 
*/
$.inViewport = function (element) {
    return !$.belowthefold(element) && !$.abovethetop(element)
};

mebook.getInViewportList = function () {
    var list = $('#bookList li'),
        ret = [];
    list.each(function (i) {
        var li = list.eq(i);
        if ($.inViewport(li)) {
            mebook.loadImg(li);
        }
    });
};

mebook.loadImg = function (li) {
    if (li.find('img[_src]').length) {
        var img = li.find('img[_src]'),
            src = img.attr('_src');
        img.attr('src', src).load(function () {
            img.removeAttr('_src');
        });
    }
};

應用實例 

手機掃描二維碼:

二維碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM