js實現懶加載

懶加載是什麼

就是圖片延遲加載,不少圖片並不須要頁面載入的時候就加載,當用戶滑到該視圖的時候再加載圖片,避免打開網頁時加載過多的資源。html

當頁面一次性要加載不少資源的時候每每要用到懶加載chrome

圖片加載原理

img標籤有一個src屬性,當src不爲空時,瀏覽器就會根據這個值發請求瀏覽器

這裏插播一個小知識點app

//image對象寫在腳本的時候不用插在文檔中,就能夠發送src中的請求
const img = document.createElement('img');
img.src = './1.jpg';
//script對象寫在腳本的時候,要插在文檔中才能發送src中的請求哦
const script = document.createElement('script');
script.src = './test.js';
document.body.appendChild(script);

懶加載實現

思路:首先將src屬性臨時保存在temp-src上,等到想要加載該圖片時,再將temp-src賦值給srccode

首先一個簡單的html結構
<div id="imgOuter">
    <div><img src="" temp-src="./1.JPG"></div>
    <div><img src="" temp-src="./2.JPG"></div>
    <div><img src="" temp-src="./3.JPG"></div>
    <div><img src="" temp-src="./4.JPG"></div>
    <div><img src="" temp-src="./5.JPG"></div>
    <div><img src="" temp-src="./6.JPG"></div>
</div>
代碼實現
1. 經過獲取元素在文檔中的位置、滾輪滾動的距離、視圖大小判斷。

若是 元素在文檔中的top < 滾輪滾動的距離 + 視圖大小 則加載圖片htm

  • 元素在文檔中的位置:element.offsetTop
  • 滾輪滾動的距離:document.documentElement.scrollTop(IE和火狐) / document.body.scroolTop(chrome)
  • 視圖大小: window.innerHeight (ie不可用)/document.documentElement.clientHeight (IE下爲 瀏覽器可視部分高度/Chrome下爲瀏覽器全部內容高度)
let imgList = Array.from(document.getElementById('imgOuter').children);
//能夠加載區域=當前屏幕高度+滾動條已滾動高度
const hasheight = function(){
    const clientHeight = window.innerHeight;
    const top = document.documentElement.scrollTop || document.body.scrollTop;;
    return clientHeight+top;
}
//判斷是否加載圖片,若是加載則加載
const loadImage = function(){
    imgList.forEach(div => {
        const img = div.children[0];
        if(!img.src && div.offsetTop < hasheight()){
        //加載圖片
            img.src = img.attributes['temp-src'].value;
        }
    });
}
//實時監聽滾輪滑動判斷是否須要加載圖片
window.onscroll = function(){
    loadImage();
}
//首屏加載
loadImage();
2. 經過getBoundingClientRect()方法獲取元素大小及位置實現
  • Element.getBoundingClientRect() 返回一個ClientRect的DOMRect對象
  • 對象包含top、right、botton、left、width、height值
  • top、right、botton、left 值都是相對於瀏覽器左上角而言

則 top< 當前視圖的高度時 加載圖片對象

let imgList = Array.from(document.getElementById('imgOuter').children);

//判斷是否加載圖片,若是加載則加載
const loadImage = function(){
    imgList.forEach(div => {
        const img = div.children[0];
        const clientHeight = window.innerHeight;
        const top = div.getBoundingClientRect().top;
        if(!img.src && top < clientHeight){
        //加載圖片
            img.src = img.attributes['temp-src'].value;
        }
    });
}
//實時監聽滾輪滑動判斷是否須要加載圖片
window.onscroll = function(){
    loadImage();
}
//首屏加載
loadImage();
相關文章
相關標籤/搜索