为什么需要实现图片懒加载?
图片懒加载适用场景: 多为一些电商产品, 多屏图片展示页面。
如果我们不进行懒加载会出现以下几个问题:
- 浪费带宽, 加载过多的无效资源, 因为不是所有用户都会查看。
- 并发资源加载过多会造成JS的堵塞。
实现懒加载原理
- 把img标签的src属性指向一个本地占位符图片
- 然后定义一个自定义属性data-src来引用真正的图片资源地址(图片需要指定宽高)
<img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" />
- 当载入初始化页面时候监听scroll事件, 滚动时候当图片进入可视化区域就修改src指向为data-src地址
代码实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>图片懒加载</title>
<style>
* {
margin: 0;
padding: 0;
}
img {
display: block;
margin-bottom: 50px;
width: 400px;
height: 400px;
}
</style>
</head>
<body>
<body>
<img
src="default.jpg"
data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg"
alt=""
/>
<img
src="default.jpg"
data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg"
alt=""
/>
<img
src="default.jpg"
data-src="http://ww1.sinaimg.cn/large/006y8mN6gw1fa7kaed2hpj30sg0l9q54.jpg"
alt=""
/>
<img
src="default.jpg"
data-src="http://ww1.sinaimg.cn/large/006y8mN6gw1fa7kaed2hpj30sg0l9q54.jpg"
alt=""
/>
<img
src="default.jpg"
data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg"
alt=""
/>
<img
src="default.jpg"
data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg"
alt=""
/>
<img
src="default.jpg"
data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg"
alt=""
/>
<img
src="default.jpg"
data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg"
alt=""
/>
<img
src="default.jpg"
data-src="http://ww1.sinaimg.cn/large/006y8mN6gw1fa7kaed2hpj30sg0l9q54.jpg"
alt=""
/>
<img
src="default.jpg"
data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg"
alt=""
/>
<img
src="default.jpg"
data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg"
alt=""
/>
</body>
<script>
window.onload = function() {
// 在delay时间内多次触发, 则清除之前定时器重新开启新的定时器.
// 超过time时间必须执行一次,重置上次执行时间
function throttle (fx, delay, time) {
let timer = null
let startTime
return function (...args) {
let currentTime = new Date()
const ctx = this
clearTimeout(timer)
if (currentTime - startTime >= time) {
fx.apply(ctx, args)
startTime = currentTime
} else {
timer = setTimeout(() => {
fx.apply(ctx, args)
}, delay)
}
}
}
const imgs = Array.from(document.documentElement.getElementsByTagName('img'))
const imgsLen = imgs.length
lazyLoad()
window.addEventListener('scroll', throttle(lazyLoad, 50, 1000))
function lazyLoad () {
console.log('触发scroll')
const clientHeight = document.documentElement.clientHeight
for (let i = 0; i < imgsLen; i++) {
const scrollTop = document.documentElement.scrollTop || document.body.scrollTop
if (imgs[i].offsetTop < clientHeight + scrollTop) {
const currentImg = imgs[i]
if (currentImg.getAttribute('src') === 'default.jpg') {
currentImg.setAttribute('src', currentImg.getAttribute('data-src'))
}
}
}
}
};
</script>
</body>
</html>
热门评论
看了你的3句话我就明白了懒加载,很厉害哦