30行Javascript程式碼實現圖片懶載入
前言
頁面太多圖片?那麼請你花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('這些新的節點')));
如果您喜歡這篇文章,那麼記得動動你們的?,給個like或者關注我哦?。
相關文章
- 圖片懶載入實現
- 圖片懶載入js實現JS
- [譯] 原生實現圖片懶載入
- React如何實現圖片懶載入React
- 實現圖片懶載入(throttle, debounce)
- 微信小程式--實現圖片懶載入(lazyload)微信小程式
- 滾動載入圖片(懶載入)實現原理
- 手把手實現圖片懶載入+封裝vue懶載入元件封裝Vue元件
- 圖片懶載入
- 實現圖片懶載入的三種方式
- Vue實現一個圖片懶載入外掛Vue
- 小說APP原始碼的圖片載入方式,懶載入和預載入的實現APP原始碼
- 圖片懶載入(IntersectionObserver)Server
- 圖片懶載入原理
- 圖片預載入和懶載入
- 一起來實現圖片滾動懶載入
- 圖片懶載入踩坑
- 圖片懶載入大白話
- Js圖片懶載入(lazyload)JS
- 單張圖片懶載入
- 小程式之圖片瀑布流(最全實現方式,額外加送懶載入)
- 小程式記憶體問題–圖片懶載入記憶體
- 頁面圖片預載入與懶載入策略
- vue圖片懶載入lazy-loadVue
- 前端優化之圖片懶載入前端優化
- 效能更優越的小程式圖片懶載入方式
- layui圖片懶載入-loading佔點陣圖UI
- 圖片預載入,圖片懶載入,和jsonp中的一個疑問JSON
- 直播平臺搭建,vue中實現圖片懶載入的幾種方法Vue
- Vue圖片懶載入之lazyload外掛使用Vue
- 小程式之圖片懶載入[完美方案,你不來看看?]
- ECMAScript擴充套件 -12 【圖片的預載入與懶載入】套件
- webpack懶載入程式碼原理深究Web
- 【前端優化】js圖片懶載入及優化前端優化JS
- 圖片預載入和懶載入(附上一個小demo瀑布流)
- 如何實現一個圖片載入框架框架
- 如何實現圖片預載入和載入進度條
- 前端效能優化-圖片懶載入(防抖、節流)前端優化