更现代的实现懒加载的方法
属性 loading = 'lazy'
loading='lazy' 是一个 HTML 属性,用于控制图片或 iframe 的加载方式。它可以让浏览器在滚动到可见区域时才加载这些资源,而不是在页面加载时立即加载。这可以显著提高页面的初始加载速度和性能,特别是在包含大量图片或 iframe 的页面中。
iframe
<iframe>(Inline Frame)是 HTML 中的一个元素,用于在当前页面中嵌入另一个 HTML 文档。这个嵌入的文档可以来自同一个域名,也可以来自不同的域名。<iframe> 元素创建了一个独立的浏览器上下文,这意味着嵌入的内容与主页面是隔离的,它们可以有不同的样式、脚本和 cookie。
常见用途
- 嵌入外部网站:可以在自己的网页中嵌入其他网站的内容,常用于展示第三方服务或工具。
- 广告:许多在线广告系统使用 iframes 来嵌入广告代码。
- 嵌入视频:YouTube、Vimeo 等视频平台提供的嵌入代码通常使用 iframes。
- 嵌入地图:Google Maps、OpenStreetMap 等地图服务也提供 iframes 用于嵌入地图。
- 隔离内容:通过 iframes 可以将某些内容与主页面隔离,避免脚本冲突或其他安全问题。
<iframe src="https://www.example.com" width="600" height="400" title="Example Website"></iframe>
我们可以直接在标签内添加loading='lazy'来实现懒加载
<img src="image.jpg" alt="描述" loading="lazy">
属性值
eager:默认值,表示资源会立即加载。lazy:表示资源会在进入视口(即用户滚动到该位置)时才加载。auto:由浏览器决定何时加载资源(通常等同于eager)。
优点
- 提高页面加载速度:减少了初始加载时的请求数量,使页面更快地呈现给用户。
- 减少带宽使用:如果用户没有滚动到某些内容,那么这些内容的资源就不会被加载,从而节省了带宽。
- 更好的用户体验:页面加载更快,用户可以更快地看到主要内容。
兼容性
loading='lazy' 在现代浏览器中的支持情况非常好,以下是主要浏览器的支持情况:
- Chrome:76+ 版本
- Firefox:75+ 版本
- Safari:13.1+ 版本
- Edge:80+ 版本
- Opera:63+ 版本
对于不支持 loading='lazy' 的旧版浏览器,图片和 iframe 会回退到默认的立即加载行为。
IntersectionObserver(浏览器API)
function addObserver(){
const elses = document.querySelectorAll('img[data-original][lazyload]');
const observer = new IntersectionObserver(function(changes){
changes.forEach(function(element){
if(element.intersectionRatio > 0 && element.intersectionRatio <=1){
const img = new Image();
img.src = element.target.dataset.original;
img.onload = function(){
element.target.src = img.src;
}
}
})
});
elses.forEach((item)=>{
// 把每一个元素都加入观察对象
observer.observe(item);
})
}
addObserver();
- 这里定义了一个
IntersectionObserver的实例,并传入一个回调函数。这个回调函数会在目标元素的可见性发生变化时被调用。
IntersectionObserver 构造函数和方法
-
构造函数:
const observer = new IntersectionObserver(callback, options);-
callback:回调函数,当目标元素的交集状态发生变化时调用。 -
options:配置选项对象,可以设置以下属性:root:指定根元素,默认为null(即视口)。rootMargin:根元素的外边距,类似于 CSS 的margin属性。threshold:触发回调函数的交集比例阈值,可以是单个数字或数组。
-
-
方法:
observe(target): 开始观察目标元素。unobserve(target): 停止观察目标元素。disconnect(): 停止观察所有目标元素,并释放资源。
changes
-
changes是一个数组,每个数组元素是一个IntersectionObserverEntry对象。 -
IntersectionObserverEntry对象包含以下属性:time: 观察到交集变化的时间戳。target: 被观察的目标元素。rootBounds: 根元素的边界矩形。boundingClientRect: 目标元素的边界矩形。intersectionRect: 目标元素与根元素的交集矩形。intersectionRatio: 目标元素与根元素(可视窗口)的交集比例(0 到 1 之间)。
每一次观察的元素发生变化,就会在changes数组中增添一个新的 IntersectionObserverEntry 对象
结合以上知识点和代码,你可以很快的了解他们的API和用法,也建议大家联系AI食用哦~