以下是一个使用HTML+CSS+JavaScript实现图片懒加载的示例代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>图片懒加载示例</title>
<style>
.lazyload {
width: 100%;
min-height: 200px;
background: #f0f0f0;
transition: opacity 0.3s;
opacity: 0;
}
.lazyload.loaded {
opacity: 1;
}
.container {
max-width: 800px;
margin: 0 auto;
padding: 20px;
}
.image-item {
margin-bottom: 400px; /* 增加滚动区域 */
}
</style>
</head>
<body>
<div>
<h1>滚动查看图片加载效果</h1>
<div>
<img data-src="https://picsum.photos/800/400?random=1" alt="示例图片1">
</div>
<div>
<img data-src="https://picsum.photos/800/400?random=2" alt="示例图片2">
</div>
<div>
<img data-src="https://picsum.photos/800/400?random=3" alt="示例图片3">
</div>
<div>
<img data-src="https://picsum.photos/800/400?random=4" alt="示例图片4">
</div>
</div>
<script>
document.addEventListener("DOMContentLoaded", function() {
// 获取所有需要懒加载的图片
const lazyloadImages = document.querySelectorAll('.lazyload');
// 配置Intersection Observer
const observerOptions = {
root: null, // 使用视口作为根
rootMargin: '0px 0px 100px 0px', // 提前100px触发加载
threshold: 0.1
};
// 观察回调函数
const observerCallback = (entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
img.onload = () => {
img.classList.add('loaded');
};
observer.unobserve(img); // 停止观察已加载的图片
}
});
};
// 创建观察器
const observer = new IntersectionObserver(observerCallback, observerOptions);
// 开始观察所有图片
lazyloadImages.forEach(img => {
observer.observe(img);
});
// 处理可能的初始化可见图片
window.addEventListener('load', () => {
lazyloadImages.forEach(img => {
if(img.getBoundingClientRect().top < window.innerHeight + 100) {
img.src = img.dataset.src;
img.classList.add('loaded');
observer.unobserve(img);
}
});
});
});
</script>
</body>
</html>使用data-src属性存储真实图片地址
添加lazyload类用于标识需要懒加载的图片
包含多个带占位符的图片容器
设置初始透明度为0,加载后渐显效果
添加*小高度防止布局抖动
设置灰色背景作为占位符
容器样式用于布局控制
使用Intersection Observer API检测元素可见性
配置提前100px触发加载(通过rootMargin实现)
图片进入视口时替换src属性
图片加载完成后添加loaded类触发渐显动画
加载完成后停止观察该图片
添加初始化检查确保首屏图片立即加载
实际使用时需要确保图片地址正确可用
可根据需要调整以下参数:
rootMargin:控制提前加载的距离
threshold:触发加载的可见比例
动画时长和效果
需要处理图片加载失败的情况(可添加onerror事件处理)
兼容性:需要为不支持Intersection Observer的浏览器提供polyfill
渐进式加载体验
滚动时自动加载
平滑的渐显动画
高性能的观察机制
首屏内容优先加载
你可以通过修改CSS中的transition属性值和添加更多图片来测试不同效果。实际部署时建议压缩代码并添加错误处理。