LazyLoad 延迟加载(按需加载)是一种在页面加载时,只加载当前视窗内所需要的部分内容,避免不必要的资源浪费和页面加载时间过长的现象。这种技术在网站中的应用非常常见。
LazyLoad 延迟加载(按需加载)是一种在页面加载时,只加载当前视窗内所需要的部分内容,避免不必要的资源浪费和页面加载时间过长的现象。这种技术在网站中的应用非常常见。
实现方式
实现LazyLoad延迟加载的方式有多种,其中最常见的是使用JavaScript库。以下是一些常见的JavaScript库:
- Layzr.js:轻量级、易扩展和可定制,可用于图片和文本的延迟加载
- lozad.js:极简而快速的JavaScript库,可以延迟加载图像、视频、音频或iframe元素
- LazyLoad:使用内建可扩展API的高性能、小型JavaScript库,适用于多种元素的延迟加载。
实现流程
在使用现有库之前,应该了解延迟加载的基本原理和实现流程。下面以图片延迟加载为例,进行解释:
- 为需要延迟加载的图片添加占位符(例如一个占位符图形)。不要忘记将原始图片的URL保存在html标记中的一个特定属性中,通常是
data-src
<img src="https://via.placeholder.com/300x300" data-src="image.jpg">
- 加载完整页面后,使用JavaScript检测视窗内所有应该被延迟加载的图片。通常的方法是获取图片的位置和页面滚动位置,如果当前位置在可视窗口内,就将占位符替换为实际图片。否则,不需要进行图片加载
const images = document.querySelectorAll("img[data-src]");
const inViewport = (image) => {
const rect = image.getBoundingClientRect();
return (
rect.top >= 0
&& rect.left >= 0
&& rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)
&& rect.right <= (window.innerWidth || document.documentElement.clientWidth)
);
};
const loadImage = (image) => {
image.setAttribute("src", image.getAttribute("data-src"));
image.onload = () => {
image.removeAttribute("data-src");
image.style.opacity = 1;
};
};
const handleScroll = () => {
images.forEach((image) => {
if (inViewport(image)) {
loadImage(image);
}
});
};
window.addEventListener("load", handleScroll);
window.addEventListener("scroll", handleScroll);
在上述JavaScript示例中,我们
- 首先获取页面中所有含有 data-src
属性的图片
- 接着实现了 inViewport()
方法,以检测图片是否在页面视窗内
- loadImage()
方法用于替换占位符
- 最后使用事件监听器来获取页面的滚动,以重新检查需要延迟加载的图片并加载图像
示例说明
接下来示例说明如何使用Layzr.js库实现延迟加载原图并预加载已缩放版本的图像。
<img src="placeholder/300x300.png"
data-src="original-image.jpg"
data-src-small="300x300-image.jpg"
class="lazyload">
上述示例中,我们使用一个 lazyload
类来标记图片,并使用 data-src
属性来存储原始图像的URL,使用 data-src-small
存储25%的缩放版本的URL。我们还添加了一个占位符,这里使用了一个矩形的PNG。
在使用Layzr.js时,我们只需要如下简单代码:
const layzr = new layzr();
//延迟加载待替换的所有占位符中的原图像
layzr.on("load", (image) => {
//加载图片
const src = image.getAttribute("data-src");
image.setAttribute("src", src);
});
//预加载所有缩略图
document.addEventListener("DOMContentLoaded", () => {
const images = document.querySelectorAll("[data-src-small]");
images.forEach((img) => new Image().src = img.getAttribute("data-src-small"));
});
在上述JavaScript代码中,我们首先实例化了Layzr.js库,然后使用 on()
方法来监听 load
事件。在事件回调中,我们使用 setAttribute()
将实际图像的URL设置为图片的 src
属性。 load
事件在图片加载完成后立即触发。
最后,我们在页面加载时使用 document.addEventListener()
方法预加载所有缩略图。这样可以更好地保证延迟加载原图像时用户不会看到闪烁的问题。
参考文献:
- Lazy Loading Images Using Intersection Observer API in JavaScript
- Lozad.js - A performant, lazy loading and multi-serving image observer
- CallMeCavs/Layzr.js
本文标题为:LazyLoad 延迟加载(按需加载)
- js判断一个对象是否在一个对象数组中(场景分析) 2022-10-21
- ajax获得json对象数组 循环输出数据的方法 2023-02-23
- selenium+python自动化测试之页面元素定位 2023-12-13
- javascript – 如何从HTML表格中将数据插入mysql数据库 2023-10-26
- JavaScript实现限时秒杀功能 2023-12-02
- 解决浏览器记住ajax请求并能前进和后退问题 2023-02-14
- 前端ajax的各种与后端交互的姿势 2023-02-01
- 详细谈谈ES6中的symbol数据类型 2023-08-08
- layui table如何隐藏列 2022-10-20
- 3.实体标签.html 2023-10-27