现代网页应用中,图片已成为最常用的内容类型之一。虽然使用背景图片可以提升应用的视觉效果,但图片尺寸过大却会严重影响应用性能。
即使经过优化,图片仍然可能占用大量空间,导致用户等待时间过长。如果用户没有获得快速访问内容的体验,他们往往会失去耐心并转向其他网站,因此,高效的图片加载方案至关重要。
本文将介绍五种图片懒加载方法,帮助您优化网站,提升用户体验。这些方法适用于各种类型的图片,包括背景图片、内联图片和横幅图片。
关键要点
什么是懒加载?
图片懒加载意味着异步加载网站上的图片。可以在页面可见内容完全加载后,或仅当图片出现在浏览器视窗中时,按需加载内容。这意味着如果用户没有向下滚动到底部,页面底部的图片甚至不会被加载,从而最终提高应用程序性能。
对于大多数网站来说,了解如何在HTML中启用懒加载至关重要。例如,尝试浏览您最喜欢的包含高清照片的网站,您很快就会发现网站只加载了有限数量的图片。当您向下滚动页面时,占位符图片会迅速被实际图片替换。
例如,请注意Unsplash.com上的加载器:将页面该部分滚动到视图中会触发用全分辨率照片替换占位符:
为什么要实现图片懒加载?
了解如何懒加载图片对于优化网页性能至关重要,尤其是在包含大量视觉内容的页面上。以下是一些应该考虑为您的网站懒加载图片的理由:
1. 提升DOM加载时间
2. 节省带宽
懒加载图片有助于提高网站性能,但最好的方法是什么呢?
没有完美的方法。
如果您精通JavaScript,那么实现您自己的懒加载解决方案应该不成问题。没有什么比自己编写代码更能赋予您控制权了。
或者,您可以浏览网络以寻找可行的方法,或加入讨论论坛并分享想法。我做了同样的事情,并发现了这五种有趣的方法。
1. 原生懒加载
当用户滚动网页时,图片和iframe的原生懒加载是一种直接加载内容的方法。您只需要将loading="lazy"
属性添加到您的图片和iframe即可。
<code class="language-html"><img src="https://img.php.cn/upload/article/000/000/000/173897821515260.jpg" alt="5 Techniques for Lazy Loading Images to Boost Website Performance "> <iframe loading="lazy" src="content.html"></iframe></code>
如您所见,不需要JavaScript,也不需要动态替换src
属性的值,只需使用普通的HTML即可。此方法是无需任何额外开销地在HTML中添加懒加载的完美示例。
“loading”属性使我们可以延迟加载屏幕外的图片和iframe,直到用户滚动到页面上的相应位置。“loading”可以取以下三个值中的任何一个:
此方法无可匹敌:它几乎没有额外开销,并且是干净简单的在HTML中懒加载图片的方法。但是,尽管大多数主流浏览器都很好地支持“loading”属性,但在撰写本文时,一些浏览器仍然缺乏完全的支持。
有关此HTML懒加载图片的强大功能(包括浏览器支持变通方法)的深入文章,请不要错过Addy Osmani的“Native image lazy-loading for the web!”。
2. 使用Intersection Observer API进行懒加载
Intersection Observer API是一个现代接口,您可以利用它来懒加载图片和其他内容。
以下是MDN对该API的介绍:
Intersection Observer API提供了一种异步观察目标元素与祖先元素或顶级文档视窗相交变化的方法。
换句话说,Intersection Observer API异步地监视一个元素与另一个元素的相交情况。
Denys Mishunov撰写了一篇关于Intersection Observer和使用它懒加载图片的优秀教程。以下是他的解决方案:
假设您想懒加载一个图片库。每个图片的标记如下所示:
<code class="language-html"><img src="https://img.php.cn/upload/article/000/000/000/173897821515260.jpg" alt="5 Techniques for Lazy Loading Images to Boost Website Performance "> <iframe loading="lazy" src="content.html"></iframe></code>
在这里,图片的路径包含在data-src
属性中,而不是src
属性中。原因是使用src
意味着图片会立即加载,这不是您想要的。
在CSS中,您可以为每个图片指定一个min-height
值,例如100px。这会给每个图片占位符(没有src
属性的img元素)一个垂直尺寸:
<code class="language-html"><img src="https://img.php.cn/upload/article/000/000/000/173897821665537.jpg" alt="5 Techniques for Lazy Loading Images to Boost Website Performance "></code>
然后,在JavaScript文档中,您需要创建一个配置对象并使用intersectionObserver
实例注册它:
<code class="language-css">img { min-height: 100px; /* more styles here */ }</code>
最后,您可以迭代所有图片并将它们添加到此iterationObserver
实例中:
<code class="language-javascript">// 创建配置对象:rootMargin和threshold是接口公开的两个属性 const config = { rootMargin: '0px 0px 50px 0px', threshold: 0 }; // 使用intersectionObserver实例注册配置对象 let observer = new IntersectionObserver(function(entries, self) { // 迭代每个条目 entries.forEach(entry => { // 只处理相交的图片。isIntersecting是接口公开的属性 if(entry.isIntersecting) { // 将图片路径从data-src复制到src的自定义函数 preloadImage(entry.target); // 图片现在已就位,停止观察 self.unobserve(entry.target); } }); }, config);</code>
此解决方案的优点是易于实现、有效且具有相交性。Observer承担了计算方面的大部分工作。
在浏览器支持方面,除了IE 11和Opera Mini之外,所有主流浏览器在其最新版本中都支持Intersection Observer API。
您可以在Denys的文章中了解有关Intersection Observer API和此实现细节的更多信息。
3. Lozad.js
实现图片懒加载的快速简便的替代方法是让JS库为您完成大部分工作。
Lozad.js是一个高性能、轻量级且可配置的懒加载器,它使用纯JavaScript,没有任何依赖项。它是用户滚动时懒加载JavaScript、图片、视频和iframe的优秀工具。
您可以使用npm/Yarn安装Lozad,并使用您选择的模块打包器导入它:
<code class="language-javascript">const imgs = document.querySelectorAll('[data-src]'); imgs.forEach(img => { observer.observe(img); });</code>
<code class="language-bash">npm install --save lozad yarn add lozad</code>
或者,您可以简单地使用CDN下载库,并将其添加到HTML页面底部的
lozad
接下来,对于基本实现,请将类
<code class="language-javascript">import lozad from 'lozad';</code>
最后,在您的JS文档中实例化Lozad:
<code class="language-html"><img src="https://img.php.cn/upload/article/000/000/000/173897821885662.jpg" alt="5 Techniques for Lazy Loading Images to Boost Website Performance "></code>
您可以在Lozad GitHub存储库中找到使用该库的所有详细信息。
如果您不想了解Intersection Observer API,或者您只是在寻找适用于各种内容类型的快速实现,那么Lozad是一个不错的选择。
4. 带模糊图片效果的懒加载