懒加载与节流

为什么需要懒加载:浏览器一个页面在图片很多的情况下,并不是页面中所有的图片都需要同时加载出来,而且同时加载出来增加了服务器的负担。这种情况下,用户看不见的图片可以不用加载出来。

原理:可视范围以下的图片用户看不见,因此在一开始可以不用加载。即页面卷曲值(document.documentElement.scrollTop|document.body.scrollTop)与可视区高度(window.innerHeight)之和小于该图片距页面顶部的距离(img.offsetTop)时可以不加载

优点:提高前端性能,提高页面加载速度,减少带宽。

实现:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="index.js"></script>
    <style>
        img {
            display: block;
            width: 200px;
            height: 200px;
        }
    </style>
</head>

<body>
    <div>
        <img src="images/a.jpg" alt="" data-src="images/1.jpg">
        <img src="images/a.jpg" alt="" data-src="images/2.jpg">
        <img src="images/a.jpg" alt="" data-src="images/3.jpg">
        <img src="images/a.jpg" alt="" data-src="images/4.jpg">
        <img src="images/a.jpg" alt="" data-src="images/5.jpg">
        <img src="images/a.jpg" alt="" data-src="images/6.jpg">
        <img src="images/a.jpg" alt="" data-src="images/7.jpeg">
        <img src="images/a.jpg" alt="" data-src="images/8.jpeg">
        <img src="images/a.jpg" alt="" data-src="images/9.jpeg">
        <img src="images/a.jpg" alt="" data-src="images/10.jpeg">
        <img src="images/a.jpg" alt="" data-src="images/b1.jpg">
        <img src="images/a.jpg" alt="" data-src="images/b2.jpg">
        <img src="images/a.jpg" alt="" data-src="images/b3.jpg">
        <img src="images/a.jpg" alt="" data-src="images/b4.jpg">
        <img src="images/a.jpg" alt="" data-src="images/b5.jpg">
        <img src="images/a.jpg" alt="" data-src="images/b6.jpg">
    </div>

</body>

</html>
window.onload = function () {
    let img = document.querySelectorAll("img"); 

    lazyLoad(img);
    window.onscroll = function () {   //每移动滚动条时触发懒加载函数
          lazyLoad(img);
    }

    //懒加载
    function lazyLoad(img) {
        let s = document.body.scrollTop | document.documentElement.scrollTop;
        let h = window.innerHeight;
        for (let i =0; i < img.length; i++) {
            console.log(img[i].offsetTop);
            //当页面卷曲值与可视区域高度之和大于当前图片距页面顶部高度时,图片需要显示出来
            if (s + h >= img[i].offsetTop) {
                if (img[i].getAttribute("src") == "images/a.jpg") {
                    console.log(img[i].src);
                    img[i].src = img[i].getAttribute("data-src");
                }

            }
        }

    }

}

优化:函数节流,每次移动滚动条都触发lazyLoad函数影响浏览器性能,改为有时间函数setTimeout每隔一段时间触发lazyLoad函数以提高性能。

window.onload = function () {
    let img = document.querySelectorAll("img");
    let n=0;  //防止每一次都从第一张图片开始检测
    // console.log(img.length);
    var timer;

    lazyLoad(img);
    window.onscroll = function () {   //每移动滚动条时触发懒加载函数
        if (!timer) {
            timer=setTimeout(function(){
                lazyLoad(img);
                console.log(2);
                timer=undefined;
            },500);
        }
    }

    //懒加载
    function lazyLoad(img) {
        let s = document.body.scrollTop | document.documentElement.scrollTop;
        let h = window.innerHeight;
        for (let i = n; i < img.length; i++) {
            console.log(img[i].offsetTop);
            //当页面卷曲值与可视区域高度之和大于当前图片距页面顶部高度时,图片需要显示出来
            if (s + h >= img[i].offsetTop) {
                console.log("i:" + i + " s:" + s, "h:" + h);
                if (img[i].getAttribute("src") == "images/a.jpg") {
                    console.log(img[i].src);
                    img[i].src = img[i].getAttribute("data-src");
                    n=i+1;
                }

            }
        }

    }

}

 

posted @ 2021-06-11 21:06  straightforward  阅读(98)  评论(0)    收藏  举报