延迟加载通过推迟非关键资源加载提升性能,主要采用HTML的loading="lazy"属性或JavaScript的Intersection Observer API。前者适用于图片和iframe,实现简单且由浏览器原生支持;后者可精细控制加载时机,支持背景图、视频等更多元素类型。核心优势包括加快首屏加载、节约带宽、改善用户体验及SEO。需注意设置宽高防止布局偏移、避免首屏关键资源延迟、提供占位符与JS失效回退方案,并结合响应式图片优化。兼容性不足时可使用Polyfill或降级处理。

HTML中实现延迟加载主要通过
loading="lazy"
解决方案
延迟加载(Lazy Loading)的核心理念是,将非关键资源(如位于视口外的图片、视频、iframe等)的加载推迟到它们即将进入或已经进入用户视口时才进行。这能有效减少页面首次加载时的资源请求和数据量,从而加快页面渲染速度,提升用户体验,尤其是在移动设备或网络条件不佳的情况下。
1. 使用HTML原生loading="lazy"
立即学习“前端免费学习笔记(深入)”;
这是最简单、最推荐的方式,因为它无需JavaScript,由浏览器原生支持。你只需要在
<img>
<iframe>
loading="lazy"
<!-- 图片延迟加载 --> <img src="placeholder.png" alt="描述" loading="lazy" width="800" height="600"> <!-- iframe延迟加载 --> <iframe src="about:blank" loading="lazy" width="560" height="315" frameborder="0" allowfullscreen></iframe>
loading="lazy"
<img>
<iframe>
<video>
2. 使用JavaScript的Intersection Observer API
当需要更精细的控制、支持更多元素类型或需要兼容性更好的方案时,Intersection Observer API是一个强大的工具。它允许你异步观察目标元素与祖先元素或文档视口之间的交叉状态变化。
<!-- HTML 结构示例 -->
<img class="lazy-load" src="placeholder.png" alt="描述" width="800" height="600">
<div class="lazy-load-bg" data-bg-src="background-image.jpg" style="min-height: 300px;"></div>
<video class="lazy-load-video" controls width="640" height="360">
<source src="placeholder.mp4" type="video/mp4">
</video>
<script>
document.addEventListener("DOMContentLoaded", function() {
const lazyLoadElements = document.querySelectorAll('.lazy-load, .lazy-load-bg, .lazy-load-video');
if ("IntersectionObserver" in window) {
let lazyObserver = new IntersectionObserver(function(entries, observer) {
entries.forEach(function(entry) {
if (entry.isIntersecting) {
const target = entry.target;
// 图片
if (target.tagName === 'IMG' && target.dataset.src) {
target.src = target.dataset.src;
// 如果有srcset,也处理
if (target.dataset.srcset) {
target.srcset = target.dataset.srcset;
}
}
// 背景图片
else if (target.classList.contains('lazy-load-bg') && target.dataset.bgSrc) {
target.style.backgroundImage = `url(${target.dataset.bgSrc})`;
}
// 视频
else if (target.tagName === 'VIDEO' && target.dataset.src) {
// 移除placeholder source,添加实际source
const sourceElement = document.createElement('source');
sourceElement.src = target.dataset.src;
sourceElement.type = 'video/mp4'; // 根据实际视频类型调整
target.appendChild(sourceElement);
target.load(); // 重新加载视频
}
observer.unobserve(target); // 一旦加载,停止观察
}
});
}, {
rootMargin: "0px 0px 100px 0px" // 在元素进入视口前100px开始加载
});
lazyLoadElements.forEach(function(element) {
lazyObserver.observe(element);
});
} else {
// Fallback for browsers that don't support Intersection Observer
// 可以直接加载所有资源,或者使用更传统的scroll/resize事件监听(不推荐,性能差)
lazyLoadElements.forEach(function(element) {
if (element.tagName === 'IMG' && element.dataset.src) {
element.src = element.dataset.src;
} else if (element.classList.contains('lazy-load-bg') && element.dataset.bgSrc) {
element.style.backgroundImage = `url(${element.dataset.bgSrc})`;
} else if (element.tagName === 'VIDEO' && element.dataset.src) {
const sourceElement = document.createElement('source');
sourceElement.src = element.dataset.src;
sourceElement.type = 'video/mp4';
element.appendChild(sourceElement);
element.load();
}
});
}
});
</script><img>
src
data-src
IntersectionObserver
root
entry.isIntersecting
true
data-src
src
style.backgroundImage
observer.unobserve(target)
说实话,我个人在开发中,对页面加载速度的执念挺深的。想象一下,你打开一个电商网站,或者一个新闻聚合页,如果图片刷刷刷地跳出来,文字内容也很快呈现,那种感觉是很流畅的。但如果页面半天白屏,或者图片一张张缓慢地加载,甚至导致页面布局跳动,那种糟糕的用户体验简直能让人直接关掉页面。这就是为什么延迟加载(Lazy Loading)成了现代Web开发中几乎不可或缺的一环。
它带来的好处是实实在在的:
从我的经验来看,尤其是在处理大量图片或复杂组件的页面时,不使用延迟加载几乎是不可想象的。它不是一个“锦上添花”的功能,而是现代Web性能优化的“基石”之一。
loading="lazy"
loading="lazy"
以下情况,你可能就需要考虑JavaScript方案,或者至少将其作为补充:
loading="lazy"
<img>
<iframe>
loading="lazy"
<video>
loading="lazy"
rootMargin
loading="lazy"
loading="lazy"
所以,我的看法是,
loading="lazy"
在实际操作延迟加载时,我遇到过不少“坑”,也总结了一些优化策略。这东西看着简单,但要做到既有效又不出问题,还是有些细节需要注意的。
常见的“坑”:
width
height
优化策略:
<img>
<iframe>
width
height
aspect-ratio
<img src="placeholder.png" alt="描述" width="800" height="600" loading="lazy">
<link rel="preload">
<img src="hero.jpg" alt="主图" width="1200" height="800" fetchpriority="high">
loading="eager"
fetchpriority="high"
loading="lazy"
<noscript>
data-src
src
srcset
sizes
<img>
loading="lazy"
srcset
sizes
<img src="placeholder.png" data-srcset="small.jpg 480w, medium.jpg 800w, large.jpg 1200w" sizes="(max-width: 600px) 480px, 800px" alt="描述" loading="lazy">
srcset
sizes
data-
rootMargin
rootMargin
"0px 0px 200px 0px"
总的来说,延迟加载是一个强大的工具,但它需要细致的规划和测试。避免盲目应用,而是根据实际情况,结合原生属性和JavaScript方案,并注意上述的“坑”与优化策略,才能真正发挥它的价值。
以上就是HTML中如何实现延迟加载的详细内容,更多请关注php中文网其它相关文章!
HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号