JavaScript實現圖片懶加載的三種方案詳解
一、前言
圖片懶加載,當圖片出現在可視區(qū)域再進行加載,提升用戶的體驗。因為有些用戶不會看完圖片,全部加載會浪費流量。在網上查閱資料,總結了三種辦法,有各自的利弊,下文一一介紹。
方法 | 優(yōu)點 | 缺點 | 推薦指數 |
---|---|---|---|
設置img loading | h5的屬性,沒有兼容問題 | 需要已知圖片高度、寬高比 | ???? |
IntersectionObserver API | 無需知道圖片高度 | 低版本需引入polyfill | ?????? |
vue-lazyload 自定義指令 | 無需知道圖片高度 | github現存issues較多,沒有解決 | ???? |
二、實現方式及Demo
1. 設置img標簽loading屬性
loading屬性允許兩個值:eager
立即加載圖像(默認值);lazy
延遲加載圖像。在使用lazy屬性的時候,需要設置<img>
標簽的高度,否則無法懶加載。
注意: 適用于兩種場景,圖片高度已知、圖片寬高比已知。
已知圖片高度
<style> .img-box img { width: 100%; height: 700px; /*設置為圖片的真實高度*/ } </style> <div class="img-box"> <img src="https://i.postimg.cc/GtN3Cs02/1.jpg" loading="lazy" /> <img src="https://i.postimg.cc/hGdKLGdW/2.jpg" loading="lazy" /> <img src="https://i.postimg.cc/T1SkJTbF/3.jpg" loading="lazy" /> <img src="https://i.postimg.cc/wxPFPTtb/4.jpg" loading="lazy" /> <img src="https://i.postimg.cc/FRkGF28x/5.jpg" loading="lazy" /> <img src="https://i.postimg.cc/05JH9wqq/6.jpg" loading="lazy" /> </div>
已知圖片寬高比
<style> .img-box div { position: relative; padding-top: 66%; /* (你的圖片的高度/寬度值) */ overflow: hidden; } .img-box img { position: absolute; top:0; right:0; width:100%; } </style> <div class="img-box"> <div> <img src="https://i.postimg.cc/GtN3Cs02/1.jpg" loading="lazy" /> </div> <div> <img src="https://i.postimg.cc/hGdKLGdW/2.jpg" loading="lazy" /> </div> <div> <img src="https://i.postimg.cc/T1SkJTbF/3.jpg" loading="lazy" /> </div> <div> <img src="https://i.postimg.cc/wxPFPTtb/4.jpg" loading="lazy" /> </div> <div> <img src="https://i.postimg.cc/FRkGF28x/5.jpg" loading="lazy" /> </div> <div> <img src="https://i.postimg.cc/05JH9wqq/6.jpg" loading="lazy" /> </div> </div>
2. 使用 IntersectionObserver
IntersectionObserver接口,可以觀察DOM節(jié)點是否出現在視口,當DOM節(jié)點出現在視口中才加載圖片。img必須有高度,否則圖片默認都在視口中,會將圖片全部加載??梢栽O置img的src為base64白色圖片,然后在替換為真實的圖片地址。
注意: 不需要預先知道圖片的高度,但是有兼容性問題,低版本需要引入intersection-observer polyfill
已知圖片高度
<style> .img-box .lazy-img { width: 100%; height: 600px; /*如果已知圖片高度可以設置*/ } </style> <div class="img-box"> <img class="lazy-img" data-origin="https://images.djtest.cn/pic/test/d48aed7c991b43d850d011f2299d852e.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/> <img class="lazy-img" data-origin="https://images.djtest.cn/pic/test/a588b152c79ac60162ecbdf82b060061.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/> <img class="lazy-img" data-origin="https://images.djtest.cn/pic/test/eacbc2cd4b6ca636077378182bdfcc88.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/> <img class="lazy-img" data-origin="https://images.djtest.cn/pic/test/751470f4b478450e8556f78cd7dd3d96.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/> <img class="lazy-img" data-origin="https://images.djtest.cn/pic/test/e4a531bee5694a4a01dee74b18bbfd8b.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/> <img class="lazy-img" data-origin="https://images.djtest.cn/pic/test/7d8f107e827a7beaa0b9d231bfa4187f.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/> <img class="lazy-img" data-origin="https://images.djtest.cn/pic/test/4f7586f6b74f2bd0b94004fcbae69856.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/> <img class="lazy-img" data-origin="https://images.djtest.cn/pic/test/863849e14e7e8903ed4b27fcbdafe8b0.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/> <img class="lazy-img" data-origin="https://images.djtest.cn/pic/test/d8bb17fe9a7223f35075014ef250e2fa.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/> </div> <script> function Observer() { let images = document.querySelectorAll(".lazy-img"); let observer = new IntersectionObserver(entries => { entries.forEach(item => { if (item.isIntersecting) { item.target.src = item.target.dataset.origin; // 開始加載圖片,把data-origin的值放到src observer.unobserve(item.target); // 停止監(jiān)聽已開始加載的圖片 } }); }); images.forEach(img => observer.observe(img)); } Observer() </script>
3. 使用vue-lazyload
在vue2中使用時,建議安裝npm i vue-lazyload@1.3.3 -s
,使用高版本在main.js
中全局自定義指令后依然無法使用指令。在vue3中可以使用 npm i vue3-lazy -s
。
全局注冊自定義指令,在頁面就可以使用了
// 全局自定義指令 import Vue from 'vue' import VueLazyload from 'vue-lazyload' Vue.use(VueLazyload, { preLoad: 1, observer: true // 設置為true,內部使用IntersectionObserver。默認使用 })
/* 在頁面中直接使用 */ <div> <img v-lazy="https://images.djtest.cn/pic/test/d48aed7c991b43d850d011f2299d852e.jpg"> <img v-lazy="https://images.djtest.cn/pic/test/a588b152c79ac60162ecbdf82b060061.jpg"> <img v-lazy="https://images.djtest.cn/pic/test/eacbc2cd4b6ca636077378182bdfcc88.jpg"> <img v-lazy="https://images.djtest.cn/pic/test/751470f4b478450e8556f78cd7dd3d96.jpg"> </div>
以上就是JavaScript實現圖片懶加載的三種方案詳解的詳細內容,更多關于JavaScript圖片懶加載的資料請關注腳本之家其它相關文章!
相關文章
Selenium執(zhí)行Javascript腳本參數及返回值過程詳解
這篇文章主要介紹了Selenium執(zhí)行Javascript腳本參數及返回值過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04