JavaScript 实现图片懒加载的原理与代码示例

作者:霁月

时间:2026-10-24

浏览:107

本文详解JavaScript图片懒加载技术,通过延时加载非可视区域图片提升页面性能。涵盖CSS占位、HTML双路径配置及JS滚动监听逻辑,使用for-of遍历节点并替换data-original属性,附完整代码示例。

文章目录

懒加载

即延迟加载策略,仅在用户浏览至可视区域时触发后续资源的加载

核心概念为延时加载,即对象在真正需要使用时才执行加载操作

实现原理:

初始阶段加载占位图片,待加载完成后替换为实际所需的图片

步骤实现:

1.加载load图片 2.判断哪些图片要加载 3.隐形加载图片 4.替换真图片

CSS样式:


    <style>
        img {
            width: 400px;
            height: 300px;
            display: block;
        }
        .row{
            width: 300px;
            height: 400px;
        }
    </style>

HTML部分:


  <img class="rwo" src="image/load.gif" alt="" data-original="image/图片 (1).jpeg">
        <img class="rwo" src="image/load.gif" alt="" data-original="image/图片 (3).jpeg"">
        <img class="rwo" src="image/load.gif" alt="" data-original="image/图片 (9).jpeg"">
        <img class="rwo" src="image/load.gif" alt="" data-original="image/图片 (10).jpg"">
        <img class="rwo" src="image/load.gif" alt="" data-original="image/图片 (13).jpeg"">
        <img class="rwo" src="image/load.gif" alt="" data-original="image/图片 (92).jpeg"">
        <img  src="image/load.gif" alt="" data-original="image/图片 (1).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (2).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (19).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (23).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (33).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (37).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (38).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (39).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (40).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (41).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (42).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (43).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (44).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (45).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (46).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (47).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (48).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (49).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (50).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (51).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (52).jpg">
        <img  src="image/load.gif"alt="" data-original=" image/图片 (53).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (54).jpg">

采用双路径机制,利用假图片进行初始占位,随后通过真图片路径进行替换,图中左侧为假图片,右侧为真图片

懒加载

script部分 :


    <script>
        let view = document.documentElement.clientHeight;//获取浏览器窗口可视区的高度
        function fn1(){
            setTimeout(function lazyload() {    //添加一个定时器一秒钟后开始执行
            let imgs = document.querySelectorAll('img');    // 获取所有img标签
            // console.log(imgs);
            for (let item of imgs) {                // 使用for-of遍历所有图片
                // 显示图片出现在浏览器的位置
                let rect = item.getBoundingClientRect();    // 找到每一个图片在可视区上的位置
                console.log(rect);
                if (rect.bottom >= 0 && rect.top < view) {    //给个if语句如果图片的底部大于0并且小于这个浏览器的可视区域 ,就执行以下操作
                    item.src = item.getAttribute('data-original')    // 获取data-original的路径传给img
                }
            }
        },1000)
        }
        fn1();
        document.addEventListener('scroll',fn1)    //当滚动事件发生时就开始执行fn1函数里的任务
    </script>

选用for-of而非for-in或传统for循环,具体原因需参考ES6中for-of的遍历机制

效果如下:

懒加载

完整代码:


<!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>懒加载</title>
    <style>
        img {
            width: 400px;
            height: 300px;
            display: block;
        }
        .row{
            width: 300px;
            height: 400px;
        }
    </style>
</head>
<body>
        <img class="rwo" src="image/load.gif" alt="" data-original="image/图片 (1).jpeg">
        <img class="rwo" src="image/load.gif" alt="" data-original="image/图片 (3).jpeg"">
        <img class="rwo" src="image/load.gif" alt="" data-original="image/图片 (9).jpeg"">
        <img class="rwo" src="image/load.gif" alt="" data-original="image/图片 (10).jpg"">
        <img class="rwo" src="image/load.gif" alt="" data-original="image/图片 (13).jpeg"">
        <img class="rwo" src="image/load.gif" alt="" data-original="image/图片 (92).jpeg"">
        <img  src="image/load.gif" alt="" data-original="image/图片 (1).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (2).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (19).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (23).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (33).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (37).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (38).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (39).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (40).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (41).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (42).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (43).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (44).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (45).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (46).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (47).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (48).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (49).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (50).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (51).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (52).jpg">
        <img  src="image/load.gif"alt="" data-original=" image/图片 (53).jpg">
        <img  src="image/load.gif" alt="" data-original="image/图片 (54).jpg">
    <script>
        let view = document.documentElement.clientHeight;
        function fn1(){
            setTimeout(function lazyload() {
            let imgs = document.querySelectorAll('img');
            // console.log(imgs);
            for (let item of imgs) {
                // 显示图片出现在浏览器的位置
                let rect = item.getBoundingClientRect();
                console.log(rect);
                if (rect.bottom >= 0 && rect.top < view) {
                    item.src = item.getAttribute('data-original')
                }
            }
        },1000)
        }
        fn1();
        document.addEventListener('scroll',fn1)
    </script>
</body>
 
</html>

提供加载图片资源,用户也可自行获取,若需其他图片资源可联系整理

懒加载

总结

文章结束,旨在提供技术帮助,欢迎关注本站更多内容

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章