图片懒加载
什么是图片懒加载
- 图片懒加载又叫图片延迟(按需)加载
- 在需要的时候加载图片
- 更好的加载页面的首屏内容 无需考虑整个页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>图片懒加载</title>
<style>
* {
padding: 0;
margin: 0;
}
img {
width: 100%;
height: 183px;
}
</style>
</head>
<body>
<div class="img-container">
<img
src="https://gitee.com/z1725163126/cloundImg/raw/master/loading.gif"
alt=""
data-src="https://gitee.com/z1725163126/cloundImg/raw/master/1.jpg"
class="lazyload"
/>
</div>
<div class="img-container">
<img
src="https://gitee.com/z1725163126/cloundImg/raw/master/loading.gif"
alt=""
data-src="https://gitee.com/z1725163126/cloundImg/raw/master/2.jpg"
class="lazyload"
/>
</div>
<div class="img-container">
<img
src="https://gitee.com/z1725163126/cloundImg/raw/master/loading.gif"
alt=""
data-src="https://gitee.com/z1725163126/cloundImg/raw/master/3.jpg"
class="lazyload"
/>
</div>
<div class="img-container">
<img
src="https://gitee.com/z1725163126/cloundImg/raw/master/loading.gif"
alt=""
data-src="https://gitee.com/z1725163126/cloundImg/raw/master/4.jpg"
class="lazyload"
/>
</div>
<div class="img-container">
<img
src="https://gitee.com/z1725163126/cloundImg/raw/master/loading.gif"
alt=""
data-src="https://gitee.com/z1725163126/cloundImg/raw/master/5.jpg"
class="lazyload"
/>
</div>
<script>
const imgs = [...document.querySelectorAll(".lazyload")];
const observer = new IntersectionObserver(function (entries) {
entries.forEach(item => {
if (item.target.nodeName === 'IMG' && item.isIntersecting) {
item.target.src = item.target.dataset.src
observer.unobserve(item.target)
}
})
})
imgs.forEach(item => {
observer.observe(item)
})
</script>
</body>
</html>
图片预加载
预加载的实际应用
- 大图片可以预加载,可以解决图片从上往下逐渐显示的现象
- 在这一页面的时候加载下一页,提升用户体验,比如漫画
<!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-container {
display: flex;
align-items: center;
height: 100vh;
background-color: rgba(0, 0, 0, 0.5);
}
img {
width: 100%;
}
* {
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<div class="img-container">
<img src="https://gitee.com/z1725163126/cloundImg/raw/master/1.jpg" alt="图片" id="img" />
</div>
<script>
const imgs = [
"https://gitee.com/z1725163126/cloundImg/raw/master/2.jpg",
"https://gitee.com/z1725163126/cloundImg/raw/master/3.jpg",
"https://gitee.com/z1725163126/cloundImg/raw/master/4.jpg",
"https://gitee.com/z1725163126/cloundImg/raw/master/5.jpg",
];
let i = 0;
const $img = document.getElementById("img");
preload(imgs[i])
.then((data) => {})
.catch(() => {});
$img.addEventListener(
"click",
() => {
if (i < imgs.length) {
$img.src = imgs[i];
i++;
if (i < imgs.length) {
preload(imgs[i]);
}
} else {
console.log("已经是最后一张了!");
}
},
false
);
function preload(src) {
return new Promise((resolve, reject) => {
const image = new Image();
image.addEventListener("load", () => resolve(image), false);
image.addEventListener("error", () => reject(), false);
image.src = src;
});
}
</script>
</body>
</html>