1. 懒加载
懒加载英文为lazy-loading或load-on-demand,顾名思义,就是按需延迟加载。典型的适用场景:
1) 随着页面滚动,延迟加载资源。
2) 实现资源随页面滚动无限生成。
2. 资源延迟加载(Pure Javascript)
1 <!doctype html>
2 <html lang="en">
3 <head>
4 <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
5 <meta name="viewport" content="width=device-width, initial-scale=1" />
6 <script type="text/javascript" src="/index.js"></script>
7 <style type="text/css">
8 .gallery { width: 80%; margin: auto; }
9 .lazy-image { display: inline-block; width: 30%; height: 50vh; }
10 </style>
11 </head>
12 <body>
13 <div class="gallery">
14 <img class="lazy-image"> <img class="lazy-image"> <img class="lazy-image">
15 <img class="lazy-image"> <img class="lazy-image"> <img class="lazy-image">
16 <img class="lazy-image"> <img class="lazy-image"> <img class="lazy-image">
17 <img class="lazy-image"> <img class="lazy-image"> <img class="lazy-image">
18 <img class="lazy-image"> <img class="lazy-image"> <img class="lazy-image">
19 <img class="lazy-image"> <img class="lazy-image"> <img class="lazy-image">
20 <img class="lazy-image"> <img class="lazy-image"> <img class="lazy-image">
21 <img class="lazy-image"> <img class="lazy-image"> <img class="lazy-image">
22 <img class="lazy-image"> <img class="lazy-image"> <img class="lazy-image">
23 <img class="lazy-image"> <img class="lazy-image"> <img class="lazy-image">
24 </div>
25 </body>
26 </html>
1 window.onload = () => {
2 let lazyImages = [...document.querySelectorAll(".lazy-image")];
3
4 lazyImages.forEach(image => {
5 image.dataset.src = "https://picsum.photos/seed/" + Math.floor(Math.random() * 10000) + "/200.webp";
6 });
7
8 function handler() {
9 lazyImages.forEach(image => {
10 let imageTop = image.getBoundingClientRect().top + window.pageYOffset;
11
12 if(imageTop < window.innerHeight + window.pageYOffset)
13 image.src = image.dataset.src;
14 });
15 };
16
17 handler();
18
19 window.addEventListener("scroll", handler);
20 window.addEventListener("resize", handler);
3. 资源延迟加载(IntersectionObserver)
1 window.onload = () => {
2 function handler(entryies, observer) {
3 entryies.forEach(entry => {
4 if(entry.isIntersecting) {
5 observer.unobserve(entry.target);
6 entry.target.src = entry.target.dataset.src;
7 }
8 });
9 }
10
11 const OPTIONS = {
12 root: null,
13 threshold: [0.0],
14 rootMargin: "0px 0px 0px 0px",
15 };
16
17 let lazyImages = [...document.querySelectorAll(".lazy-image")];
18
19 lazyImages.forEach(image => {
20 image.dataset.src = "https://picsum.photos/seed/" + Math.floor(Math.random() * 10000) + "/200.webp";
21 });
22
23 let observer = new IntersectionObserver(handler, OPTIONS);
24
25 lazyImages.forEach(image => observer.observe(image));
26 };
4. 资源无限生成(IntersectionObserver)
1 <!doctype html>
2 <html lang="en">
3 <head>
4 <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
5 <meta name="viewport" content="width=device-width, initial-scale=1" />
6 <script type="text/javascript" src="/index.js"></script>
7 <style type="text/css">
8 .box { width: 80%; margin: auto; }
9 .image { display: inline-block; width: 15%; height: 25vh; }
10 </style>
11 </head>
12 <body>
13 <div class="box"></div>
14 <footer class="footer"></footer>
15 </body>
16 </html>
1 window.onload = function() {
2 const ONE_PAGE = 4 * 6;
3
4 function loadMore(size) {
5 let box = document.querySelector(".box");
6
7 while(size--) {
8 let txt = document.createTextNode(" ");
9 let img = document.createElement("img");
10
11 img.className = "image";
12 img.src = "https://picsum.photos/seed/" + Math.floor(Math.random() * 10000) + "/200.webp";
13
14 box.appendChild(img);
15 box.appendChild(txt);
16 }
17 }
18
19 loadMore(ONE_PAGE);
20
21 new IntersectionObserver((entries) => {
22 if(entries[0].isIntersecting) loadMore(ONE_PAGE);
23 }).observe(document.querySelector(".footer"));
24 };