懒加载常见的两个方式

该文介绍了一种利用JavaScript实现图片懒加载的方法,通过监听scroll事件,判断图片是否进入可视区域,使用data-src属性暂存真实图片源,当图片进入可视区域时,将data-src赋值给src属性加载图片,并通过防抖处理优化scroll事件的性能。
摘要由CSDN通过智能技术生成

1.用scroll事件,每次滚动的时候判断图片是否出现在可视区域了

2.用foreach来遍历每张图片到顶部的距离,如果图片距离视窗顶部的距离小于窗口显示区的高度

那么久要让图片开始加载

3.在html里面自定义属性(data-*)在图片上面来进行表示,浏览器碰到这个属性的时候是不会像默认属性那样进行属性处理的,因此我们可以把src属性改为data-src,这样就相当于不知道要在哪里下载这些图片了

4.当图片距离视窗顶部的距离小于窗口显示区的高度,把自定义属性赋值给原来的属性

5.最后对 scroll事件做防抖处理(就是定时器在固定时间内只触发一次),因为滚动事件每滚动触发的次数会很频繁,随便截了一个例子,具体代码结合具体实现

下面是一个例子(不应用于具体业务,只是单纯的一个例子演示)

 

<body>

  <div class="container">

    <div class="img">

      <!-- 注意我们并没有为它引入真实的src -->

      <img class="pic" alt="加载中"

        data-src="https://tse1-mm.cn.bing.net/th/id/OIP.8OrEFn_rKe82kqAWFjTuMwHaEo?pid=Api&rs=1" />

     

    </div>

    <div class="img">

      <img class="pic" alt="加载中"

        data-src="https://ssl.tzoo-img.com/images/tzoo.94911.0.910013.seoul-nami.jpg?width=1080" />

     

    </div>

    <div class="img">

      <img class="pic" alt="加载中"

        data-src="https://tse4-mm.cn.bing.net/th/id/OIP.ZitgAuABnwkrGn4lid2ZmQHaEK?pid=Api&rs=1" />

    </div>

    <div class="img">

      <img class="pic" alt="加载中" data-src="http://pic34.photophoto.cn/20150315/0034034862056002_b.jpg" />

    </div>

    <div class="img">

      <img class="pic" alt="加载中"

        data-src="http://img.mp.sohu.com/upload/20170724/32d4409f34194b029ed287abf1c99b70_th.png" />

     

    </div>

    <div class="img">

      <img class="pic" alt="加载中" data-src="https://pic6.wed114.cn/20180829/2018082910075991913520.jpg" />

    </div>

    <div class="img">

      <img class="pic" alt="加载中"

        data-src="https://tse4-mm.cn.bing.net/th/id/OIP.PZdPKj3sXEX2jLrepx3MUwHaEo?pid=Api&rs=1" />

     

    </div>

    <div class="img">

      <img class="pic" alt="加载中" data-src="https://pic6.wed114.cn/20180829/2018082910075831439349.jpg" />

    </div>

    <div class="img">

      <img class="pic" alt="加载中" data-src="https://pic6.wed114.cn/20180829/2018082910075468043336.jpg" />

    </div>

    <div class="img">

      <img class="pic" alt="加载中"

        data-src="https://tse2-mm.cn.bing.net/th/id/OIP.CRYz5Bv4vylsMh83G4CsLgHaFj?pid=Api&rs=1" />

    </div>

  </div>


 

  <script>

    // 获取所有的图片标签

    const imgs = document.getElementsByTagName("img");

    //获取所有div盒子

    // .........................................

    // 获取可视区域的高度

    const viewHeight =

      window.innerHeight || document.documentElement.clientHeight;

    // num用于统计当前显示到了哪一张图片,避免每次都从第一张图片开始检查是否露出

    let num = 0;

    function lazyload() {

      console.log("滚动...");

      for (let i = num; i < imgs.length; i++) {

        // 用可视区域高度减去元素顶部距离可视区域顶部的高度

        let distance = viewHeight - imgs[i].getBoundingClientRect().top;

        // 如果可视区域高度大于等于元素顶部距离可视区域顶部的高度,说明元素露出

        if (distance >= 0) {

          // 给元素写入真实的src,展示图片

          imgs[i].src = imgs[i].getAttribute("data-src");

          // 前i张图片已经加载完毕,下次从第i+1张开始检查是否露出

          num = i + 1;

        }

      }

    }

    // 防抖函数

    function debounce(fn, delay) {

      var timer = null;

      delay = delay || 500;

      return function () {

        var args = Array.prototype.slice.call(arguments);

        if (timer) clearTimeout(timer);

        timer = setTimeout(function () {

          fn.apply(this, args);

        }, delay);

      };

    }

    // 是的页面初始化是加载首屏图片

    window.onload = lazyload;

    // 监听Scroll事件,为了防止频繁调用,使用防抖函数优化一下

    window.addEventListener("scroll", debounce(lazyload, 600), false);

  </script>

</body>

效果图如下:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ES模块化是一种在JavaScript中组织和管理代码的方式。模块懒加载是指在需要时才加载模块,而不是在应用初始化时就加载所有模块。这种方式可以提高应用的性能和加载速度。 实现ES模块的懒加载有几种方式,下面列举了两种常见方式: 1. 动态导入(Dynamic Import): 动态导入是ES6提供的特性,通过使用`import()`函数可以实现模块的动态加载。这个函数返回一个Promise,并且只有在调用时才会加载指定的模块。 示例代码如下: ```javascript import('./module.js') .then(module => { // 使用加载的模块 module.someFunction(); }) .catch(error => { // 处理错误 }); ``` 在需要使用某个模块时,可以调用`import()`函数来动态加载该模块,并在`then`回调中使用加载的模块。这样可以延迟模块的加载,并且只在需要时才进行加载。 2. 懒加载库或工具: 除了使用ES6的动态导入,还可以使用一些第三方库或工具来实现模块的懒加载。这些库或工具通常提供了更多的功能和灵活性,例如按需加载、预加载等。 一些常用的懒加载库包括: - webpack的`import()`函数和`React.lazy()`函数结合使用,可以实现React组件的懒加载。 - Vue.js的`@babel/plugin-syntax-dynamic-import`插件可以实现Vue组件的懒加载。 - require.js是一个通用的模块加载器,可以实现模块的按需加载。 需要注意的是,模块懒加载虽然可以提高应用性能,但也需要权衡加载时间和用户体验。过多的懒加载可能会导致页面响应变慢或出现延迟,因此在实际使用中需要根据具体情况进行优化和选择适当的懒加载策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值