背景

图片懒加载是针对图片加载时机的一种优化,在一些图片量比较大的网站(比如电商网站首页,或者团购网站、小游戏首页等),如果我们尝试在用户打开页面的时候,就把所有的图片资源加载完毕,那么很可能会造成白屏、卡顿等现象,因为图片真的太多了,一口气处理这么多任务,浏览器做不到啊!

懒加载是为了让浏览器只加载可视区内的图片,可视区外的大量图片不进行加载,当页面滚动到后面去的时候再进行加载。这样做有很多好处可以增加首屏加载的速度,毕竟,用户点开页面的瞬间,呈现给他的只是首屏,我们只要把首屏的资源图片加载处理就可以了,至于下面的图片,当用户下滑当当前位置的时候,在加载出来也是没问题的,对于性能压力也小了,用户体验也没有变差。

解答

图片懒加载的原理就是需要知道图片是否在可视区内了,当图片到达可视区内就需要去请求对应的图片加载出来

页面中的img标签一般如下写

real_image.jpg

其中src首先赋值一个占位的图片,一般是一个很小的图片,进行占位,data-src是实际需要展示的图片,原理就是当图片在可视区内的时候将data-src的图片选渲染出来即可。

1、原生实现

Chrome 76 将原生支持图片的惰性加载,支持对img和iframe进行延迟加载,只需要将loading属性设置为lazy即可。

...

原生实现的好处是,不需要任何脚本,纯原生HTML即可,简单方便,支持多种属性lazy:对资源进行延迟加载。

eager:立即加载资源。

auto:浏览器自行判断决定是否延迟加载资源。

原生的坏处就是在于浏览器的支持率不是很高,将来肯定是非常好的。

我们知道由于浏览器的支持率不是很好,上面的方案固然很好,但是使用的并不是很多,所以下面介绍几种更加常见的懒加载方案。

2、Element.getBoundingClientRect()

getBoundingClientRect返回值是一个 DOMRect 对象,这个对象是由该元素的 getClientRects() 方法返回的一组矩形的集合, 即:是与该元素相关的CSS 边框集合 。DOMRect 对象包含了一组用于描述边框的只读属性——left、top、right和bottom,单位为像素。除了 width 和 height 外的属性都是相对于视口的左上角位置而言的。

有了这个API后我们很同意获取图片的top值,当top值小于可视区的高度的时候就可以任何图片进入了可视区,直接加载图片即可

element.getBoundingClientRect().top < document.documentElement.clientHeight

由于需要在滚动的时候去监听图片的位置,所以我们需要使用到window.onscroll事件,我们在事件内部处理相关的逻辑即可。

3、通过相对计算获取元素位置通过document.documentElement.clientHeight获取屏幕可视窗口高度。

通过element.offsetTop获取元素相对于文档顶部的距离。

通过document.documentElement.scrollTop获取浏览器窗口顶部与文档顶部之间的距离,也就是滚动条滚动的距离。 然后判断2-3<1是否成立,如果成立,元素就在可视区域内。

element.offsetTop - document.documentElement.scrollTop < document.documentElement.clientHeight

此方法也需要在滚动的时候去监听图片的位置,所以我们需要使用到window.onscroll事件,我们在事件内部处理相关的逻辑即可。

4、使用IntersectionObserver

const observer = new IntersectionObserver(callback, observerConfig)

const imgList = document.querySelectorAll(".lazyload");

const observer = new IntersectionObserver(entries => {

entries.forEach(item => {

if (item.isIntersecting) {

item.target.src = item.target.dataset.origin; // 判断在可视区了,把data-origin的值放到src observer.unobserve(item.target); // 已经加载过的图片停止进行监听 }

});

});

imgList.forEach(item => observer.observe(item));

补充

1、优化

由于上面某些情况是需要使用到window.scroll事件的,所以我们可以增加节流来减少事件处理函数的调用次数。 假设我们判断是否可视区逻辑为函数loadImage那么我们可以如下处理。

window.onscroll = throttle(loadImage, 500)

2、拓展

上面后续三种方法不仅仅可以使用在图片的懒加载上面,其实所有可以懒加载的地方都可以通过这种方式进行判断,比如列表分页加载,我们可以通过这种方式进行判断是否需要进行下一页的加载,比如我们需要埋曝光埋点的时候,可以通过这种方法判断元素是否曝光,进行埋点事件的触发。

iframe懒加载_如何实现图片懒加载相关推荐

  1. document引用图片的src属性能干嘛_如何实现图片懒加载

    背景 图片懒加载是针对图片加载时机的一种优化,在一些图片量比较大的网站(比如电商网站首页,或者团购网站.小游戏首页等),如果我们尝试在用户打开页面的时候,就把所有的图片资源加载完毕,那么很可能会造成白 ...

  2. html加载富文本_富文本图片懒加载解决方案

    图片懒加载,作为性能优化的一部分,想必我们并不陌生. 在React.Vue项目中,我们都可以引入对应的NPM包处理图片懒加载,如 lazyload.react-lazyload.vue-lazyloa ...

  3. 图片懒加载及Vue自定义图片懒加载指令

    文章目录 监听滚动的方式 IntersectionObserver方式 自定义图片懒加载vue指令1 自定义图片懒加载vue指令2 lazyLoadImage.js main.js中注册指令 组件中使 ...

  4. 什么事图片懒加载?如何实现图片懒加载?

    随着移动设备和网络技术的不断发展,网页设计也在不断地进化.其中,一项重要的技术就是图片懒加载(Lazy Load),它可以提高网站的加载速度和用户体验.本文将深入探讨图片懒加载的定义.原理.优势.实现 ...

  5. bootstraptable treeGrid 懒加载_为 Vue 的惰性加载加一个进度条

    简介 通常用 编写单页应用(SPA)时,当加载页面时,所有必需的资源(如 JavaScript 和 CSS 文件)都会被一起加载.在处理大文件时,这可能会导致用户体验不佳. 借助 Webpack,可以 ...

  6. img实现图片加载前默认图片,加载时替换真实图片,加载失败时替换加载失败图片

    文章目录 前言 一.加载前 二.加载成功 三.加载失败 总结 前言 开发过程中,我们希望图片在加载失败的时候会替换成加载失败的图片,同时为了更好的体验,加载前最好也要有一张占位图片,即实现加载前显示一 ...

  7. html 图片加载错误,CSS 无图片显示加载(失败)效果

    lazyload 时利用 iconfont 显示加载图片和加载失败效果 0. 效果 1. 显示加载中或者品牌图 可以是文字或者 iconfont, 并将图标显示到正中间 HTML 结构如下: .img ...

  8. htmlimg图片加载失败_html网页图片未加载完成或失败时显示默认图片

    前言 一般一个内容多的网站相对会有比较多的图片文件,但是同时加载这些图片文件或加载失败时会出现空白占位,影响美观,通过脚本控制,可以实现加载需求内容图片时,加载未完成或失败的时候显示一张本地默认图片, ...

  9. ios 微信浏览器 预加载_小程序页面预加载技术

    lightning-load-project 集成方式 看不效果览图的话,请看博客 https://blog.csdn.net/sinat_27612147/article/details/80802 ...

最新文章

  1. Virtual PC磁盘的最佳压缩方式
  2. Spring Boot 中引入 MyBatisPlus 的常规流程
  3. Node.js~在linux上的部署~外网不能访问node.js网站的解决方法
  4. 在DataGridView中添加行号
  5. 修改docker镜像的存储地址的方法(--graph)
  6. oracle expdp数据到txt,[20130727]ORACLE 12C使用expdp导出view数据.txt
  7. 树形结构:递归转化为迭代,万能通用方法,分治策略基于栈的实现
  8. javascript --- 再读作用域和闭包
  9. python 类中定义列表_Python-从类定义中的列表理解访问类变量
  10. android 代码设置dialog 全屏,Android里把Dialog设置为全屏的方法
  11. armqt字体ttf_QT字体的设置
  12. 电子商务发展的中心主体与边缘业务
  13. HDU-1042 N!
  14. 如何在Visual Studio Code中使用Live Share
  15. CAD填充块Hatch的深度解析
  16. Android随机出加减乘除的四则运算算术题
  17. 【每日一题】递增序列中绝对值最小的数
  18. 群英齐聚铸辉煌!孔明在线企鹅社区成功启动!
  19. 容斥定理与鸽巢定理(抽屉定理)
  20. 困惑了很久的函数D3DXCreateTextureFromFileInMemoryEx

热门文章

  1. 深刻了解 组件Component基本使用
  2. 无限流量的副卡怎么无服务器,我办理XX信199无限流量套餐,我主卡可以正常使用,我副卡居然暂停服务啦那为什么我主卡没有停机呢?...
  3. 对这段时间学习数据库的总结和感悟
  4. 电池耗电量将成为4G智能手机的硬伤
  5. 杏树林入局互联网医院 手里有哪些“好牌”?
  6. ipad分屏功能_iPad Pro2020新功能,附几个 iPad 系列使用小技巧
  7. html禁止搜索引擎转码,如何禁止百度、神马、搜狗等搜索引擎转码
  8. 怎样进行软文营销?软文营销的具体步骤有哪些?
  9. c语言运行后电脑很卡,上网看网页电脑弹出安全警报后电脑就很卡很闪该怎办?...
  10. python嵌套_Python简介,第7章-导入和嵌套