濟南建網站知識,網站建設技術靈魂總結
Website news, Technical summary of soul
由于圖像是濟南網站建設上最流行的內容類型之一,因此網站上的頁面加載時間很容易成為問題。
即使進行了適當的優化,圖像也可能占很大的比重。這可能會對訪問者必須等待才能訪問您網站上的內容的時間產生負面影響。除非您想出一種不會干擾速度感知的圖像加載解決方案,否則它們很可能會耐心地在其他地方導航。
在本文中,您將了解五種延遲加載圖像的方法,可以將它們添加到Web優化工具包中以改善網站上的用戶體驗。
延遲加載圖像是指異步加載網站上的圖像-也就是說,在首屏內容完全加載后,甚至有條件地,僅當它們出現在瀏覽器的視口中時。這意味著,如果用戶沒有完全向下滾動,則位于頁面底部的圖像甚至都不會被加載。
許多網站都使用這種方法,但是在圖片繁多的網站上尤其明顯。嘗試瀏覽您最喜歡的在線狩獵場以獲得高分辨率照片,您很快就會意識到該網站僅加載有限數量的圖像的方式。向下滾動頁面時,您會看到占位符圖像迅速填充真實圖像進行預覽。例如,請注意下圖中的加載程序:將頁面的該部分滾動到視圖中會觸發使用全分辨率照片替換占位符:
至少有兩個極好的原因,您應該考慮為網站延遲加載圖像:
好吧,延遲加載圖像有助于提高網站性能,但是最好的解決方法是什么?
沒有完美的方法。
如果您生活和呼吸JavaScript,那么實現自己的延遲加載解決方案就不會成為問題。沒有什么比您自己編寫代碼給您更多的控制權了。
或者,您可以瀏覽Web以找到可行的方法并開始進行試驗。我就是這樣做的,并且遇到了這五種有趣的技術。
圖像和iframe的本機延遲加載非???。沒有什么比下面的標記更直接了:
<img src="myimage.jpg" loading="lazy" alt="..." />
<iframe src="content.html" loading="lazy"></iframe>
如您所見,沒有JavaScript,沒有src
屬性值的動態交換,只是普通的舊HTML。
該loading
屬性使我們可以選擇延遲屏幕外圖像和iframe,直到用戶滾動到頁面上的位置為止。loading
可以采用以下三個值之一:
lazy
:非常適合延遲加載eager
:指示瀏覽器立即加載指定的內容auto
:保留延遲加載或不延遲加載到瀏覽器的選項。
這種方法無可匹敵:它的開銷為零,簡潔明了。但是,盡管在撰寫本文時,大多數主流瀏覽器都對該loading
屬性提供了良好的支持,但并不是所有瀏覽器都支持該特性。
要獲得有關此令人敬畏的延遲加載圖像功能的深入文章,包括瀏覽器支持的解決方法,請不要錯過Addy Osmani的“ Web的本地圖像延遲加載!”。
Intersection Observer API是一個現代化的界面,你可以利用的延遲加載圖片和其他內容。
MDN引入此API的方法如下:
Intersection Observer API提供了一種異步觀察目標元素與祖先元素或頂級文檔的視口相交的變化的方法。
換句話說,異步監視的是一個元素與另一個元素的交集。
Denys Mishunov在“相交觀察器”和使用它的延遲加載圖像方面都有很好的教程。這就是他的解決方案。
假設您要延遲加載圖片庫。每個圖像的標記如下所示:
<img data-src="image.jpg" alt="test image">
請注意,圖像的路徑是如何包含在data-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 interface
const config = {
rootMargin: '0px 0px 50px 0px',
threshold: 0
};
// register the config object with an instance
// of intersectionObserver
let 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 data-src to src
preloadImage(entry.target);
// the image is now in place, stop watching
self.unobserve(entry.target);
}
});
}, config);
最后,您遍歷所有圖像并將它們添加到此iterationObserver
實例中:
const imgs = document.querySelectorAll('[data-src]');
imgs.forEach(img => {
observer.observe(img);
});
該解決方案的優點:實施起來輕而易舉,有效,并且intersectionObserver
在計算方面做得很繁重。
另一方面,盡管大多數瀏覽器都支持Intersection Observer API最新版本,但并非所有瀏覽器都始終支持它。幸運的是,可以使用polyfill。
您可以在Denys的文章中了解有關Intersection Observer API的更多信息以及此實現的詳細信息。
實現圖像的延遲加載的一種快速簡便的替代方法是讓JS庫為您完成大部分工作。
Lozad是純JavaScript中的高性能,輕量且可配置的惰性加載器,沒有任何依賴關系。您可以使用它來延遲加載圖像,視頻,iframe和更多內容,并且它使用Intersection Observer API。
您可以將Lozad包含在npm / Yarn中,并使用所選的模塊捆綁器將其導入:
npm install --save lozad
yarn add lozad
import lozad from 'lozad';
另外,您可以簡單地使用CDN下載該庫并將其添加到HTML頁面底部的< script>
標記中:
<script src="https://cdn.jsdelivr.net/npm/lozad/dist/lozad.min.js"></script>
接下來,對于基本實現,將lozad類添加到標記中的資產:
<img class="lozad" data-src="img.jpg">
最后,在您的JS文檔中實例化Lozad:
const observer = lozad();
observer.observe();
您將在Lozad GitHub存儲庫中找到有關如何使用該庫的所有詳細信息。
如果您不想深入了解Intersection Observer API的工作原理,或者只是在尋找適用于各種內容類型的快速實現,則Lozad是一個不錯的選擇。
僅注意瀏覽器支持,并最終將此庫與用于Intersection Observer API的polyfill集成。
如果您是中型讀者,那么您肯定已經注意到該網站如何在帖子中加載主圖像。
您首先看到的是圖像的模糊,低分辨率副本,而其高分辨率版本則被延遲加載:
您可以通過多種方式來延遲加載具有這種有趣的模糊效果的圖像。
我最喜歡的技術是Craig Buckler。這是此解決方案的全部優點:
您可以在“ 如何構建自己的漸進式圖像加載器”中閱讀有關它的全部信息,并在項目的GitHub存儲庫上下載代碼。
Yall是功能豐富的延遲加載腳本,用于圖像,視頻和iframe。更具體地說,它使用Intersection Observer API并在必要時巧妙地使用傳統的事件處理程序技術。
在文檔中包含Yall時,需要按以下方式對其進行初始化:
<script src="yall.min.js"></script>
<script>
document.addEventListener("DOMContentLoaded", yall);
</script>
接下來,要延遲加載一個簡單的img
元素,在標記中需要做的就是:
<img class="lazy" src="placeholder.jpg" data-src="image-to-lazy-load.jpg" alt="Alternative text to describe image.">
請注意以下幾點:
src
是一個占位符圖像data-src
屬性內部Yall的好處包括:
要了解有關Yall可以提供的內容以及更復雜的實現的更多信息,請隨時查看GitHub上的項目頁面。
這樣就可以了-延遲加載圖像的五種方法,您可以開始在項目中進行試驗和測試。
公司地址:山東省濟南市東關大街中泰大廈 Copyright?2006-2020 m.vanderhorstlaw.com. 濟南網站設計我們值得信賴. All rights reserved .
7x24小時服務熱線:15069066861 網站建設博客