30行Javascript程式碼實現圖片懶載入
阿新 • • 發佈:2018-12-24
小編推薦:Fundebug專注於JavaScript、微信小程式、微信小遊戲,Node.js和Java實時BUG監控。真的是一個很好用的bug監控費服務,眾多大佬公司都在使用。
前言
頁面太多圖片?那麼請你花20分鐘去優化一下頁面的效能
講道理,當你為圖片的src賦值時,DOM節點渲染完畢時就會主動去請求src指向的資源,即使該圖片不在使用者的可視範圍。那麼,如果圖片太多,載入頁面的速度會就會變慢。
效果圖
lazyload.gif
讓我們看開啟chrome的debug看看network面板
bb.gif
原理
- 將資源路徑賦值到img標籤的data-xx屬性中,而不是src屬性
- 獲取img節點距離瀏覽器頂部的距離,如果小於或等於瀏覽器視窗的可視高度,那麼就將data-xx的值賦值到src裡去
用到的Web API
程式碼
html
// img-warpper * 5, 每張gif連結都不一樣 <div class="img-warpper"> <img class="lazyload" data-original="https://media3.giphy.com/media/k5GuJn7VslbpGQqHUB/200w.webp"> </div> <div class="img-warpper"> <img class="lazyload" data-original="https://media1.giphy.com/media/2A7yoKf2B87kotTApZ/200w.webp"> </div> <div class="img-warpper"> <img class="lazyload" data-original="https://media2.giphy.com/media/3h1rwFW1PpLxD9xLUR/200w.webp"> </div> <div class="img-warpper"> <img class="lazyload" data-original="https://media0.giphy.com/media/igHgY3xzYxmRcxwZBs/200w.webp"> </div> <div class="img-warpper"> <img class="lazyload" data-original="https://media0.giphy.com/media/69v5dFsLtzdpaFZz2N/200w.webp"> </div>
css
body {
text-align: center;
}
img {
width: 100%;
max-width: 300px;
height: 200px;
margin-bottom: 100px; // 為了方便看效果,將圖片儘可能的撐開
}
javascript
// 圖片懶載入類 class LazyLoad { constructor(el) { this.imglist = Array.from(document.querySelectorAll(el)); // 需使用懶載入的圖片集合 this.init(); // 初始化 } // 判斷是否該圖片是否可以載入 canILoad() { let imglist = this.imglist; for (let i = imglist.length; i--;) { // 縮寫,相當於if true this.getBound(imglist[i]) && this.loadImage(imglist[i], i); } } // 獲取圖片與視窗的資訊 getBound(el) { let bound = el.getBoundingClientRect(); let clientHeight = window.innerHeight; // 圖片距離頂部的距離 <= 瀏覽器視覺化的高度,從而推算出是否需要載入 return bound.top <= clientHeight - 100; // -100是為了看到效果,您也可以去掉 } // 載入圖片 loadImage(el, index) { // 獲取之前設定好的data-original值 let src = el.getAttribute('data-original'); // 賦值到src,從而請求資源 el.src = src; // 避免重複判斷,已經確定載入的圖片應當從imglist移除 this.imglist.splice(index, 1); } // 當瀏覽器滾動的時候,繼續判斷 bindEvent() { window.addEventListener('scroll', () => { this.imglist.length && this.canILoad(); }); } // 初始化 init() { this.canILoad(); this.bindEvent(); } } // 例項化物件,引數則是需要使用懶載入的圖片類名,s const lazy = new LazyLoad('.lazyload')
非同步載入的圖片怎麼使用
- 基本操作,非同步獲取圖片連結
- 動態插入節點
- 獲取這些新新增的節點
3.1 給新新增的節點做一些標記,如類名或者屬性 - lazy.imglist.push(Array.from(document.querySelectorAll('這些新的節點')));
作者:daydreammoon
連結:https://www.jianshu.com/p/013b86e04849
關於Fundebug
Fundebug專注於JavaScript、微信小程式、微信小遊戲、支付寶小程式、React Native、Node.js和Java實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了9億+錯誤事件,得到了Google、360、金山軟體、百姓網等眾多知名使用者的認可。歡迎免費試用!