目的:
- 大量图片的网站,一次性加载所有图片会存在速度变慢,卡顿等问题。
- 我们可以使用图片懒加载技术,只加载视口内的图片,其余图片用默认小图片 (由于所有图片都使用这一张小图片,只会发送一次请求,不会增加性能负担。) 或者骨架屏代替。
- 等图片滚动到可视区后,再给图片
url
赋值。 - 这样优化了前端加载速度,提高了性能
核心思路:
scrollTop
判断图片滚动的距离, innerHeight
求当前视口高度,offsetTop
得到图片相对于父元素的位置,然后scrollTop clientH - elementTop - 图片自身的高度
得到元素当前的位置。
如果 >=0 说明该元素在视口内,给元素的url赋值
代码实现:
代码语言:javascript复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
ul{
list-style: none;
}
li{
width: 100%;
height: 200px;
text-align: center;
line-height: 200px
}
img{
display: block;
height: 200px;
}
</style>
</head>
<body>
<!-- <img data-url="真实图片地址" src="小图片地址"/> -->
<img src="./images/1pxImg.png" data-url="./images/01.jpg">
<img src="./images/1pxImg.png" data-url="./images/01.jpg">
<img src="./images/1pxImg.png" data-url="./images/02.jpg">
<img src="./images/1pxImg.png" data-url="./images/02.jpg">
<img src="./images/1pxImg.png" data-url="./images/03.jpg">
<img src="./images/1pxImg.png" data-url="./images/03.jpg">
<img src="./images/1pxImg.png" data-url="./images/04.jpg">
<img src="./images/1pxImg.png" data-url="./images/04.jpg">
<script>
let imgs = document.querySelectorAll('img')
console.log(imgs);
scrollFn()
// 监听滚动事件
window.onscroll = scrollFn
function scrollFn() {
let clientH = window.innerHeight // 可视区高度
let scrollTop = document.documentElement.scrollTop // 滚动的高度
console.log(clientH, scrollTop)
Array.from(imgs).forEach(item => {
let elementTop = item.offsetTop // 元素相对于父元素的位置
// console.log('eleTop', elementTop)
let count = scrollTop clientH - elementTop - item.height // 元素的位置
console.log('count',count)
if(count >= 0) {
// 如果大于等于0,说明在可视区内,给图片赋值
item.setAttribute('src', item.getAttribute('data-url'))
}
})
}
</script>
</body>
</html>