使用javascript&jQuery实现站点图片懒加载(lazy-load))
发布时间:2020-09-27
浏览量: 2039
文章分类: 前端相关
很多图片多的网站,在网站运行的时候都会执行懒加载的模式。
所谓懒加载(lazy-load)也就是检测页面的视窗大小,根据视口的大小来判断当前显示到哪里了,然后将显示到视口的图片展示出来。这样可以避免图片太多,打开缓慢的问题。
实现的原理
在页面初始化渲染的时候,我们一般的图片样式如下
<img src="https://wuyabala.com/static/img/logo.jpg">
而我们试行懒加载的时候,可以给里面多一个属性data-src,将图片的地址属性存放在里面,src先写为空。当这个图片处于页面可视范围的时候,在把data-src赋给src即可。
那么实际我们的样式如下:
<img class="lazy-load-img pic"
alt="页面加载中.."
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
效果
注意看滚动的时候,和页面发送的请求,也就是当视口显示到的时候,才会发起请求显示图片

实现
javascript
既然要实现页面所有的图片(或指定的图片)那么需要先获取到这些图片的属性,然后只要计算出视口的高度确认显示的内容,然后将处于视口的图片data-src属性移动到src里面即可实现。
<script>
// 获取所有的图片标签
const imgs = document.getElementsByClassName("lazy-load-img");
const viewHeight = window.innerHeight || document.documentElement.clientHeight;
let num = 0;
function lazyload() {
console.log("滚动...");
for (let i = num; i < imgs.length; i++) {
// 用可视区域高度减去元素顶部距离可视区域顶部的高度
let distance = viewHeight - imgs[i].getBoundingClientRect().top;
// 如果可视区域高度大于等于元素顶部距离可视区域顶部的高度,说明元素露出
if (distance >= 0) {
// 给元素写入真实的src,展示图片
imgs[i].src = imgs[i].getAttribute("data-src");
// 前i张图片已经加载完毕,下次从第i+1张开始检查是否露出
num = i + 1;
}
}
}
// 是的页面初始化是加载首屏图片
window.onload = lazyload();
window.addEventListener("scroll", lazyload);
</script>
jQuery
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>图片懒加载</title>
<script src="../plugins/jquery-3.5.1.min.js"></script>
<style>
div {
width: 200px;
height: 200px;
background-color: gray;
margin-bottom: 20px;
}
.pic{
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<div class="container">
<div>
<!-- 注意我们并没有为它引入真实的src -->
<img class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
<div>
<img
class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
<div>
<img
class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
<div>
<img
class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
<div>
<img
class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
<div>
<img
class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
<div>
<img
class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
<div>
<img
class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
<div>
<img
class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
<div>
<img
class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
<div>
<img
class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
<div>
<img
class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
<div>
<img
class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
<div>
<img
class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
<div>
<img
class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
<div>
<img
class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
<div>
<img
class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
<div>
<img
class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
<div>
<img
class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
<div>
<img
class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
<div>
<img
class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
<div>
<img
class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
<div>
<img
class="lazy-load-img pic"
alt="加载中"
data-src="https://wuyabala.com/static/img/logo.jpg"
/>
</div>
</div>
<script>
// 获取页面所有的图片标签
const lazyLoadImgs = $('.lazy-load-img');
// 获取可视区域的高度
const viewHeight = $(window).height();
let num = 0;
function lazyload(){
console.log('滚动...');
for (let i = num; i < lazyLoadImgs.length; i++) {
// 用可视区域高度减去元素顶部距离可视区域顶部的高度
let distance = viewHeight - lazyLoadImgs[i].getBoundingClientRect().top;
// 如果可视区域高度大于等于元素顶部距离可视区域顶部的高度,说明元素露出
if (distance >= 0) {
// 给元素写入真实的src,展示图片
lazyLoadImgs[i].src = lazyLoadImgs[i].getAttribute("data-src");
// 前i张图片已经加载完毕,下次从第i+1张开始检查是否露出
num = i + 1;
}
}
}
$(function(){
lazyload();
$(window).scroll(function(){
lazyload()
})
})
</script>
</body>
</html>