Posts 实现一个Lazy-Load
Post
Cancel

实现一个Lazy-Load

我们可以在页面打开的时候把首屏的图片资源加载出来,等用户滚动的时候再把页面其他部分呈现。

html

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
<!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>Lazy-Load</title>
    <style>
      .img {
        width: 200px;
        height: 200px;
        background-color: gray;
      }
      .pic {
        /* 必要的img样式 */
      }
    </style>
  </head>
  <body>
    <div class="container">
      <div class="img">
        // 注意我们并没有为它引入真实的src
        <img class="pic" alt="加载中" data-src="./images/1.png" />
      </div>
      <div class="img">
        <img class="pic" alt="加载中" data-src="./images/2.png" />
      </div>
      <div class="img">
        <img class="pic" alt="加载中" data-src="./images/3.png" />
      </div>
      <div class="img">
        <img class="pic" alt="加载中" data-src="./images/4.png" />
      </div>
      <div class="img">
        <img class="pic" alt="加载中" data-src="./images/5.png" />
      </div>
      <div class="img">
        <img class="pic" alt="加载中" data-src="./images/6.png" />
      </div>
      <div class="img">
        <img class="pic" alt="加载中" data-src="./images/5.png" />
      </div>
      <div class="img">
        <img class="pic" alt="加载中" data-src="./images/6.png" />
      </div>
      <div class="img">
        <img class="pic" alt="加载中" data-src="./images/7.png" />
      </div>
      <div class="img">
        <img class="pic" alt="加载中" data-src="./images/8.png" />
      </div>
      <div class="img">
        <img class="pic" alt="加载中" data-src="./images/9.png" />
      </div>
      <div class="img">
        <img class="pic" alt="加载中" data-src="./images/10.png" />
      </div>
    </div>
  </body>
</html>

在懒加载的实现中,有两个关键的数值:一个是当前可视区域的高度,另一个是元素距离可视区域顶部的高度

当前可视区域的高度:

1
const viewHeight = window.innerHeight || document.documentElement.clientHeight;

元素距离可视区域顶部的高度:

1
const elRect = getClientRects();

DOMRect 对象包含了一组用于描述边框的只读属性——left、top、right 和 bottom,单位为像素。除了 width 和 height 外的属性都是相对于视口的左上角位置而言的。

其中需要引起我们注意的就是 left、top、right 和 bottom,它们对应到元素上是这样的:

01.png

Lazy-Load 实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 获取所有的图片标签
const imgs = document.getElementsByTagName("img");
// 获取可视区域的高度
const viewHeight = window.innerHeight || document.documentElement.clientHeight;
// num用于统计当前显示到了哪一张图片,避免每次都从第一张图片开始检查是否露出
let num = 0;
function lazyload() {
  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;
    }
  }
}
// 监听Scroll事件
window.addEventListener("scroll", lazyload, false);
This post is licensed under CC BY 4.0 by the author.
Trending Tags

Trending Tags