背景
页面有巨多张图片, 可能每张都还挺大, 一次加载很慢, 期望只加载用户当前看到的图片(即浏览器可视区域)
实现思路
将图片的实际地址写在一个其他属性中, 判断图片偏移高度, 决定是否加载此图片。
代码实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>图片懒加载</title>
<style>
img {
/* width: 600px;
height: 400px; */
display: block;
}
</style>
</head>
<body>
<div class="main">
<p id="aa"></p>
<img src="" alt="" data-src="img/img (1).png">
<img src="" alt="" data-src="img/img (2).png">
<img src="" alt="" data-src="img/img (3).png">
<img src="" alt="" data-src="img/img (4).png">
<img src="" alt="" data-src="img/img (5).png">
<img src="" alt="" data-src="img/img (6).png">
<img src="" alt="" data-src="img/img (7).png">
<img src="" alt="" data-src="img/img (8).png">
<img src="" alt="" data-src="img/img (9).png">
<img src="" alt="" data-src="img/img (10).png">
</div>
</body>
<script>
window.onload = function () {
// 可以将一些优先级高德操作放到这里, 优先图片实际加载
let aa = document.getElementById('aa')
aa.innerHTML = '<h1>页面加载完了...</h1>'
// 开始时加载第一屏图片
loadImg();
}
// 页面滚动时候监听
window.addEventListener('scroll', () => {
loadImg()
})
/**
*
* 懒加载图片
*
* */
function loadImg() {
// 获取所有的图片
let imgs = document.querySelectorAll('img')
// 当前窗口高度
let winHeight = window.innerHeight
// 已滚动的高度
let scrollTop = document.documentElement.scrollTop || document.body.scrollTop
// 判断图片高度偏移量, 确定是否加载图片
// 关于图片偏移量: 如果图片有设置大小, 则立刻可以计算出偏移量, 否则等前一张图片加载完成才会出现偏移量数据
imgs.forEach(img => {
if (winHeight + scrollTop > img.offsetTop) {
// 替换真实地址给src
img.src = img.dataset.src
}
})
}
</script>
</html>
扩展
可以给
<img/>
标签一个默认的小图片, 保证页面美感