答案是使用intersection observer实现图片懒加载。1. 用data-src属性存放真实图片地址,src指向占位图;2. 通过javascript创建intersection observer实例,监听图片元素进入视口的状态;3. 当元素进入视口(配合rootmargin提前加载)时,将data-src的值赋给src,触发图片加载,并停止观察该元素;4. 对不支持的浏览器降级处理,直接加载图片。该方案避免了scroll事件导致的性能问题,利用浏览器原生异步机制,提升页面流畅度和用户体验,且可扩展应用于无限滚动、广告曝光、动画触发等多种场景,是当前最优雅高效的解决方案。

图片懒加载,尤其是在现代前端开发中,早已不是什么新鲜事,但如何优雅高效地实现它,却是个值得深思的问题。我的答案很简单:用
Intersection Observer
实现图片懒加载,核心思路就是让图片在进入用户视口之前不加载,或者只加载一个轻量级的占位符。
Intersection Observer
首先,HTML 部分,我们不再直接使用
src
data-src
loading
立即学习“前端免费学习笔记(深入)”;
<img alt="图片描述" class="lazyload-img" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"> <img alt="另一张图片" class="lazyload-img" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"> <!-- 更多图片... -->
CSS 部分,其实可以很简单,或者根据你的需求做一些加载动画。这里我们先保持简单。
.lazyload-img {
display: block; /* 确保图片独占一行,方便观察 */
width: 100%; /* 示例:图片宽度 */
min-height: 200px; /* 示例:给个最小高度,避免布局跳动 */
background-color: #f0f0f0; /* 占位背景色 */
}关键在于 JavaScript。我们需要创建一个
Intersection Observer
document.addEventListener('DOMContentLoaded', () => {
const lazyImages = document.querySelectorAll('.lazyload-img');
if ('IntersectionObserver' in window) {
let observer = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
const src = img.getAttribute('data-src');
if (src) {
img.src = src;
img.removeAttribute('data-src'); // 加载完成后移除data-src
observer.unobserve(img); // 停止观察已加载的图片
}
}
});
}, {
rootMargin: '0px 0px 200px 0px', // 提前200px加载
threshold: 0 // 只要有一个像素可见就触发
});
lazyImages.forEach(img => {
observer.observe(img);
});
} else {
// Fallback for browsers that don't support Intersection Observer
// 这部分可以考虑使用滚动事件或者直接加载所有图片
lazyImages.forEach(img => {
const src = img.getAttribute('data-src');
if (src) {
img.src = src;
img.removeAttribute('data-src');
}
});
}
});这段代码的核心逻辑是:当
lazyload-img
Intersection Observer
data-src
src
说实话,我个人是真受够了那些基于滚动事件的图片懒加载方案。过去,我们为了实现懒加载,不得不监听
scroll
getBoundingClientRect()
Intersection Observer
Intersection Observer
Intersection Observer
首先是
root
root
null
undefined
root
然后是
rootMargin
root
'0px 0px 200px 0px'
最后是
threshold
[0, 0.5, 1]
0
0.5
1
threshold: 0
rootMargin
threshold: 1
通过这三个参数的组合使用,
Intersection Observer
Intersection Observer
一个非常常见的场景是无限滚动(Infinite Scrolling)。当用户滚动到页面底部时,我们通常需要加载更多内容。使用
Intersection Observer
广告可见性检测也是一个重要的应用。对于广告商来说,了解广告是否真正被用户看到,以及被看到多久,是衡量广告效果的关键指标。
Intersection Observer
再比如,实现“粘性”元素(Sticky Elements)。虽然 CSS
position: sticky
Intersection Observer
它还能用于视频的自动播放/暂停。当视频元素进入视口时自动播放,离开视口时暂停,可以节省带宽并提升用户体验。同样,动画的触发也可以通过它实现,当元素进入视口时才播放动画,避免了页面加载时所有动画都立即执行,导致性能负担。
甚至在数据分析和用户行为追踪方面,
Intersection Observer
总而言之,任何需要判断“一个元素是否在另一个元素(通常是视口)中可见”的场景,
Intersection Observer
以上就是CSS怎样实现图片懒加载?intersection observer应用的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号