JavaScript實現(xiàn)圖片懶加載的方法分析
本文實例講述了JavaScript實現(xiàn)圖片懶加載的方法。分享給大家供大家參考,具體如下:
懶加載是非常實用的提升網(wǎng)頁性能的方式,當(dāng)訪問一個頁面的時候,只顯示可視區(qū)域內(nèi)的圖片,其它的圖片只有出現(xiàn)在可視區(qū)域內(nèi)的時候才會被請求加載。
我們現(xiàn)在用原生的js實現(xiàn)簡單的圖片懶加載,主要利用的原理就是先不給設(shè)置src,而是把圖片的路徑放在data-src中,等待圖片被加載的時候?qū)⒙窂饺〕龇诺?span style="color: #0000ff">src中。
HTML代碼
<div class="container"> <div class="img-area"> <img class="my-photo" alt="loading" data-src="img/img1.png"> </div> <div class="img-area"> <img class="my-photo" alt="loading" data-src="img/img2.png"> </div> <div class="img-area"> <img class="my-photo" alt="loading" data-src="img/img3.png"> </div> <div class="img-area"> <img class="my-photo" alt="loading" data-src="img/img4.png"> </div> <div class="img-area"> <img class="my-photo" alt="loading" data-src="img/img5.png"> </div> </div>
判斷元素是否在可視區(qū)域
方法一:
1. 獲取屏幕可視區(qū)高度:document.documentElement.clientHeight
2. 獲取元素距頂部的高度:element.offsetTop
3. 獲取滾動高度:document.documentElement.scrollTop
4. 若滿足:2-3<1,那么元素就出現(xiàn)在可視區(qū)域
方法二:
1. 獲取元素到可視區(qū)域頂部的距離:var bound = element.getBoundingClientRect()
2. 獲取可視區(qū)域的高度:window.innerHeight
3. 若滿足bound.top<=window.innerHeight,那么元素就出現(xiàn)在可視區(qū)域
方法三:
利用IntersectionObserver函數(shù)自動觀察元素是否在可視區(qū)域內(nèi)
var watch = new IntersectionObserver(callback,option); //開始觀察 watch.observe(el); //停止觀察 watch.unobserve(el); //關(guān)閉觀察器 watch.disconnect();
js代碼
第一種很多人都用過,所以我們就用第二種寫一下
//判斷圖片是否出現(xiàn)在可視區(qū)域內(nèi)
function isInSight(el) {
const bound = el.getBoundingClientRect();
const clientHeight = window.innerHeight;
return bound.top <= clientHeight + 100;
}
//加載圖片
let index = 0;
function checkImgs() {
const imgs = document.querySelectorAll('.my-photo');
for( let i = index; i < imgs.length; i++){
if(isInSight(imgs[i])){
loadImg(imgs[i]);
index = i;
}
}
}
function loadImg(el) {
if(!el.src){
const source = el.dataset.src;
el.src = source;
}
}
//函數(shù)節(jié)流
//函數(shù)節(jié)流是很重要的思想,可以防止過于頻繁的操作dom
function throttle(fn,mustRun = 500) {
const timer = null;
let previous = null;
return function () {
const now = new Date();
const context = this;
const args = arguments;
if(!previous){
previous = now;
}
const remaining = now -previous;
if(mustRun && remaining >= mustRun){
fn.apply(context,args);
previous = now;
}
}
}
//調(diào)用函數(shù)
window.onload=checkImgs;
window.onscroll = throttle(checkImgs);
我們在用第三種方法寫一個demo
function checkImgs() {
const imgs = Array.from(document.querySelectorAll(".my-photo"));
imgs.forEach(item => io.observe(item));
}
function loadImg(el) {
if (!el.src) {
const source = el.dataset.src;
el.src = source;
}
}
const io = new IntersectionObserver(ioes => {
ioes.forEach(ioe => {
const el = ioe.target;
const intersectionRatio = ioe.intersectionRatio;
if (intersectionRatio > 0 && intersectionRatio <= 1) {
loadImg(el);
}
el.onload = el.onerror = () => io.unobserve(el);
});
});
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript圖片操作技巧大全》、《JavaScript運(yùn)動效果與技巧匯總》、《JavaScript切換特效與技巧總結(jié)》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計有所幫助。
- JS實現(xiàn)圖片懶加載(lazyload)過程詳解
- JS圖片懶加載的優(yōu)點(diǎn)及實現(xiàn)原理
- 基于純JS實現(xiàn)多張圖片的懶加載Lazy過程解析
- Python爬蟲圖片懶加載技術(shù) selenium和PhantomJS解析
- 原生JS實現(xiàn)圖片懶加載之頁面性能優(yōu)化
- 圖片懶加載imgLazyLoading.js使用詳解
- 深入研究jQuery圖片懶加載 lazyload.js使用方法
- js實現(xiàn)圖片懶加載效果
- 快速實現(xiàn)JS圖片懶加載(可視區(qū)域加載)示例代碼
- JavaScript實現(xiàn)圖片懶加載(Lazyload)
- js 圖片懶加載的實現(xiàn)
相關(guān)文章
Java 正則表達(dá)式學(xué)習(xí)總結(jié)和一些小例子
字符串處理是許多程序中非常重要的一部分,它們可以用于文本顯示,數(shù)據(jù)表示,查找鍵和很多目的.在Unix下,用戶可以使用正則表達(dá)式的強(qiáng)健功能實現(xiàn)這些 目的2012-09-09
Google Map Api和GOOGLE Search Api整合實現(xiàn)代碼
將GOOGLE MAP API 和 GOOGLE Search API 進(jìn)行整合,我用面向?qū)ο蟮姆绞綄懥艘粋€類,通過傳一個經(jīng)緯度進(jìn)去,自動通過GOOGLE LOCAL SEARCH獲取附近的相關(guān)信息。比如餐廳、景點(diǎn)等,反過來標(biāo)到地圖上,并可在任意容器內(nèi)顯示。2009-07-07
JavaScript必知必會(三) String .的方法來自何方
這篇文章主要介紹了JavaScript必知必會(三) String .的方法來自何方的相關(guān)資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-06-06
javascript function(函數(shù)類型)使用與注意事項小結(jié)
這篇文章主要介紹了javascript function(函數(shù)類型)使用與注意事項,結(jié)合實例形式較為詳細(xì)的分析了Function(函數(shù))類型的基本聲明、屬性、方法相關(guān)操作技巧與使用注意事項,需要的朋友可以參考下2019-06-06

