JavaScript实现首屏与多屏图片延迟加载技术详解

作者:白帽猫

时间:2026-10-22

浏览:242

本文介绍利用JavaScript实现图片延迟加载的方法,旨在提升页面打开速度。通过首屏预加载默认占位图、非首屏图片随滚动加载以及数据异步绑定等技术,有效优化用户体验。文中提供了首屏和多屏单张图片延迟加载的具体代码实现,供开发者参考。

文章目录

延迟加载原理与优势

本文分享了使用JavaScript实现延迟加载的核心思路,以及针对首屏图片延迟加载的具体代码实现,供读者参考。

该技术的主要作用是确保页面能够快速打开。如果首页在3秒内无法加载完成,通常被视为体验极差的“死亡页面”,因此优化加载速度至关重要。

其实现原理主要包含以下两个方面:

首先,针对首屏可见区域内的图片,先为对应区域加载一张体积极小的默认占位图(通常控制在5KB以内)。待首屏内容全部加载完毕,或经过设定的延迟时间后,再开始加载真实的图片资源。

其次,对于非首屏(其他屏)中的图片,同样先使用默认占位图占据空间。当用户滚动页面,滚动条到达对应图片区域时,才触发真实图片的加载请求。

此外,该思路可扩展至数据的异步加载场景。例如,初始仅加载并绑定前两屏的数据,后续数据暂不处理;当页面滚动至相应区域时,再重新发起数据请求并渲染绑定。

具体的加载效果可参考下图展示。

延迟加载原理与优势

首屏图片延迟加载实现

以下是首屏图片延迟加载的具体代码实现。


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    *{
      padding:0;
      margin:0;
      font-size:14px;
    }
    #banner{
      margin:10px auto;
      width:300px;
      height:150px;
      border:1px solid green;
      background:url('img/default.gif') no-repeat center center;/*给当前的区域加一个默认图占位,告诉用户此处的图片正在加载中*/
    }
    #banner img{
      display:none;/*在开始的时候IMG的SRC属性没有地址,这样的话在IE浏览器中会显示一张碎图,不美观,所以我们让其默认是隐藏的,当真实的图片加载完成后在显示*/
      width:100%;
      height:100%;
    }
  </style>
</head>
<body>
  <div id='banner'>
    <!--trueImg是当前标签的自定义属性,存储的是真实图片的地址-->
    <img src="" alt="" trueImg="img/jd.jpg">
  </div>
  <script>
    var banner = document.getElementById('banner'),imgFir = banner.getElementsByTagName('img')[0]
    window.setTimeout(function(){
      // imgFir.src = imgFir.getAttribute('trueImg');
      // imgFir.style.display = "block"
      //以上处理还是不完整的:如果我们获取的真实图片的地址是错误的,赋值给IMG的SRC属性的时候,不仅控制台会报错,而且页面中还会出现碎图
      //获取图片的地址,验证地址的有效性,是有效的才赋值,不是有效的是不进行处理的
      // var oImg = document.createElement('img')
      var oImg = new Image;//创建一个临时的IMG标签
      oImg.src = imgFir.getAttribute('trueImg');
      oImg.onload = function(){//当图片能够正常加载
        imgFir.src = this.src;
        imgFir.style.display = "block";
        oImg = null
        console.log('加载完成')
      }
      console.log('正在加载中...')
    },500)
  </script>
</body>
</html>

多屏图片延迟加载实现

接下来介绍多屏单张图片的延迟加载方案。

延迟加载原理与优势

该方案的具体代码实现如下所示。


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    *{
      padding:0;
      margin:0;
      font-size:14px;
    }
    #banner{
      margin:10px auto;
      width:300px;
      height:150px;
      border:1px solid green;
      background:url('img/default.gif') no-repeat center center;/*给当前的区域加一个默认图占位,告诉用户此处的图片正在加载中*/
    }
    #banner img{
      display:none;/*在开始的时候IMG的SRC属性没有地址,这样的话在IE浏览器中会显示一张碎图,不美观,所以我们让其默认是隐藏的,当真实的图片加载完成后在显示*/
      width:100%;
      height:100%;
    }
  </style>
</head>
<body>
  <div id='banner'>
    <!--trueImg是当前标签的自定义属性,存储的是真实图片的地址-->
    <img src="" alt="" trueImg="img/jd.jpg">
  </div>
  <script>
    var banner = document.getElementById('banner'),imgFir = banner.getElementsByTagName('img')[0]

    window.onscroll = function(){
      if(banner.isLoad){
        return;
      }
      var A = banner.offsetHeight+utils.offset(banner).top;
      var B = utils.win("clientHeight") + utils.win("scrollTop");
      if(A<B){
        //当条件成立,我们加载真实的图片,第一次加载完成后,我们在让页面滚动的过程中A<B一直成立,又重新执行下面的操作,导致了重复给一个容器中的图片进行加载
        var oImg = new Image;
        oImg.src = imgFir.getAttribute('trueImg');
        oImg.onload = function(){
          imgFir.src = this.src;
          imgFir.style.display = 'block';
          oImg = null;
          
        }
        banner.isLoad = true;//设置一个自定义属性告诉浏览器我已经把图片加载完了(不管是否正常的加载,只要处理过一次以后都不需要处理了)

      }
    }
  </script>
</body>
</html>

以上即为本文的全部内容,希望这些内容能对读者的学习有所帮助,也欢迎大家继续支持本站。

实用工具推荐

电子包浆

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

使用 ›
图片压缩

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

使用 ›
相关文章