2020-11-10

 

 

​一.什么是懒加载?

懒就是拖延迟的意思,所以“懒加载”说白了就是延迟加载,比如我们加载一个页面,这个页面很长很长,长到我们的浏览器可视区域装不下,那么懒加载就是优先加载可视区域的内容,其他部分等进入了可视区域在加载。

 

二.为什么要懒加载?

懒加载是一种网页性能优化的方式,它能极大的提升用户体验。就比如说图片,图片一直是影响网页性能的主要元凶,现在一张图片超过几兆已经是很经常的事了。如果每次进入页面就请求所有的图片资源,那么可能等图片加载出来用户也早就走了。所以,我们需要懒加载,进入页面的时候,只请求可视区域的图片资源。

总结出来就两个点:

1.全部加载的话会影响用户体验

2.浪费用户的流量,有些用户并不像全部看完,全部加载会耗费大量流量

三.懒加载的实现原理?

由于网页中占用资源较多的一般是图片,所以我们一般实施懒加载都是对图片资源而言的,所以这里的实现原理主要是针对图片。

大家都知道,一张图片就是一个<img>标签,而图片的来源主要是src属性。浏览器是否发起请求就是根据是否有src属性决定的。

既然这样,那么我们就要对<img>标签的src属性下手了,在没进入可视区域的时候,我们先不给这个<img>标签赋src属性,这样岂不是浏览器就不会发送请求了。

总结:我们知道了从<img>标签下手,那么更重要的就是可视区域的判断了,这就是整篇文章的核心之处了。

 

四.实现步骤及Demo

1.先介绍几个和懒加载相关的API

// 可视区域的高度
document.documentElement.clientHeight 

 

//获取浏览器窗口顶部与文档顶部之间的距离,也就是滚动条滚动的距离
document.documentElement.scrollTop

2.HTML和css部分

<div class="index">
        <h3 style="align-content: center;font-size: 30px;text-align: center;">向下滚动查看加载效果</h3>
            <div class="index-img">
                <img src="img/loading.gif" data-src="https://dss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2534506313,1688529724&fm=26&gp=0.jpg" alt="" />
            </div>
            <div class="index-img">
                <img src="img/loading.gif" data-src="https://dss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=3381573685,1866477444&fm=26&gp=0.jpg" src="" alt="" />
            </div>
            <div class="index-img">
                <img src="img/loading.gif" data-src="https://dss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=3386247472,87720242&fm=26&gp=0.jpg" src="" alt="" />
            </div>
            <div class="index-img">
                <img src="img/loading.gif" data-src="https://dss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=1208538952,1443328523&fm=26&gp=0.jpg" src="" alt="" />
            </div>
            <div class="index-img">
                <img src="img/loading.gif" data-src="https://dss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=3386247472,87720242&fm=26&gp=0.jpg" src="" alt="" />
            </div>
            <div class="index-img">
                <img src="img/loading.gif" data-src="https://dss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=3381573685,1866477444&fm=26&gp=0.jpg" alt="" />
            </div>
            <div class="index-img">
                <img src="img/loading.gif" data-src="https://dss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2534506313,1688529724&fm=26&gp=0.jpg" alt="" />
            </div>
</div>

src路径下是我们需要配置的加载中的logo data-src存放的是我们需要真正请求的图片路径。

 

3.JS部分

function Limg(){
        var viewHeight = document.documentElement.clientHeight // 可视区域的高度
        var t = document.documentElement.scrollTop || document.body.scrollTop;//获取浏览器窗口顶部与文档顶部之间的距离,也就是滚动条滚动的距离
        var limg = document.querySelectorAll("img[data-src]")//获取所有带有data-src的属性值的img标签
        Array.prototype.forEach.call(limg, function(item, index) {//遍历这些标签
            var rect
            if(item.getAttribute("data-src") === "")
                return//如果属性值为空则直接renturn掉不在执行下面的操作
                        /*getBoundingClientRect()里面包含四个值分是
                        top元素上边距离页面上边的距离。
                        right元素右边距离页面右边的距离
                        left 元素左边距离页面左边的距离。
                        bottom元素下边距离页面下边的距离*/
            rect = item.getBoundingClientRect()
            // 图片一进入可视区,动态加载
            if(rect.bottom >= 0 && rect.top < viewHeight) {
                (function() {
                    setTimeout(function(){
                        var img = new Image()
                        img.src = item.getAttribute("data-src")
                        item.src = img.src
                        //给图片添加过渡效果,让图片显示
                        var j = 0
                        setInterval(function() {
                            j += 0.2
                            if(j <= 1) {
                                item.style.opacity = j
                                return
                            }
                        }, 100)
                    },1000)
                })()
            }
        })
}

四.gitHub地址

https://github.com/lirongyues/js/tree/master/%E5%8E%9F%E7%94%9FJS/imgLazyLoad/imgLazyLoad

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值