如何使用echo.js實現圖片的懶加載(整理)

如何使用echo.js實現圖片的懶加載(整理)

一、總結

一句話總結:a、在img標簽中添加data-echo屬性加載真實圖片:<img class="loading" src="blank.gif" data-echo="圖片真實路徑" />,在src屬性中加載loading的那個圖片; b、引入echo.js; c、在js代碼中初始化echo.js(和別的js的用法一樣)

?

1、echo.js中是如何判斷元素距離出現在視野里的長度還有多少?

判斷距離圖片的高啊,element.getBoundingClientRect(),就能得到元素相對于視窗的四個距離

?

2、已經有了是否加載的判斷函數,那么如何做到圖片的懶加載?

先加載loadding小菊花圖片,當滿足懶加載的條件時候,切換img的src屬性,

對于img元素的設置有兩個比較重要的值一個是src,一個是data-echo ,(還有一個是背景圖片,不太重要,忽略他)兩個,src設置小菊花的地址,data-echo真實的地址;

?

3、echo.js的優點是什么?

Echo 是一個獨立的 JavaScript 懶加載圖像的工具,快速、體積小(不足1k)和使用 HTML5 的 data- 屬性。Echo 支持 IE8+ 。

?

?

二、使用echo.js實現圖片懶加載

參考:使用echo.js實現圖片懶加載 - CSDN博客
https://blog.csdn.net/u010394015/article/details/52385791

?

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title><style>* {margin: 0;padding: 0;font-family: "微軟雅黑";}ul li img {width: 300px;display: block;background: url('pic/bg.png') no-repeat center #ccc;}</style></head><body><ul><li><img src="pic/blank.gif" data-echo="img/aaa.jpg" /></li><li><img src="pic/blank.gif" data-echo="img/aaa.jpg" /></li><li><img src="pic/blank.gif" data-echo="img/aaa.jpg" /></li><li><img src="pic/blank.gif" data-echo="img/aaa.jpg" /></li><li><img src="pic/blank.gif" data-echo="img/aaa.jpg" /></li><li><img src="pic/blank.gif" data-echo="img/aaa.jpg" /></li><li><img src="pic/blank.gif" data-echo="img/aaa.jpg" /></li><li><img src="pic/blank.gif" data-echo="img/aaa.jpg" /></li><li><img src="pic/blank.gif" data-echo="img/aaa.jpg" /></li><li><img src="pic/blank.gif" data-echo="img/aaa.jpg" /></li><li><img src="pic/blank.gif" data-echo="img/aaa.jpg" /></li><li><img src="pic/blank.gif" data-echo="img/aaa.jpg" /></li><li><img src="pic/blank.gif" data-echo="img/aaa.jpg" /></li><li><img src="pic/blank.gif" data-echo="img/aaa.jpg" /></li><li><img src="pic/blank.gif" data-echo="img/aaa.jpg" /></li><li><img src="pic/blank.gif" data-echo="img/aaa.jpg" /></li><li><img src="pic/blank.gif" data-echo="img/aaa.jpg" /></li><li><img src="pic/blank.gif" data-echo="img/aaa.jpg" /></li><li><img src="pic/blank.gif" data-echo="img/aaa.jpg" /></li><li><img src="pic/blank.gif" data-echo="img/aaa.jpg" /></li><li><img src="pic/blank.gif" data-echo="img/aaa.jpg" /></li></ul><script src="js/echo.js"></script><script>echo.init();</script></body></html>

echo.js代碼

?

?

/*! echo.js v1.6.0 | (c) 2014 @toddmotto | https://github.com/toddmotto/echo */ ! function(t, e) {"function" == typeof define && define.amd ? define(function() {return e(t)}) : "object" == typeof exports ? module.exports = e : t.echo = e(t)
}(this, function(t) {"use strict";var e, n, o, r, c, a = {},d = function() {},u = function(t, e) {var n = t.getBoundingClientRect();return n.right >= e.l && n.bottom >= e.t && n.left <= e.r && n.top <= e.b},l = function() {(r || !n) && (clearTimeout(n), n = setTimeout(function() {a.render(), n = null}, o))};return a.init = function(n) {n = n || {};var u = n.offset || 0,i = n.offsetVertical || u,f = n.offsetHorizontal || u,s = function(t, e) {return parseInt(t || e, 10)};e = {t: s(n.offsetTop, i),b: s(n.offsetBottom, i),l: s(n.offsetLeft, f),r: s(n.offsetRight, f)}, o = s(n.throttle, 250), r = n.debounce !== !1, c = !!n.unload, d = n.callback || d, a.render(), document.addEventListener ? (t.addEventListener("scroll", l, !1), t.addEventListener("load", l, !1)) : (t.attachEvent("onscroll", l), t.attachEvent("onload", l))}, a.render = function() {for (var n, o, r = document.querySelectorAll("img[data-echo], [data-echo-background]"), l = r.length, i = {l: 0 - e.l,t: 0 - e.t,b: (t.innerHeight || document.documentElement.clientHeight) + e.b,r: (t.innerWidth || document.documentElement.clientWidth) + e.r}, f = 0; l > f; f++) o = r[f], u(o, i) ? (c && o.setAttribute("data-echo-placeholder", o.src), null !== o.getAttribute("data-echo-background") ? o.style.backgroundImage = "url(" + o.getAttribute("data-echo-background") + ")" : o.src = o.getAttribute("data-echo"), c || o.removeAttribute("data-echo"), d(o, "load")) : c && (n = o.getAttribute("data-echo-placeholder")) && (null !== o.getAttribute("data-echo-background") ? o.style.backgroundImage = "url(" + n + ")" : o.src = n, o.removeAttribute("data-echo-placeholder"), d(o, "unload"));l || a.detach()}, a.detach = function() {document.removeEventListener ? t.removeEventListener("scroll", l) : t.detachEvent("onscroll", l), clearTimeout(n)}, a
});


三、圖片懶加載庫echo.js源碼學習

參考:圖片懶加載庫echo.js源碼學習 - CSDN博客
https://blog.csdn.net/a54654132/article/details/77427507

最近不是在學習設計模式嗎,然后就看到了代理模式加載圖片的樣例,然后自己實現了一下,就發現,自己寫的這貨每次就只能加載一張圖片,而且圖片要放在哪也是個很嚴重的問題

然后就去了 gayhub 找了找了找流行的圖片懶加載庫,這一找,就找到了一個echo.j是,打開一看,源碼只有100多行吧,震驚。。,看完源碼,哎,木有上代理模式呀

仔細學習了下源碼:覺得這種做法比較適合圖片位置確定場景的吧,比如文章啊,一篇文章老長了,里面有蠻多圖片散落在不同的地方,這樣就比較合適,有可能有很多圖片讀者都不會翻到哪里,加載下來就浪費了

關鍵點:

1.如何判斷元素距離出現在視野里的長度還有多少?以常見鼠標往下滾動,圖片在下面為例

          

靈魂畫手哈哈,,,;H1是視窗的高度,window.innerHeight可以獲得,H2就是提供給使用者設置的offsetBottom

然后祭出一個大招!element.getBoundingClientRect(),就能得到元素相對于視窗的四個距離

            

var H=Element.getboundingclientrect().top;
var flag=H-(H1+H2);//當flag值小于0就代表可以開始加載圖片了

  那么,看看源碼里面是怎么寫的:

var offset = {//四個值由用戶傳入決定,默認為0t: ,b:,l: ,r:
};
var   view = {  //計算鄰界的距離l: 0 - offset.l,t: 0 - offset.t,b: (root.innerHeight || document.documentElement.clientHeight) + offset.b,r: (root.innerWidth || document.documentElement.clientWidth) + offset.r
};var isHidden = function (element) {return (element.offsetParent === null);  //element.offsetParent 表示父元素,如果為null證明沒有在添加到DOM里面,或者position值為fixed};var inView = function (element, view) {  //判斷是否在視圖中調用這個函數判斷if (isHidden(element)) {  //判斷是否在界面上return false;}var box = element.getBoundingClientRect();  //計算四邊的距離是否滿足條件return (box.right >= view.l && box.bottom >= view.t && box.left <= view.r && box.top <= view.b);};

  

2.已經有了是否加載的判斷函數,那么如何做到圖片的懶加載?

先加載loadding小菊花圖片,當滿足懶加載的條件時候,切換img的src屬性,

對于img元素的設置有兩個比較重要的值一個是src,一個是data-echo ,(還有一個是背景圖片,不太重要,忽略他)兩個,src設置小菊花的地址,data-echo真實的地址;

那么所有頁面元素都這樣設置后,會有什么影響?

當所有圖片都用設置src為同一值,也就是用同一張菊花圖,加載完之后就可以通用了

img這個元素的特性就是,當設置了src屬性,他會去先加載這張圖圖片,如果在js里面馬上改變了img的src屬性,他會同事再進行一次網絡請求去加載你js設置的src地址的圖片

但是 會先將html里面設置的src圖片加載完,顯示,你什么時候加載完第二個圖片什么時候替換,如果你在第二張圖片加載的時候又改變了src的值,,,那也是一樣的,什么加載完什么時候顯示,沒加載完的情況下顯示原來的

源代碼:

  if (inView(elem, view)) {//是否滿足加載條件if (unload) {//如果設置超出了不加載,保存小菊花地址在data-echo-placeholder屬性elem.setAttribute('data-echo-placeholder', elem.src);}if (elem.getAttribute('data-echo-background') !== null) {//img的背景圖片elem.style.backgroundImage = 'url(' + elem.getAttribute('data-echo-
background') + ')';}//當ele的src不等于data-echo的值,也就是真蒸的圖片地址,改變圖片的srcelse if (elem.src !== (src = elem.getAttribute('data-echo'))) {elem.src = src;}if (!unload) { //如果沒有設置超出不加載,在這里就可以清除這些屬性了elem.removeAttribute('data-echo');elem.removeAttribute('data-echo-background');}callback(elem, 'load');}else if (unload && !!(src = elem.getAttribute('data-echo-placeholder'))) {//處理超出不加載圖片的情況,把原來保存的小菊花圖賦給elem的src//因為小菊花是最開始就加載好了的,所以圖片切換回小菊花,不再加載之前設置的真實圖片if (elem.getAttribute('data-echo-background') !== null) {elem.style.backgroundImage = 'url(' + src + ')';}else {elem.src = src;}elem.removeAttribute('data-echo-placeholder'); callback(elem, 'unload');}}if (!length) {echo.detach();//移除事件監聽}

  

3,scroll函數節流

函數節流,兩種方式:

1:在滾動的時候不會觸發,滾動停下來才會隔一段時間觸發

2:每隔一段事件都觸發

//第一種方式,每次滾動過程中一直觸發,每次都會新清除上一次的setTimout,添加一個新的setTimout
var poll;
function throttle(){ clearTimeout(poll);poll=setTimeout(function(){echo.render();},delay||250) 
}

  

  

var poll;
function throttle(){ if(poll){ //存在setTimout,不清除,直接返回return ; } clearTimout(poll); poll=setTimeout(function(){echo.render();poll=null; //允許再次添加定時器 },delay||250) }

  

?

四、WEB前端 實現圖片懶加載 echo.js

參考:WEB前端 實現圖片懶加載 echo.js - CSDN博客
https://blog.csdn.net/weixin_38984353/article/details/80340795

echo.js是一個輕小的圖片懶加載js插件,在使用過程中很多朋友可能是直接自定義一張占位圖片,可能會造成圖片的變形等。其實這并不是最佳的解決方案。下面給大家介紹另一種方法,簡單的控制下css,實現loading效果
首先我們準備一張1*1px透明gif圖片(blank.gif),和一個loading圖片。

<img class="loading" src="blank.gif" data-echo="圖片真實路徑" />
  • 1

Echo 是一個獨立的 JavaScript 懶加載圖像的工具,快速、體積小(不足1k)和使用 HTML5 的 data- 屬性。Echo 支持 IE8+ 。
示例代碼

<body> 
<img src="img/blank.gif" alt="Photo" data-echo="img/photo.jpg">
//blank.gif為預加載的照片,photo.jpg為最后顯示的照片<script src="dist/echo.js"></script> <script> Echo.init({ offset: 0, throttle: 250  //設置圖片延遲加載的時間 }); // Echo.render(); is also available for non-scroll callbacks </script> 
</body>

?

?

?

轉載于:https://www.cnblogs.com/Renyi-Fan/p/9372425.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/279756.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279756.shtml
英文地址,請注明出處:http://en.pswp.cn/news/279756.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

還原出廠設置 擦除frp_如何備份,擦除和還原Apple Watch

還原出廠設置 擦除frpThe Apple Watch is, in its own right, a little tiny computer with data backup and security needs. Read on as we show you how to ensure your Apple Watch is backed up, wiped, and restored just like you’d do with your smartphone. Apple Wa…

exchange 2010 search mailbox 的幕后強大功能

鈴……….半夜中被一陣急促的手機鈴聲吵醒&#xff0c;年度服務客戶打來電話需要進行郵件的排查和刪除工作。問其原因&#xff0c;原來是組織中有人發了一封關于領導的不健康的郵件&#xff0c;并在企業內部進行了轉發&#xff0c;領導要求立即找出此類郵件并進行刪除。管理員深…

Apache HBase的現狀和發展

一、&#xff28;Base是什么 HBase(Hadoop Database)&#xff0c;是一個基于Google BigTable論文設計的高可靠性、高性能、可伸縮的分布式存儲系統。 它有以下特征&#xff1a; 1.HBase仍然是采用行存儲的&#xff0c;采用松散表的結構來獲得動態列的功能&#xff1b; 2.原生海…

Java的接口、繼承與多態

接口 java只支持單繼承&#xff0c;即一個類只能有一個父類&#xff0c;因此需要接口來實現多重繼承。 接口的定義 類和接口的區別&#xff1a;一個類通過繼承接口的方式&#xff0c;從而來繼承接口的抽象方法。類描述對象的屬性和方法&#xff0c;接口則包含類要實現的方法。 …

dvd刻錄軟件_如何在Windows 7中刻錄照片和視頻DVD(無需額外的軟件)

dvd刻錄軟件Software like DVD Flick is great for burning video to DVDs, but Windows 7 actually includes built-in DVD burning software. Strangely, it’s the last time the company did so—while Windows 8 and Windows 10 can play back DVD movies, they can’t cr…

如何實現office不同語言界面切換

前面我討論了《如何實現win7不同語言界面切換》&#xff0c;很巧今天又有網友問到如何實現 office的語言界面切換呢。嘿&#xff0c;那我們就繼續來玩轉界面吧。 office2007和office2010也支持輕松的進行語言界面切換&#xff0c;操作步驟也很簡單。 Office 語言界面包 (LIP) 是…

Mysql-高可用集群[MyCat中間件使用](三)

服務器-節點: 4臺 mysql-主: 192.168.2.40mysql-從-node-0: 192.168.2.41mysql-從-node-1: 192.168.2.42mycat: 192.168.2.45操作過程 1.搭建mysql主從節點2.搭建mycat中間件節點3.mycat服務配置4.測試讀寫分離,讀的分發1.搭建mysql主從節點 Mysql-高可用集群主從單一模式-binl…

yum安裝mysql5.6

1.檢查系統是否安裝其他版本的MYSQL數據 yum list installed | grep mysql yum -y remove mysql-libs.x86_64 2.安裝及配置 wget http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm rpm -ivh mysql-community-release-el6-5.noarch.rpm yum repolist all | grep…

離開互聯網行業_如何使用互聯網再也不會離開家

離開互聯網行業Thanks to the Internet, activities like “going outside” or “being a productive member of the community” are becoming increasingly optional parts of daily life. When your inner hermit feels like putting on his vampire cape, simple tricks l…

iOS 11開發教程(十三)iOS11應用編輯界面添加視圖

iOS 11開發教程&#xff08;十三&#xff09;iOS11應用編輯界面添加視圖 在iOS中添加視圖的方式有兩種&#xff1a;一種是使用編輯界面添加視圖&#xff1b;另一種是使用代碼添加視圖。以下是這兩個方式的詳細介紹。 1.編輯界面添加視圖 使用編輯界面添加視圖是一個相當簡單的工…

限流算法(記錄cyc大佬的專欄)

限流的必要性 如果一段時間內請求的數量過大&#xff0c;就會給服務器造成很大壓力&#xff0c;可能導致服務器無法提供其它服務。 計數器算法 通過一個計數器 counter 來統計一段時間內請求的數量&#xff0c;并且在指定的時間之后重置計數器。該方法實現簡單&#xff0c;但是…

bzoj 1024 [ SCOI 2009 ] 生日快樂 —— 遞歸

題目&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id1024 因為每次把一塊切成兩塊&#xff0c;所以可以枚舉從哪里切開&#xff0c;然后遞歸求解&#xff1b; 一開始用了不太對的貪心思路&#xff0c;想著一定去切較長邊&#xff0c;但看來不一定。 代碼如下&a…

HBase存儲剖析與數據遷移

1.概述 HBase的存儲結構和關系型數據庫不一樣&#xff0c;HBase面向半結構化數據進行存儲。所以&#xff0c;對于結構化的SQL語言查詢&#xff0c;HBase自身并沒有接口支持。在大數據應用中&#xff0c;雖然也有SQL查詢引擎可以查詢HBase&#xff0c;比如Phoenix、Drill這類。但…

windows os x_如何立即在OS X上獲取Windows樣式的窗口捕捉

windows os xApple’s recent announcement that the upcoming OS X release (El Capitan or 10.11) will finally, at long last, come with the ability to snap windows to your screen edges. A feature Windows users have enjoyed since 2009. 蘋果公司最近宣布即將發布的…

Install Odoo 11 on CentOS 7

2019獨角獸企業重金招聘Python工程師標準>>> Odoo is the most popular all-in-one business software in the world. It offers a range of business applications including CRM, website, e-Commerce, billing, accounting, manufacturing, warehouse, project m…

創建maven項目,配置maven地址

2019獨角獸企業重金招聘Python工程師標準>>> 在eclipse中&#xff0c;新建maven項目next第二步&#xff0c;選擇webapp輸入id及包名&#xff0c;完成新建給項目build path&#xff0c;添加1.8版本jdk和tomcat項目右鍵屬性 project Facets&#xff0c;切換成web項目&…

如何在Excel中隱藏單元格,行和列

There may be times when you want to hide information in certain cells or hide entire rows or columns in an Excel worksheet. Maybe you have some extra data you reference in other cells that does not need to be visible. 有時您可能想在某些單元格中隱藏信息或在…

金三銀四,跳槽為敬

不是不想跳&#xff0c;是如今的市場水冷&#xff0c;挪不開腳。 三月有“黃金”。 過去很多年&#xff0c;這個被譽為市場黃金期的階段&#xff0c;最熱鬧的旗幟屬于房地產&#xff0c;其次是人才市場。跳槽二字&#xff0c;充滿誘惑。對每一個想要改變的人而言&#xff0c;…

yum搭建本地倉庫、國內源、下載rpm包、源碼安裝

yum搭建本地倉庫[rootlocalhost ~]# mount /dev/cdrom /mnt/mount: /dev/sr0 寫保護&#xff0c;將以只讀方式掛載cp -r /etc/yum.repos.d /etc/yum.repos.d.bak[rootlocalhost ~]# cp -r /etc/yum.repos.d/ /etc/yum.repos.d.ori/ //復制rm -f /etc/yum.repos.d/*[rootlocalh…

如何在Word文檔中添加頁眉或頁腳

Headers and footers are useful for adding things such as page numbers, dates, file names, and disclaimers to documents. Word allows you to add headers and footers with built-in, ready-made layouts or add your own custom headers and footers. 頁眉和頁腳對于在…