实现图片懒加载

图片懒加载就是当图片非常多,一屏无法完全显示的时候,我们就会把暂时看不到的图片,延时等滚轴滚动到时再进行加载,也算是一种性能优化,图片分开下载就是大幅度提高了首次加载页面的速度,例如就像一些电商网站的商品显示一样,下面我们就来实现一下图片的懒加载。

1.不使用懒加载

我们首先写出基本的html页面,代码如下如图所示:

<!DOCTYPE html>
    <head>
        <style>
            img{
                width: 40%;
                height: 360px;
            }
        </style>
    </head>
    <body>
        <div>他年若遂凌云志,敢笑黄巢不丈夫</div>
        <div>他年若遂凌云志,敢笑黄巢不丈夫</div>
        <div>他年若遂凌云志,敢笑黄巢不丈夫</div>
        <div>他年若遂凌云志,敢笑黄巢不丈夫</div>
        <div>他年若遂凌云志,敢笑黄巢不丈夫</div>
        <div>他年若遂凌云志,敢笑黄巢不丈夫</div>
        <div>他年若遂凌云志,敢笑黄巢不丈夫</div>


       <div><img src="./hkk.jpg" /></div>
       <div><img src="./lufei.jpg"/></div>
       <div><img src="./timg.jpg"/></div>
        <script>
           
        </script>
    </body>

 显示如下所示:

                                     

 

 2.监听图片高度实现懒加载

实现思路就是当图片距离浏览器顶部的高度小于浏览器视窗的高度时我们就加载出图片。

那我们首先就不应该把图片显示出来,解决方案就是使用data-*属性,这是标签的自定义属性,就保证了开始不会执行,方便我们替换src属性来显示图片,下面我们来写js代码:

const imags = document.querySelectorAll('img');

            window.addEventListener('scroll', () => {
                imags.forEach((img) => {
                const imgTop = img.getBoundingClientRect().top; // 获取每张图片到浏览器顶部的距离
                    if (imgTop < window.innerHeight) {
                        const imgSrc = img.getAttribute('data-src'); // 拿到自定义属性的值
                        img.setAttribute('src', imgSrc);
                        console.log('加载');
                    }
                })
            })

这样我们就实现了懒加载,但是会有一个问题,就是这种监听的方法会一直重复触发加载的动作,即使资源已经加载完毕了,如下图,所以我们选择下面的方式,也是推荐使用的方法。 

3.IntersectionObserver

这是浏览器提供的构造函数,用于观察元素是否对于屏幕的可视区域可见,使用observe方法进行监听,unobserve方法取消监听,这样就是避免重复触发的问题:

const images = document.querySelectorAll('img');

            const callback = (enteries) => {
                enteries.forEach((e) => {
                    if (e.isIntersecting) { // 内置参数(boolean)是否能在浏览器中看到
                        const img = e.target;
                        const imgSrc = img.getAttribute('data-src');
                        img.setAttribute('src', imgSrc);
                        observe.unobserve(img);
                        console.log('加载');   
                    }
                })
            }

            const observe = new IntersectionObserver(callback);
            images.forEach((image) => {
                observe.observe(image);
            })

 

总结

        第二种懒加载的方式推荐使用,不会造成资源的浪费,给浏览器的压力没那么大,移动端也同样适用。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值