JS 原生图片懒加载

先拿一张比较小的图片放到img标签中的src中,把真正的图片地址放到data-src属性中。
主要原理是,判断图片距离页面顶部的距离offsetTop,是否小于 页面可见高度document.documentElement.clientHeight+滚动条垂直滚动像素window.scrollY

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .container{
            width: 500px;
            margin: 0 auto;
        }
        img{
            display: block;
            width: 100%;
            /* height: 200px; */
        }
    </style>
</head>
<body>
    <div class="container">
        <img data-src="./lazyLoadPic/ars1.jpg" src="./lazyLoadPic/default.png" alt="">
        <img data-src="./lazyLoadPic/ars2.jpg" src="./lazyLoadPic/default.png" alt="">
        <img data-src="./lazyLoadPic/ars3.jpg" src="./lazyLoadPic/default.png" alt="">
        <img data-src="./lazyLoadPic/ars4.jpg" src="./lazyLoadPic/default.png" alt="">
        <img data-src="./lazyLoadPic/ars5.jpg" src="./lazyLoadPic/default.png" alt="">
        <img data-src="./lazyLoadPic/ars6.jpg" src="./lazyLoadPic/default.png" alt="">
        <img data-src="./lazyLoadPic/ars7.jpg" src="./lazyLoadPic/default.png" alt="">
    </div>
    <script>
    	//如果不加 window.onload 则在第一次加载页面时发现所有图片已经加载完毕了,并没有实现懒加载效果
        //这是一个坑,不好百度,原因就是没有 window.onload 的情况下所有img都没有高度,所以不能实现懒加载
        window.onload = function(){
            var num = document.getElementsByTagName('img').length
            var img = document.getElementsByTagName('img')
            var n = 0 //用来存储图片加载到的位置,避免每次都从第一张图片开始遍历
            lazyLoad() //页面载入完毕加载可视区域内的图片

            //函数节流模式,如果存在高频率滚动,会给浏览器造成一定的负担,所以设定每隔500ms才能渲染一次
            var canRun = true
            window.onscroll = function(){
                if (!canRun){
                    return
                }
                canRun = false
                setTimeout(function(){
                    lazyLoad()
                    canRun = true
                },500)
            }

            function lazyLoad(){
                var seeHeight = document.documentElement.clientHeight //可见区域高度
                var scrollTop = window.scrollY //滚动条距离顶部高度
                for (var i = n; i < num; i++){
                    //如果图片与页面顶部的距离小于*页面可见高度*与*滚动条距离顶部的高度*之和
                    if (img[i].offsetTop < seeHeight + scrollTop){
                        if (img[i].getAttribute("src") == "./lazyLoadPic/default.png"){
                            img[i].src = img[i].getAttribute("data-src")
                        }
                        n = i + 1
                    }
                }
            }
        }
    </script>
</body>
</html>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值