中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript實現圖片懶加載的方法分析

發布時間:2020-10-18 22:41:13 來源:腳本之家 閱讀:163 作者:king-w 欄目:web開發

本文實例講述了JavaScript實現圖片懶加載的方法。分享給大家供大家參考,具體如下:

懶加載是非常實用的提升網頁性能的方式,當訪問一個頁面的時候,只顯示可視區域內的圖片,其它的圖片只有出現在可視區域內的時候才會被請求加載。

我們現在用原生的js實現簡單的圖片懶加載,主要利用的原理就是先不給設置src,而是把圖片的路徑放在data-src中,等待圖片被加載的時候將路徑取出放到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>

判斷元素是否在可視區域

方法一:

1. 獲取屏幕可視區高度:document.documentElement.clientHeight
2. 獲取元素距頂部的高度:element.offsetTop
3. 獲取滾動高度:document.documentElement.scrollTop
4. 若滿足:2-3<1,那么元素就出現在可視區域

方法二:

1. 獲取元素到可視區域頂部的距離:var bound = element.getBoundingClientRect()
2. 獲取可視區域的高度:window.innerHeight
3. 若滿足bound.top<=window.innerHeight,那么元素就出現在可視區域

方法三:

利用IntersectionObserver函數自動觀察元素是否在可視區域內

var watch = new IntersectionObserver(callback,option);
//開始觀察
watch.observe(el);
//停止觀察
watch.unobserve(el);
//關閉觀察器
watch.disconnect();

js代碼

第一種很多人都用過,所以我們就用第二種寫一下

//判斷圖片是否出現在可視區域內
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;
    }
}
//函數節流
//函數節流是很重要的思想,可以防止過于頻繁的操作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;
      }
    }
  }
//調用函數
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);
 });
});

更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《JavaScript圖片操作技巧大全》、《JavaScript運動效果與技巧匯總》、《JavaScript切換特效與技巧總結》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數學運算用法總結》

希望本文所述對大家JavaScript程序設計有所幫助。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

嘉义市| 泰来县| 吉安县| 海丰县| 鸡东县| 泗水县| 柏乡县| 延长县| 江都市| 太白县| 东辽县| 扶沟县| 田阳县| 定兴县| 偏关县| 孝感市| 咸宁市| 北碚区| 潼南县| 吴川市| 滨州市| 海林市| 阿拉善左旗| 得荣县| 祁门县| 清原| 安化县| 惠东县| 克东县| 泽库县| 海口市| 永修县| 雷山县| 凌源市| 阳春市| 琼结县| 新余市| 确山县| 满洲里市| 太康县| 武鸣县|