最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js圖片延遲加載(Lazyload)三種實現(xiàn)方式

 更新時間:2017年03月01日 11:58:36   作者:小小趙老漢  
這篇文章主要介紹了js延遲加載(Lazyload)三種實現(xiàn)方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下。

延遲加載也稱為惰性加載,即在長網(wǎng)頁中延遲加載圖像。

用戶滾動到它們之前,視口外的圖像不會加載。

這與圖像預加載相反,在長網(wǎng)頁上使用延遲加載將使網(wǎng)頁加載更快。

在某些情況下,它還可以幫助減少服務器負載。

延遲加載的優(yōu)點:

提升用戶的體驗,如果圖片數(shù)量較大,打開頁面的時候要將將頁面上所有的圖片全部獲取加載,很可能會出現(xiàn)卡頓現(xiàn)象,影響用戶體驗。因此,有選擇性地請求圖片,這樣能明顯減少了服務器的壓力和流量,也能夠減小瀏覽器的負擔。

方法一

將頁面上所有圖片的src屬性設置為loading.gif,而圖片的真實路徑則設置在data-src屬性中。

當頁面滾動的時候計算圖片位置和滾動的位置,當圖片出現(xiàn)在瀏覽器視口內(nèi)時,將圖片的src屬性設置為data-src的值。

<img src="loading.png" data-src="image.png">
img { display: block; margin-bottom: 50px; }
function lazyload() {
 var images = document.getElementsByTagName('img');
 var n = 0; // 用于存儲圖片加載到的位置,避免每次都從第一張圖片開始遍歷 
 return function() {
 var seeHeight = document.documentElement.clientHeight;
 var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
 for(var i = n; i < images.length; i++) {
  if (images[i].offsetTop < seeHeight + scrollTop) {
  if (images[i].getAttribute('src') === 'loading.png') {
   images[i].src = images[i].getAttribute('data-src');
  }
  n = n + 1;
  }
 }
 }
}
lazyload(); //初始化首頁的頁面圖片
window.addEventListener('scroll', lazyload(), false);

方法二

上面的方法雖然沒什么問題,但是性能較差,因為當頁面滾動時,scroll事件會高頻觸發(fā),這非常影響瀏覽器性能。
所以,這里要對lazyload函數(shù)進行函數(shù)節(jié)流(throttle)與函數(shù)去抖(debounce)處理。

函數(shù)節(jié)流(throttle)與函數(shù)去抖(debounce)

這里html和css代碼不變,經(jīng)過throttle處理的js代碼如下:

function throttle (fn, delay, atleast) {
 var timeout = null,
  startTime = new Date();
 return function () {
 var curTime = new Date();
 clearTimeout(timeout);
 if (curTime - startTime >= atleast) {
  fn ();
  startTime = curTime;
 } else {
  timeout = setTimeout (fn, delay);
 }
 }
}

function lazyload() {
 var images = document.getElementsByTagName('img'),
  n = 0;  //存儲圖片加載到的位置,避免每次都從第一張圖片開始遍歷 
 return function() {
 var seeHeight = document.documentElement.clientHeight;
 var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
 for(var i = n; i < images.length; i++) {
  if(images[i].offsetTop < seeHeight + scrollTop) {
  if(images[i].getAttribute('src') === 'loading.png') {
   images[i].src = images[i].getAttribute('data-src');
  }
  n = n + 1;
  }
 }
 }
}
lazyload(); //初始化首頁的頁面圖片
window.addEventListener('scroll', throttle(lazyload(), 500, 1000), false);

方法三

目前有一個新的 IntersectionObserver API,可以自動"觀察"元素是否可見。

用這種方法實現(xiàn)代碼非常簡潔,但是許多瀏覽器不支持。

  • IntersectionObserver 傳入一個回調(diào)函數(shù),當其觀察到元素集合出現(xiàn)時候,則會執(zhí)行該函數(shù)。
  • io.observe 即要觀察的元素,要一個個添加才可以。
  • io 管理的是一個數(shù)組,當元素出現(xiàn)或消失的時候,數(shù)組添加或刪除該元素,并且執(zhí)行該回調(diào)函數(shù)。

function query(selector) {
 return Array.from(document.querySelectorAll(selector));
}
var io = new IntersectionObserver(function(items) {
 items.forEach(function(item) {
 var target = item.target;
 if(target.getAttribute('src') == 'loading.png') {
  target.src = target.getAttribute('data-src');
 }
 })
});
query('img').forEach(function(item) {
 io.observe(item);

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

最新評論

辉县市| 台江县| 礼泉县| 双牌县| 尚志市| 松滋市| 新密市| 枣阳市| 高州市| 南阳市| 温州市| 盐池县| 拉孜县| 舞阳县| 东兴市| 尚志市| 金门县| 阳新县| 犍为县| 阿勒泰市| 赣榆县| 岗巴县| 鄂托克旗| 肃宁县| 南乐县| 五指山市| 辽中县| 怀化市| 新野县| 炉霍县| 祁阳县| 铜梁县| 锡林郭勒盟| 新安县| 天峨县| 云和县| 武邑县| 化德县| 洱源县| 昌平区| 丰原市|