‘我’才"懶"得加載呢 ----- 實現(xiàn)圖片懶加載

什么是懶加載

懶加載是一種 網(wǎng)頁優(yōu)化技術(shù)

作用

圖片作為一種網(wǎng)頁資源哮伟,請求時同樣將占用網(wǎng)絡(luò)資源亮蒋,導(dǎo)致網(wǎng)頁首屏的加載時間被拉長献幔。

如果一次性將網(wǎng)頁的所有圖片資源加載煮寡,會同時間出現(xiàn)大量的圖片請求虹蓄。而懶加載,則是將圖片的加載幸撕,從原先的一口氣加載變成按需加載的模式薇组,減少同時間發(fā)起的資源請求,加快頁面打開的速度坐儿,優(yōu)化用戶體驗律胀。

原理

通過JavaScript腳本,使圖片僅在當(dāng)前可視區(qū)域的視窗內(nèi)出現(xiàn)時才加載該圖片挑童。達到減少首屏首次請求圖片資源的次數(shù)的技術(shù)就稱為圖片懶加載

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

思路

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

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

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

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

  • 封裝函數(shù) => 滾動事件
  • 為瀏覽器注冊滾動時間 監(jiān)測是否繼續(xù)懶加載

  • 封裝函數(shù) => 初始化
  • 調(diào)用 是否加載圖片函數(shù)
  • 調(diào)用 滾動事件函數(shù)

typescript代碼

// 圖片懶加載類
class LazyLoads {
    imglist: Array<Element>;
    // 構(gòu)造器
    constructor(public el: string) {
        // 獲取圖片元素 追加至數(shù)組
        this.imglist = Array.from(document.querySelectorAll(el)); // 需使用懶加載的圖片集合
    }
    // 判斷該圖片是否可以加載
    canILoad = () => {
        // 循環(huán)遍歷數(shù)組
        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;
        // 判斷是否需要加載數(shù)據(jù)
        return (bound.top <= clientHeight);
    }
    // 加載圖片
    loadImage = (el, index: number) => {
        // 獲取自定義屬性
        let src = el.getAttribute('data-lanhai');
        // 賦值
        el.src = src;
        // 刪除已經(jīng)渲染了的圖片
        this.imglist.splice(index, 1);
    }
    getScroll = () => {
        // 為瀏覽器注冊滾動時間 監(jiān)測是否繼續(xù)懶加載
        window.addEventListener('scroll', () => {
            this.imglist.length && this.canILoad();
        });
    }
    // 初始化
    init = () => {
        this.canILoad();
        this.getScroll();
    }
}
// 實例化對象累铅,參數(shù)則是需要使用懶加載的圖片
let start = new LazyLoads('img')
// 初始化
start.init()

編譯后 JavaScript代碼

// 圖片懶加載類
var LazyLoads = /** @class */ (function () {
    // 構(gòu)造器
    function LazyLoads(el) {
        var _this = this;
        this.el = el;
        // 判斷是否該圖片是否可以加載
        this.canILoad = function () {
            // 循環(huán)遍歷數(shù)組
            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;
            // 判斷是否需要加載數(shù)據(jù)
            return (bound.top <= clientHeight);
        };
        // 加載圖片
        this.loadImage = function (el, index) {
            // 獲取自定義屬性
            var src = el.getAttribute('data-lanhai');
            // 賦值
            el.src = src;
            // 刪除已經(jīng)渲染了的圖片
            _this.imglist.splice(index, 1);
        };
        this.getScroll = function () {
            // 為瀏覽器注冊滾動時間 監(jiān)測是否繼續(xù)懶加載
            window.addEventListener('scroll', function () {
                _this.imglist.length && _this.canILoad();
            });
        };
        // 初始化
        this.init = function () {
            _this.canILoad();
            _this.getScroll();
        };
        // 獲取圖片元素 追加至數(shù)組
        this.imglist = Array.from(document.querySelectorAll(el)); // 需使用懶加載的圖片集合
    }
    return LazyLoads;
}());
// 實例化對象,參數(shù)則是需要使用懶加載的圖片
var start = new LazyLoads('img');
// 初始化
start.init();

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末站叼,一起剝皮案震驚了整個濱河市娃兽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌尽楔,老刑警劉巖投储,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異阔馋,居然都是意外死亡玛荞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門呕寝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勋眯,“玉大人,你說我怎么就攤上這事下梢】吞#” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵孽江,是天一觀的道長讶坯。 經(jīng)常有香客問我,道長岗屏,這世上最難降的妖魔是什么辆琅? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任漱办,我火速辦了婚禮,結(jié)果婚禮上婉烟,老公的妹妹穿的比我還像新娘娩井。我一直安慰自己,他們只是感情好隅很,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布撞牢。 她就那樣靜靜地躺著,像睡著了一般叔营。 火紅的嫁衣襯著肌膚如雪屋彪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天绒尊,我揣著相機與錄音畜挥,去河邊找鬼。 笑死婴谱,一個胖子當(dāng)著我的面吹牛蟹但,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谭羔,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼华糖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瘟裸?” 一聲冷哼從身側(cè)響起客叉,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎话告,沒想到半個月后兼搏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡沙郭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年佛呻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片病线。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡吓著,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出送挑,到底是詐尸還是另有隱情夜矗,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布让虐,位于F島的核電站,受9級特大地震影響罢荡,放射性物質(zhì)發(fā)生泄漏赡突。R本人自食惡果不足惜对扶,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惭缰。 院中可真熱鬧浪南,春花似錦、人聲如沸漱受。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昂羡。三九已至絮记,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間虐先,已是汗流浹背怨愤。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蛹批,地道東北人撰洗。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像腐芍,于是被迫代替她去往敵國和親差导。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容