懶加載剖析

懶加載:

懶加載又稱延遲加載,該技術的理念是按需加載。在一些大廠的產品中用的比較多,因為對頁面渲染時間有嚴格限制。

應用懶加載的網站:

淘寶,京東,花瓣,美麗說...

相關概念:

  • 網頁可視區寬(width + padding):
    document.body.clientWidth

  • 網頁占位寬(width + padding + border):
    document.body.offsetWidth

clientWidth/offsetWidth示例
clientWidth/offsetWidth示例
  • 網頁正文全文寬:
    document.body.scrollWidth

  • 網頁正文被卷去的高度:
    其他:document.documentElement.scrollTop
    chrome: document.body.scrollTop
    兼容寫法:document.documentElement.scrollTop || document.body.scrollTop

scrollTop兼容示例
scrollTop兼容示例
  • 獲取元素絕對位置:
    offsetParent:定位父級:離自己最近的有定位的父級元素;沒有手動設置定位父級的時候,默認定位父級為body。
    element.offsetTop:相對于父級的頂部偏移值;
    element.offsetLeft:相對于父級的左側偏移值;
    不存在element.offsetRigthelement.offsetBottom屬性;
獲取定位值
獲取定位值

寬高寫法相同,不一一列舉;

應用場景:

涉及到圖片,falsh資源 , iframe, 網頁編輯器(類似FCK)等占用較大帶寬,且這些模塊暫且不在瀏覽器可視區內,因此可以使用懶加載技術在某個模塊容器到達了網頁可見區域時,再使用ajax異步請求將請求內容渲染出來,避免網頁打開時加載過多資源,讓用戶等待太久。

判斷模塊是否進入可視區:

當用戶瀏覽到首屏之外的其他模塊,也就是其他模塊進入可視區時,異步加載進而渲染資源到頁面。
因此實現懶加載的關鍵點是判斷模塊是否進入可視區,也可以把可視區理解成一個模塊,首屏外的內容為一個模塊,當兩個模塊發生碰撞時即需是加載資源的時機。
盜一張圖解釋說明下兩個模塊的臨界點:

判斷模塊是否進入視口
判斷模塊是否進入視口

引入一個公式,以圖二中的兩個模塊為例:

    //top1 = 文檔頂部卷去的高度;
    //top2 = 元素相對于頂層定位父級的offsetTop值;
    //height1 = 文檔可視區的高度;
    //height2 = 模塊的高度;
    
    m1 = top1 + height1 / 2
    m2 = top2 + height2 / 2
    |m1 - m2| < (height1 + height2) / 2

上面的公式中height1、height2和top2都為常量,只有top1為變量;

    //假設:top1 = 0,top2 = 300, width = height = 300,則:
    m1 = 0 + 300 / 2 = 150;
    m2 = 300 + 300 / 2 = 450;
    |m1 - m2| = (height1 + height2) / 2;
    //此時為臨界點,剛好相等;

    //假設:top1 = 100,top2 = 300, width = height = 300,則:
    m1 = 100 + 300 / 2 = 250;
    m2 = 300 + 300 / 2 = 450;
    |m1 - m2| < (height1 + height2) / 2;
    //值小于時說明相交了;

獲取元素相對于頂層父級的絕對位置:

function getDstResource(ele){
    var l = 0,t = 0, w, h;
    //獲取元素占位寬高
    w = ele.offsetWidth;
    h = ele.offsetHeight;
    while (ele.offsetParent){
        //獲取元素偏移值
        l += ele.offsetLeft;
        t += ele.offsetTop;
        ele = ele.offsetParent;
    }
    return {'left':l,'top':t,'width':w,'height':h};
}

完整代碼:

//獲取可視區
function getVisiableZone(){
    var l,t,w,h;
    l = document.documentElement.scrollLeft || document.body.scrollLeft;
    t = document.documentElement.scrollTop || document.body.scrollTop;
    w = document.documentElement.clientWidth;
    h = document.documentElement.clientHeight;
    return {'left':l,'top':t,'width':w,'height':h};
}

//獲取元素絕對位置
function getDstResource(ele){
    var l = 0,t = 0, w, h;
    //獲取元素占位寬高
    w = ele.offsetWidth;
    h = ele.offsetHeight;
    while (ele.offsetParent){
        //獲取元素偏移值
        l += ele.offsetLeft;
        t += ele.offsetTop;
        ele = ele.offsetParent;
    }
    return {'left':l,'top':t,'width':w,'height':h};
}

//判斷兩個長方形是否交疊
function overlap(rect1,rect2){
    var l1,l2,t1,t2,w,h;
    l1 = rect1.left + rect1.width / 2;
    l2 = rect2.left + rect2.width / 2;
    t1 = rect1.top + rect1.height / 2;
    t2 = rect2.top + rect2.height / 2;
    w = (rect1.width + rect2.width) / 2;
    h = (rect1.height + rect2.height) / 2;
    return Math.abs(l1 - l2) < w && Math.abs(t1 - t2) < h;
}

//異步加載
if(overlap(getVisiableZone(),getDstResource(document.getElementById("xxx")))){
    //相應的處理...
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,784評論 1 92
  • Window和document對象的區別 window對象window對象表示瀏覽器中打開的窗口window對象是...
    FConfidence閱讀 2,237評論 0 5
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,836評論 18 139
  • 作為三年的北漂,見識了北京的繁華、擁堵、霧霾,還有今日的沙塵暴......有時不禁想對北京說句“Dam it!” ...
    pp醬手帳插畫閱讀 526評論 9 8
  • xcodebuild 首先使用xcodebuild命令打出.app,默認工程已經配置好了scheme 參數解釋:-...
    618ecb324f60閱讀 5,551評論 6 7