iframe異步加載_5種延遲加載圖像的方法以幫助你提升網站性能與用戶體驗

e0e06e219476715bacdc816425b6b1fe.png

英文 |?https://www.sitepoint.com/five-techniques-lazy-load-images-website-performance/翻譯 | web前端開發(ID:web_qdkf)由于圖像是Web上最流行也是必不可少的內容類型之一,因此網站上的圖片頁面加載時間很容易成為一個問題。即使進行了適當的優化,圖像也可能占很大的比重。這可能會對訪問網站的用戶造成一定的負面影響,因為你的用戶必須等待一段時間才能訪問你網站上的內容。除非你想出一種不會干擾速度感知的圖像加載解決方案,否則它們很可能會失去耐心,而去其他地方尋找他們所需要的內容。在本文中,你將了解5種延遲加載圖像的方法,可以將它們添加到Web優化工具包中以改善網站上的用戶體驗。

什么是延遲加載?

延遲加載圖像是指異步加載網站上的圖像,也就是說,在首屏內容完全加載后,甚至有條件地,僅當它們出現在瀏覽器的視口中時。這意味著,如果用戶沒有完全向下滾動,則位于頁面底部的圖像甚至都不會被加載。許多網站都使用這種方法,但是在圖片繁多的網站上尤其明顯。嘗試瀏覽你最喜歡的在線網站以獲得高分辨率照片,你很快就會意識到該網站僅加載有限數量的圖像的方式。向下滾動頁面時,你會看到占位符圖像迅速填充真實圖像進行預覽。例如,請注意Unsplash.com上的加載程序:將頁面的該部分滾動到視圖中會觸發使用全分辨率照片替換占位符:ff83fb30619c6a27375dee48016e8d0b.png

為什么要關心延遲加載圖像?

至少有兩個極好的原因,你應該考慮為網站延遲加載圖像:
  • 如果你的網站使用JavaScript來顯示內容或向用戶提供某種功能,則快速加載DOM變得至關重要。腳本通常要等到DOM完全加載后才能開始運行。在包含大量圖像的網站上,延遲加載(或異步加載圖像)可能會導致用戶停留或離開你的網站有所不同。

  • 由于大多數惰性加載解決方案都是通過僅在用戶滾動到在視口內可見圖像的位置時才加載圖像來工作的,因此如果用戶從未到達該點,則將永遠不會加載這些圖像。這意味著可以節省大量帶寬,為此,大多數用戶,特別是那些在移動設備上訪問Web且連接緩慢的用戶,將非常感謝你。

好吧,延遲加載圖像有助于提高網站性能,但是最好的解決方法是什么?沒有完美的方法。如果你使用JavaScript,那么實現自己的延遲加載解決方案就不會成為問題。沒有什么比你自己編寫代碼給你更多的控制權了。或者,你可以瀏覽Web以找到可行的方法并開始進行試驗。我就是這樣做的,并且遇到了這5種有趣的技術。

1、本機延遲加載

圖像和iframe的本機延遲加載非常酷。沒有什么比下面的標記更直接了:
如你所見,沒有JavaScript,沒有src屬性值的動態交換,只是普通的HTML。該loading屬性使我們可以選擇延遲屏幕外圖像和iframe,直到用戶滾動到頁面上的位置為止。loading可以采用以下三個值之一:
  • lazy:非常適合延遲加載

  • eager:指示瀏覽器立即加載指定的內容

  • auto:保留延遲加載或不延遲加載到瀏覽器的選項。

這種方法無可匹敵:它的開銷為零,簡潔明了。但是,盡管在撰寫本文時,大多數主流瀏覽器都對該loading屬性提供了良好的支持,但并不是所有瀏覽器都支持該特性。要獲得有關此令人敬畏的延遲加載圖像功能的深入文章,包括瀏覽器支持的解決方法,請不要錯過Addy Osmani的“ Web的本地圖像延遲加載!”。2、使用Intersection Observer API的延遲加載該路口觀察API是一個現代化的界面,你可以利用的延遲加載圖片和其他內容。MDN引入此API的方法如下:
Intersection Observer API提供了一種異步觀察目標元素與祖先元素或頂級文檔的視口相交的變化的方法。
換句話說,異步監視的是一個元素與另一個元素的交集。Denys Mishunov在“相交觀察器”和使用它的延遲加載圖像方面都有很好的教程。這就是他的解決方案。假設你要延遲加載圖片庫。每個圖像的標記如下所示:
請注意,圖像的路徑是如何包含在src屬性(而不是src屬性)中的。原因是使用src意味著圖像將立即加載,這不是你想要的。在CSS中,為每個圖像賦予一個min-height值,例如100px。這為每個圖像占位符(不帶src屬性的img元素)提供了一個垂直尺寸:
img {  min-height: 100px;  /* more styles here */}
然后,在JavaScript文檔中,創建一個config對象并將其注冊到intersectionObserver實例:
// create config object: rootMargin and threshold// are two properties exposed by the interfaceconst config = {  rootMargin: '0px 0px 50px 0px',  threshold: 0};// register the config object with an instance// of intersectionObserverlet observer = new intersectionObserver(function(entries, self) {  // iterate over each entry  entries.forEach(entry => {    // process just the images that are intersecting.    // isIntersecting is a property exposed by the interface    if(entry.isIntersecting) {      // custom function that copies the path to the img      // from src to src      preloadImage(entry.target);      // the image is now in place, stop watching      self.unobserve(entry.target);    }  });}, config);
最后,你遍歷所有圖像并將它們添加到此iterationObserver實例中:
const imgs = document.querySelectorAll('[src]');imgs.forEach(img => {  observer.observe(img);});
該解決方案的優點:實施起來輕而易舉,有效,并且intersectionObserver在計算方面做得很繁重。另一方面,盡管大多數瀏覽器都支持Intersection Observer API最新版本,但并非所有瀏覽器都始終支持它。幸運的是,可以使用polyfill。

3?、Lozad.js

實現圖像的延遲加載的一種快速簡便的替代方法是讓JS庫為你完成大部分工作。Lozad是純JavaScript中的高性能,輕量且可配置的惰性加載器,沒有任何依賴關系。你可以使用它來延遲加載圖像,視頻,iframe和更多內容,并且它使用Intersection Observer API。你可以將Lozad包含在npm / Yarn中,并使用所選的模塊捆綁器將其導入:
npm?install?--save?lozadyarn?add?lozad
import lozad from 'lozad';
另外,你可以簡單地使用CDN下載該庫并將其添加到HTML頁面底部的< script>標記中:
接下來,對于基本實現,將lozad類添加到標記中的資產:
最后,在你的JS文檔中實例化Lozad:
const observer = lozad();observer.observe();
你將在Lozad GitHub存儲庫中找到有關如何使用該庫的所有詳細信息。如果你不想深入了解Intersection Observer API的工作原理,或者只是在尋找適用于各種內容類型的快速實現,則Lozad是一個不錯的選擇。僅注意瀏覽器支持,并最終將此庫與用于Intersection Observer API的polyfill集成。

4、延遲加載具有模糊的圖像效果

你首先看到的是圖像的模糊,低分辨率副本,而其高分辨率版本則被延遲加載:d3601c79ed4ffdd23fd7220faaff45f5.png15fb90783b47778350f78e030036160b.png你可以通過多種方式來延遲加載具有這種有趣的模糊效果的圖像。我最喜歡的技術是Craig Buckler。這是此解決方案的全部優點:
  • 性能:僅463字節的CSS和1,007字節的最小JavaScript代碼

  • 支持視網膜屏幕

  • 無依賴關系:不需要jQuery或其他庫和框架

  • 逐步增強功能以抵消較舊的瀏覽器和JavaScript失敗

5、 Yall.js

Yall是功能豐富的延遲加載腳本,用于圖像,視頻和iframe。更具體地說,它使用Intersection Observer API并在必要時巧妙地使用傳統的事件處理程序技術。在文檔中包含Yall時,需要按以下方式對其進行初始化:
  document.addEventListener("DOMContentLoaded", yall);
接下來,要延遲加載一個簡單的img元素,在標記中需要做的就是:
請注意以下幾點:
  • 你將懶惰的類添加到元素

  • src的值是一個圖像占位符

  • 你要延遲加載的圖像的路徑在src屬性內部

Yall的好處包括:
  • Intersection Observer API的出色性能

  • 出色的瀏覽器支持(可回溯到IE11)

  • 無需其他依賴項

結論

以上就是我分享的關于延遲加載圖像的5種方法,你可以開始在項目中進行試驗和測試。如果你還有更好的方法,也可以給我留言,我們一起學習進步,最后,感謝你的閱讀。d525f4626c2a4fef99bfb5c78073ee17.pnge7ac4abff8f145a2e3b47b5d5b5d49f4.png

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

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

相關文章

ubuntu18安裝python3.6.8_ubuntu 18.04 + Python 3.6.8 更換軟件安裝源

國外的開源項目開展的是如火如荼&#xff0c;我們國內的當然也不甘落后。為了更好的玩轉 Python&#xff0c;我使用了 ubuntu Linux 來作為開發環境。但是由于國內網絡的限制&#xff0c;訪問國外的一些軟件源的時候&#xff0c;速度比較慢&#xff0c;這時我們需要更換成國內的…

springframework報錯_應對報錯信息的必殺技!

今天遇到了一個錯誤&#xff0c;一般的錯誤提示會很明顯&#xff0c;一看就知道是什么問題。今天遇到的這個說實話真的不好找原因&#xff0c;一般在這種情況下該怎么解決呢&#xff1f;分享下我的思路吧&#xff0c;不一定是最好的&#xff0c;至少有用。直接上圖吧&#xff0…

電腦運行卡頓怎么處理_【眾點學】電腦運行PS卡頓?可能是你的虛擬內存沒設置好!...

不少小伙伴都遇到過這樣的煩惱明明自己的電腦擁有大內存PS用著用著就卡頓了經過教體君的仔(bai)細(du)研(yi)究(xia)發現原來電腦的 虛擬內存 只有2G當我們用大型軟件或玩大型游戲電腦越用越卡時該怎么做&#xff1f;今天【眾點學】我們一起來看看Win7和Win10系統下分別如何設置…

線程池拒絕策略 開發中常用什么策略_面試官:說說你知道多少種線程池拒絕策略...

往期文章為什么阿里Java規約要求謹慎使用SimpleDateFormathttps://www.toutiao.com/i6696127929048367629/為什么我強烈推薦你用枚舉來實現單例模式https://www.toutiao.com/i6696861933687013901/為什么不要在MySQL中使用UTF-8編碼方式https://www.toutiao.com/i6697966437727…

css html 雙面打印_從 Linux 命令行進行打印 | Linux 中國

導讀&#xff1a;在 Linux 命令行進行打印的內容比單單一個 lp 命令多得多&#xff0c;讓我們來看一些可用選項。       本文字數&#xff1a;4305&#xff0c;閱讀時長大約&#xff1a;5分鐘https://linux.cn/article-13012-1.html作者&#xff1a;Sandra Henry-stocker譯…

python保存快捷鍵是什么_python常用快捷鍵

最重要的快捷鍵1. ctrlshiftA:萬能命令行2. shift兩次:查看資源文件新建工程第一步操作1. module設置把空包分層去掉,compact empty middle package2. 設置當前的工程是utf-8,設置的Editor-->File Encodings-->全部改成utf-8,注釋1. ctrl/:單行注釋光標操作1. ctrlaltent…

服務器內存超限問題_服務器內存爆滿最佳處置方案

內存爆滿截圖&#xff1a;分析&#xff1a;內存持續飆升&#xff0c;應該是有大量內存一直沒有釋放&#xff0c;考慮僵尸對象&#xff0c;僵尸進程&#xff0c;最簡單的就是重啟服務器&#xff0c;但是就無法找到罪魁禍首了。驗證&#xff1a;top命令查看活躍進程的資源使用情況…

js map對象遍歷_何時使用 Map 來代替變通的 JS 對象

JS 普通對象 {key: value} 用于存放結構化數據。但有一件事我覺得很煩:對象鍵必須是字符串(或很少使用的 symbol)。如果將數字用作鍵會怎樣&#xff1f;在這種情況下不會有錯誤&#xff1a;const names { 1: One, 2: Two,};Object.keys(names); // > [1, 2]JS 會隱式地將…

mysql怎么顯示結果窗口_mysql8中窗口函數

在以前的MySQL版本中是沒有窗口函數的&#xff0c;直到MySQL8.0才引入了窗口函數。窗口函數是對查詢中的每一條記錄執行一個計算&#xff0c;并且這個計算結果是用與該條記錄相關的多條記錄得到的。1.窗口函數與聚合函數窗口函數與聚合函數很像&#xff0c;他們都是在一組記錄而…

python控制臺輸入字符串作為參數_Python-如何將字符串傳遞到subprocess.Popen(使用stdin參數)?...

小編典典Popen.communicate() 說明文件&#xff1a;請注意&#xff0c;如果要將數據發送到進程的stdin&#xff0c;則需要使用stdin PIPE創建Popen對象。同樣&#xff0c;要在結果元組中獲得除None以外的任何內容&#xff0c;你還需要提供stdout PIPE和/或stderr PIPE。替換…

log4jdbc mysql_[簡單]log4jdbc-log4j2配置簡記_MySQL

log4jdbc-log4j2&#xff0c;就不多說了&#xff0c;不了解的可以谷歌&#xff0c;附上log4jdbc-log4j2的官方鏈接&#xff1a;https://code.google.com/p/log4jdbc-log4j2/ &#xff0c;上面有非常詳細的介紹。簡單的貼下配置文件&#xff0c;其他的見附件&#xff1a;databas…

vb實時錯誤6 溢出_java內存溢出系列(6): Out of swap space?

本文是java內存溢出系列第6小篇。JVM啟動參數指定了最大內存限制。如 -Xmx 以及相關的其他啟動參數. 假若JVM使用的內存總量超過可用的物理內存, 操作系統就會用到虛擬內存。錯誤信息 java.lang.OutOfMemoryError: Out of swap space? 表明, 交換空間(swap space,虛擬內存) 不…

java備份還原mysql數據庫_Java備份還原Mysql數據庫

///實體類package com.ews.util;/*** 系統備份展示對象** */public class DataFile {private String fileName;//備份文件的名稱private String fileDate;//備份文件的日期private String filePath;//備份文件的地址private String fileSize;//備份文件的大小public String get…

學pyqt5之前需要學python嗎_快速學習pyqt5(1)--入門

學習于&#xff1a;PyQt5圖形界面編程 想要系統學習的同學建議可以去這個專欄好好學習&#xff0c;沒有任何語言基礎和計算機基礎的也建議直接去看那個專欄。我這里是有java基礎了&#xff0c;所以就不重復&#xff0c;針對快速學習使用。學習這個的目的是完成學校的SIT項目&am…

reboot mysql fail_mysql 5.7.18,在系統重啟后,為什么無法啟動?

度娘也不給力&#xff0c;只好自己研究了。先把結論寫出來吧。把pid文件換個位置&#xff0c;就好了。問題是&#xff0c; mysqld.servce的文件是從mysql的安裝目錄拷貝的&#xff0c;導致沒有懷疑pid文件位置的問題。一開始還懷疑是不是自己在一些文件里拼寫有誤。后來&#x…

mysql 查看鎖_別吵吵,分布式鎖也是鎖

Tomcat是這個系統的核心組成部分&#xff0c; 每當有用戶請求過來&#xff0c;Tomcat就會從線程池里找個線程來處理&#xff0c;有的執行登錄&#xff0c;有的查看購物車&#xff0c;有的下訂單&#xff0c;看著屬下們盡心盡職地工作&#xff0c;完成人類的請求&#xff0c;Tom…

php解析js的 arraybuffer_JS的所謂的第七種數據類型Symbol

首先&#xff0c;為什么說叫所謂呢&#xff1f;因為在2007年之前Js給予我們typeof解析數據類型的一共有六種(一直有爭議&#xff0c;但是我們暫時就按typeof來算)functionNumberObjectbooleanStringundefined但當我們去 typeof Symbol () 的時候&#xff0c;會驚奇的發現&#…

JAVA MYSQL從數據庫中提取圖片_java web將圖片存到儲數據庫和從數據庫中讀取圖片...

(Notice&#xff1a;以下所有經驗也是我根據網上的經驗整理的&#xff0c;如有侵權可以聯系我刪除&#xff0c;Wx:IT_Ezra&#xff0c;QQ 654303408。 有問題討論也可聯系我&#xff0c;QQ同上。)一、分析一下基本流程從前臺頁面獲取圖片&#xff0c;后臺接收圖片文件轉化成數據…

Ubuntu系統如何安裝和卸載CUDA和CUDNN

背景 最近在學習PaddlePaddle在各個顯卡驅動版本的安裝和使用&#xff0c;所以同時也學習如何在Ubuntu安裝和卸載CUDA和CUDNN&#xff0c;在學習過程中&#xff0c;順便記錄學習過程。在供大家學習的同時&#xff0c;也在加強自己的記憶。本文章以卸載CUDA 8.0 和 CUDNN 7.05 …

session.merge 緩存不更新_如何保證緩存與數據庫雙寫時的數據一致性?

在做系統優化時&#xff0c;想到了將數據進行分級存儲的思路。因為在系統中會存在一些數據&#xff0c;有些數據的實時性要求不高&#xff0c;比如一些配置信息。基本上配置了很久才會變一次。而有一些數據實時性要求非常高&#xff0c;比如訂單和流水的數據。所以這里根據數據…