• 【Web技术】442- 关于图片懒加载的几种方案


    懒加载,顾名思义,在当前网页,滑动页面到能看到图片的时候再加载图片

    故问题拆分成两个:

    1. 如何判断图片出现在了当前视口 (即如何判断我们能够看到图片)

    2. 如何控制图片的加载

    本篇文章原文地址: 如何实现图片懒加载,另存到 我的每日一题

    方案一

    如何判断图片出现在了当前视口

    clientTopoffsetTopclientHeight 以及 scrollTop 各种关于图片的高度作比对

    这些高度都代表了什么意思?

    这我以前有可能是知道的,那时候我比较单纯,喜欢死磕。我现在想通了,背不过的东西就不要背了

    所以它有一个问题:复杂琐碎不好理解!

    仅仅知道它静态的高度还不够,我们还需要知道动态的

    如何动态?监听 window.scroll 事件

    如何控制图片的加载

    <img src="shanyue.jpg">
    

    首先设置一个临时属性 src,控制加载时使用 src 代替 src

    方案二

    改进一下

    如何判断图片出现在了当前视口

    引入一个新的 API, Element.getBoundingClientRect() 方法返回元素的大小及其相对于视口的位置。

    那如何判断图片出现在了当前视口呢,根据示例图示意,代码如下,这个就比较好理解了,就可以很容易地背会(就可以愉快地去面试了)。

    // clientHeight 代表当前视口的高度
    img.getBoundingClientRect().top < document.documentElement.clientHeight
    

    监听 window.scroll 事件也优化一下

    加个节流器,提高性能。工作中一般使用 lodash.throttle 就可以了,万能的 lodash 啊!

    _.throttle(func, [wait=0], [options={}])
    

    参考 什么是防抖和节流,他们的应用场景有哪些

    方案三

    再改进一下

    如何判断图片出现在了当前视口

    方案二使用的方法是: window.scroll 监听 Element.getBoundingClientRect() 并使用 _.throttle 节流

    一系列组合动作太复杂了,于是浏览器出了一个三合一事件: InterpObserver API,一个能够监听元素是否到了当前视口的事件,一步到位!

    事件回调的参数是 InterpObserverEntry 的集合,代表关于是否在可见视口的一系列值

    其中,entry.isIntersecting 代表目标元素可见

    const observer = new InterpObserver((changes) => {
      // changes: 目标元素集合
      changes.forEach((change) => {
        // interpRatio
        if (change.isIntersecting) {
          const img = change.target
          img.src = img.dataset.src
          observer.unobserve(img)
        }
      })
    })
    
    observer.observe(img)
    

    当然,InterpObserver 除了给图片做懒加载外,还可以对单页应用资源做预加载。

    如在 next.js v9 中,会对视口内的资源做预加载,可以参考 next 9 production optimizations

    <Link href="/about">
      <a>关于山月</a>
    </Link>
    

    方案四

    浏览器觉得懒加载这事可以交给自己做,你们开发者加个属性就好了。实在是...!

    <img src="shanyue.jpg" loading="lazy">
    

    不过目前浏览器兼容性不太好,关于 loading 属性的文章也可以查看 Native image lazy-loading for the web!

    总结

    总结一下

    • window.scroll 监听各种 topheight 并使用 _.throttle 节流,但是不好理解各种 tophegith

    • window.scroll 监听 getBoundingClientRect 并使用 _.throttle 节流,没有一个统一事件,相对复杂

    • InterpObserver,浏览器推出了一个事件,方便简单

    • img.loading=lazy,浏览器直接给你解决,开发者直接标注属性

    关注我

    点击阅读原文,方便访问本篇文章页面链接

    原创系列推荐

    1. JavaScript 重温系列(22篇全)

    2. ECMAScript 重温系列(10篇全)

    3. JavaScript设计模式 重温系列(9篇全)

    4. 正则 / 框架 / 算法等 重温系列(16篇全)

    5. Webpack4 入门(上)|| Webpack4 入门(下)

    6. MobX 入门(上) ||  MobX 入门(下)

    7. 59篇原创系列汇总

    回复“加群”与大佬们一起交流学习~

    点这,与大家一起分享本文吧~

    个人博客:http://www.pingan8787.com 微信公众号【前端自习课】和千万网友一起,每日清晨,享受一篇前端优秀文章。 目前已连续推送文章 600+ 天,愿每个人的初心都能一直坚持下去!
  • 相关阅读:
    LED点阵书写显示
    cpld fpga 区别
    SublimeText 自带格式化代码功能
    iText C# 合并PDF文件流,以及A5变A4时内容默认放在最底下的问题的解决方法;ASP.NET 实现Base64文件流下载PDF
    Adobe Acrobat 9 Pro序列号
    c#比较两个数组的差异
    iNotify.js通知JS 实现浏览器的 title 闪烁、滚动、声音提示、chrome、Firefox、Safari等系统通知。
    配置IISExpress允许外部访问
    https://sweetalert2.github.io/
    c# 利用MailKit.IMap 收取163邮件
  • 原文地址:https://www.cnblogs.com/pingan8787/p/13069571.html
Copyright © 2020-2023  润新知