瀑布流,图片懒加载实现

首先,分析情况,当图片顶部出现在浏览器视口时,图片要进行加载,

先定义图片标签  ,这里的第一张图片正常加载,后三张图片设置了自定义属性data-orgin,自定义属性中存放了图片路劲,src暂时为空

<!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>
</head>
<style>
    .aaa {
        display: flex;
        flex-direction: column;
        margin-top: 1000px;
    }

    .img {
        width: 300px;
        height: 300px;
    }
</style>

<body>
    <div class="aaa">
        <img src="https://ts4.cn.mm.bing.net/th?id=ORMS.976404be75498e926c10ad1ffa477d3c&pid=Wdp&w=300&h=156&qlt=90&c=1&rs=1&dpr=1&p=0"
            alt="">
    </div>
    <div class="aaa">
        <img src=""

            data-orgin="https://ts4.cn.mm.bing.net/th?id=ORMS.976404be75498e926c10ad1ffa477d3c&pid=Wdp&w=300&h=156&qlt=90&c=1&rs=1&dpr=1&p=0"

            class="img" alt="加载">
    </div>
    <div class="aaa">
        <img src=""

            data-orgin="https://ts4.cn.mm.bing.net/th?id=ORMS.976404be75498e926c10ad1ffa477d3c&pid=Wdp&w=300&h=156&qlt=90&c=1&rs=1&dpr=1&p=0"

            class="img" alt="加载">
    </div>
    <div class="aaa">

        <img data-orgin="https://ts4.cn.mm.bing.net/th?id=ORMS.976404be75498e926c10ad1ffa477d3c&pid=Wdp&w=300&h=156&qlt=90&c=1&rs=1&dpr=1&p=0"

            src="" class="img" alt="加载">

    </div>
</body>

获取图片数组,并定义一个num为0 后面使用

    let imgs = document.querySelectorAll('.img')

    let num = 0

封装一个方法  

利用for循环 将每个图片的距离获取到

获取浏览器可视区域高度,并用浏览器可视高度   减去  图片顶部距离视口高度   如果值为true时,就说明图片已经出现了    view - imgs[i].getBoundingClientRect().top  

图片出现后将自定义属性的时添加到src中

    function lazload() {

    //  view是浏览器可视区域的高度
        const view = window.innerHeight || document.documentElement.clientHeight
        
        for (let i = index; i < imgs.length; i++) {
            // 这里用可视区域高度减去图片顶部距离可视区域高度,说明图片已经出现在了视口范围内
            const dis = view - imgs[i].getBoundingClientRect().top
            console.log('dis', dis);
            if (dis >= 0) {
                // 给图片赋值真实的src,展示图片
                imgs[i].src = imgs[i].dataset.orgin
                // 前一张图片已经加载完毕,下次从第i+1张开始检查是否需要显示
                num = i + 1
            }
        }
    }

然后监听window的Scroll事件   当滚动条滚动时就触发lazload方法

    window.onscroll = function () {
        lazload()
    }

这样就能实现图片懒加载了,为了不让监听事件触发的不那么频繁,可以再封装一个节流或者防抖的方法,现在就不做演示了

但是这里有个缺点,那就是window的监听事件会一直执行,就是图片加载完还是会不停的执行lazload方法,目前还没想到用什么方法阻止,等下次想到再更新一下

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值