‘我’才"懶"得加載呢 ----- 實現圖片懶加載

什么是懶加載

懶加載是一種 網頁優化技術

作用

圖片作為一種網頁資源,請求時同樣將占用網絡資源,導致網頁首屏的加載時間被拉長

如果一次性將網頁的所有圖片資源加載,會同時間出現大量的圖片請求。而懶加載,則是將圖片的加載,從原先的一口氣加載變成按需加載的模式,減少同時間發起的資源請求,加快頁面打開的速度,優化用戶體驗。

原理

通過JavaScript腳本,使圖片僅在當前可視區域的視窗內出現時才加載該圖片。達到減少首屏首次請求圖片資源的次數的技術就稱為圖片懶加載

https://lanhai1.github.io/archives/ 個人博客

思路

  • 首先獲取圖片元素 保存在一個數組中 方便后面渲染至頁面

  • 封裝函數 => 判斷該圖片是否可以進行加載

  • 封裝函數 => 獲取圖片與窗口的信息
  • 相比較 window的可視高度 是否 大于等于 圖片相對于視窗的top值
  • 返回比較值

  • 封裝函數 => 加載圖片 參數1:元素 參數2:數組索引值
  • 獲取自定義屬性(元素存放src的屬性)
  • 元素賦值正確的src
  • 從數組中刪除已經渲染了的圖片

  • 封裝函數 => 滾動事件
  • 為瀏覽器注冊滾動時間 監測是否繼續懶加載

  • 封裝函數 => 初始化
  • 調用 是否加載圖片函數
  • 調用 滾動事件函數

typescript代碼

// 圖片懶加載類
class LazyLoads {
    imglist: Array<Element>;
    // 構造器
    constructor(public el: string) {
        // 獲取圖片元素 追加至數組
        this.imglist = Array.from(document.querySelectorAll(el)); // 需使用懶加載的圖片集合
    }
    // 判斷該圖片是否可以加載
    canILoad = () => {
        // 循環遍歷數組
        for (let i = this.imglist.length; i--;) {
            this.getBound(this.imglist[i]) && this.loadImage(this.imglist[i], i);
        }
    }
    // 獲取圖片與窗口的信息
    getBound = (el: Element): boolean => {
        // 獲取元素相對于視窗的位置
        let bound = el.getBoundingClientRect();
        // 獲取window可視高度
        let clientHeight = window.innerHeight;
        // 判斷是否需要加載數據
        return (bound.top <= clientHeight);
    }
    // 加載圖片
    loadImage = (el, index: number) => {
        // 獲取自定義屬性
        let src = el.getAttribute('data-lanhai');
        // 賦值
        el.src = src;
        // 刪除已經渲染了的圖片
        this.imglist.splice(index, 1);
    }
    getScroll = () => {
        // 為瀏覽器注冊滾動時間 監測是否繼續懶加載
        window.addEventListener('scroll', () => {
            this.imglist.length && this.canILoad();
        });
    }
    // 初始化
    init = () => {
        this.canILoad();
        this.getScroll();
    }
}
// 實例化對象,參數則是需要使用懶加載的圖片
let start = new LazyLoads('img')
// 初始化
start.init()

編譯后 JavaScript代碼

// 圖片懶加載類
var LazyLoads = /** @class */ (function () {
    // 構造器
    function LazyLoads(el) {
        var _this = this;
        this.el = el;
        // 判斷是否該圖片是否可以加載
        this.canILoad = function () {
            // 循環遍歷數組
            for (var i = _this.imglist.length; i--;) {
                _this.getBound(_this.imglist[i]) && _this.loadImage(_this.imglist[i], i);
            }
        };
        // 獲取圖片與窗口的信息
        this.getBound = function (el) {
            // 獲取元素相對于視窗的位置
            var bound = el.getBoundingClientRect();
            // 獲取window可視高度
            var clientHeight = window.innerHeight;
            // 判斷是否需要加載數據
            return (bound.top <= clientHeight);
        };
        // 加載圖片
        this.loadImage = function (el, index) {
            // 獲取自定義屬性
            var src = el.getAttribute('data-lanhai');
            // 賦值
            el.src = src;
            // 刪除已經渲染了的圖片
            _this.imglist.splice(index, 1);
        };
        this.getScroll = function () {
            // 為瀏覽器注冊滾動時間 監測是否繼續懶加載
            window.addEventListener('scroll', function () {
                _this.imglist.length && _this.canILoad();
            });
        };
        // 初始化
        this.init = function () {
            _this.canILoad();
            _this.getScroll();
        };
        // 獲取圖片元素 追加至數組
        this.imglist = Array.from(document.querySelectorAll(el)); // 需使用懶加載的圖片集合
    }
    return LazyLoads;
}());
// 實例化對象,參數則是需要使用懶加載的圖片
var start = new LazyLoads('img');
// 初始化
start.init();

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容