笔记

Javascript/CSS

Vue/React

其它

杂物室

杂谈

工具

影像

sleep
宝可梦
西塞尔
Dedsec
Scarlet
Violet
P5
满月
黄昏
深夜
经典
回到顶部

个人的一种图片懒加载思路 #11

Anuluca     Date : 2020-08-01   Tags : 2

❗️ 此笔记写于2020年,请注意实效性

懒加载能够解决当一张页面图片过多导致图片加载缓慢、用户流量使用量大的问题,这里只提供一种针对原生js页面的解决思路

思路

1.图片img标签自定义一个属性data-src来存放真实的地址。

2.当滚动页面时,检查所有的img标签,判断是否出现在事业中,如果出现在视野中,继续进行判断,看齐是否被加载过了,如果没有加载,那就进行加载。

示意图

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<html lang="en">
<head>
<meta charset="UTF-8">
<title>原生js实现图片懒加载</title>
<style>
*{
margin: 0;
padding: 0;
box-sizing: border-box;
}
ul{
overflow: hidden;
list-style: none;
}
li{
float: left;
width: 50%;
height: 200px;
padding: 10px;
}
li img{
display: inline-block;
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<div class="container">
<ul>
<li><img data-src="http://cdn.jirengu.com/book.jirengu.com/img/1.jpg" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/1.jpg"></li>
<li><img data-src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/2.jpg"></li>
<li><img data-src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/3.jpg"></li>
<li><img data-src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/4.jpg"></li>
<li><img data-src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/5.jpg"></li>
<li><img data-src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/6.jpg"></li>
<li><img data-src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/7.jpg"></li>
<li><img data-src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/8.jpg"></li>
<li><img data-src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/9.jpg"></li>
<li><img data-src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/10.jpg"></li>
<li><img data-src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/11.jpg"></li>
<li><img data-src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/12.jpg"></li>
<li><img data-src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/13.jpg"></li>
<li><img data-src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/14.jpg"></li>
<li><img data-src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/15.jpg"></li>
<li><img data-src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/16.jpg"></li>
</ul>
</div>
<script>
// window绑定滚动事件
window.addEventListener('scroll',function(){
// 遍历所有的img标签
Array.prototype.slice.apply(document.getElementsByTagName('li')).forEach((li)=>{
let img=li.getElementsByTagName('img')[0];
// 判断当前img是否出现在了视野中
// 判断当前img是否被加载过了
if(checkShow(img) && !isLoaded(img)){
loadImg(img);
}
})
});

// 判断img是否出现浏览器视野中
function checkShow(img) {
let scrollTop=document.documentElement.scrollTop; // 页面向上滚动的高度
let windowHeight=window.innerHeight; //浏览器自身高度
let offsetTop=img.offsetTop; //目标标签相对于document的高度
return (offsetTop > scrollTop && offsetTop <(windowHeight + scrollTop));
}

// 判断是否已经加载过
function isLoaded(img) {
return img.getAttribute('src')===img.getAttribute('data-src');
}

// 加载图片
function loadImg(img) {
img.setAttribute('src',img.getAttribute('data-src'));
}

// 第一次进页面加载处于视野中的图片
Array.prototype.slice.apply(document.getElementsByTagName('li')).forEach((li)=>{
let img=li.getElementsByTagName('img')[0];
// 判断当前img是否出现在了视野中
// 判断当前img是否被加载过了
if(checkShow(img) && !isLoaded(img)){
loadImg(img);
}
})
</script>
</body>
</html>

还有一种思路,直接加loading属性,但这种方法只有Chrome支持,别的浏览器都不兼容

1
<img data-src="shanyue.jpg" loading="lazy">
由于某些原因,博客图床于5月26日惨遭爆破,目前正在整理需要的图片并迁移存活的图片到新图床,预计6月10日重新上线网站
   
THE END
   
讨论
 
© 2018 - 2024 Anuluca ▌友情链接 Tsuki's blog | Poke amice | 夜航星
  复制成功!