原生JS实现图片懒加载

原生JS实现图片懒加载

实现原理

预先将图片的url保存在ing 的 data-src属性之中,通过js判断图片是否在浏览器的窗口之中,如果在便将data-src的值赋给src.

HTML 和CSS部分

这两部分比较简单,直接上代码:

<!DOCTYPE html>
<html>
    <head>
        <title>图片懒加载</title>
        <meta charset="utf-8">
        <style>
            ul{
                margin:0;
                padding: 0;
                list-style: none;
            }
            ul li{
                width: 500px;
                height: 309px;
            }
            ul li img{
                width: 100%;
                height: 100%;
            }
        </style>
    </head>
    <body>
        <ul id="pictures">
            <li>
                <img src="image/1.jpg" alt="" data-src="image/1.jpg">
            </li>
            <li>
                <img src="" alt="" data-src="image/2.jpg">
            </li>
            <li>
                <img src="" alt="" data-src="image/3.jpg">
            </li>
            <li>
                <img src="" alt="" data-src="image/4.jpg">
            </li>
            <li>
                <img src="" alt="" data-src="image/5.jpg">
            </li>
        </ul>
    </body>
</html>

JS

如何判别图片是否在可视区是关键,由于浏览器窗口大小有限,一般无法显示整个HTML页面,所以页面大致被分为三个部分:处于浏览器窗口上面的部分(即被遮挡的部分),处于可视窗口内(即我们能看到的部分),处于浏览器窗口下面的部分(还未出现的部分)。
先介绍几个函数:
1、offsetTop:返回本元素上边框与父元素边框之间的距离,这里的父元素指的是非static定位元素(static定位即默认定位)。如果父元素(这里其实说祖先元素更合适),均为static定位,那么则返回和body的距离。
2、documentElemet.scrollTop:返回页面的顶部scroll的长度,即页面上部被遮挡的长度。
3、window.innerHeight:返回浏览器窗口的长度。
由于CSS部分均未设置定位,此时img.offsetTop即返回到body的距离,即到HTML页面顶部的距离。
因此只要img.offsetTop>scrollTop(即大于页面上部被遮挡的部分的长度),并且img.offsetTop<scrollTop+window.innerHeight(即图片还未处于页面下部被隐藏的部分),那么图片便全部或者部分出现在浏览器窗口之中。

 const pictures=document.getElementById("pictures");
            var len=pictures.children.length;
            var timer=null;

            window.addEventListener('scroll',function()
            {
                if(timer)
                {
                    clearInterval(timer);
                }
                timer=setInterval(()=>{
                        lazyloading();
                    },300)
            });
            function lazyloading()
            {
               for(var i=0;i<len;i++)
               {
                   var scrollTop=document.documentElement.scrollTop;
                   var height=window.innerHeight;
                   var offsetTop=pictures.children[i].offsetTop;
                   if(offsetTop>=scrollTop&&offsetTop<scrollTop+height)
                   {
                        var img=pictures.children[i].firstElementChild;
                        if(img.getAttribute("src")!==img.getAttribute("data-src"))
                        {
                            img.setAttribute("src",img.getAttribute("data-src"));
                        } 
                   }
               }
          lazyloading()     

上面的代码在window监听器中设置了定时器timer来延缓图片加载的时间,既可以更清楚的展现懒加载的效果,还能减少函数调用的频率。
本人小白一个,也是参考了这位大佬的博客!大家多多支持原作者!点击此处前往

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值