1.什么是懒加载?

懒加载也就是延迟加载。

当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次,俗称占位图),

只有当图片出现在浏览器的可视区域内时,才设置图片正真的路径,让图片显示出来。这就是图片懒加载。

2.为什么要使用懒加载?

很多页面,内容很丰富,页面很长,图片较多。比如说各种商城页面。这些页面图片数量多,而且比较大,少说百来K,多则上兆。

要是页面载入就一次性加载完毕。估计大家都会等到黄花变成黄花菜了。

3.懒加载的原理是什么?

页面中的img元素,如果没有src属性,浏览器就不会发出请求去下载图片,

只有通过javascript设置了图片路径,浏览器才会发送请求。

懒加载的原理就是先在页面中把所有的图片统一使用一张占位图进行占位,

把真正的路径存在元素的“data-url”(这个名字起个自己认识好记的就行)属性里,要用的时候就取出来,再设置;

4.懒加载的实现步骤?

1)首先,不要将图片地址放到src属性中,而是放到其它属性(data-original)中。

2)页面加载完成后,根据scrollTop判断图片是否在用户的视野内,如果在,则将data-original属性中的值取出存放到src属性中。

3)在滚动事件中重复判断图片是否进入视野,如果进入,则将data-original属性中的值取出存放到src属性中。

5.懒加载的优点是什么?

页面加载速度快、可以减轻服务器的压力、节约了流量,用户体验好

6:懒加载代码实现

方式一:

元素距顶部的高度 - 页面被卷去的高度 <= 浏览器可视区的高度) 
      来判断是否符合我们想要的条件.需要实时监听页面滚动时 图片的高度变化

<!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>Document</title><style>* {padding: 0;margin: 0;list-style: none;}img {width: 400px;height: 300px;}</style><script>window.onload = function () {var imgs = document.querySelectorAll("img");// 初始化执行lazyLoad(imgs);// 滚动执行window.addEventListener("scroll", function () {lazyLoad(imgs);});function lazyLoad(imgs) {for (let i = 0; i < imgs.length; i++) {var imgoffsetT = imgs[i].offsetTop; // 图片的距顶部的高度var wheight = window.innerHeight; // 浏览器可视区的高度var scrollT = document.documentElement.scrollTop; // 页面被卷去的高度if (imgoffsetT - scrollT <= wheight) {// 判断图片是否将要出现imgs[i].src = imgs[i].dataset.src; // 出现后将自定义地址转为真实地址}}}};/* obj.getAttribute("属性名")通过元素节点的属性名称获取属性的值。使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,dataset 获取自定义属性值的使用*/</script></head><body><ul><li><img data-src="./img/img1.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img2.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img3.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img4.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img5.png" src="./img/loading.gif" alt="" /></li></ul></body>
</html>

方式二       getBoundingClientRect()

<!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>Document</title><style>* {padding: 0;margin: 0;list-style: none;}img {width: 400px;height: 300px;}</style><script>window.onload = function () {var imgs = document.querySelectorAll("img");// 初始调动一次lazyLoad();window.addEventListener("scroll", throttle(lazyLoad, 1000), false);//函数1:封装判定图片是否在可视区function isInVisibleArea(imgOne) {const info = imgOne.getBoundingClientRect();//  获取页面可视区的高度,宽度let windowH = window.innerHeight;let windowW = window.innerWidth;// 限定参数在可视区内let res = info.bottom > 0 && info.top < windowH && info.right > 0 && info.left < windowW;return res;}//函数2: 封装滚动时重新加载函数function lazyLoad() {for (let i = 0; i < imgs.length; i++) {const imgOne = imgs[i];// 判定是否在可视区内if (isInVisibleArea(imgOne)) {// 替换src方法一:// imgOne.src = imgOne.getAttribute("data-src");// 替换src方法二:imgOne.src = imgOne.dataset.src;// imgs.splice(i,1)// i--;}console.log("我滚了"); //所以要做节流操作}}//函数3:节流函数/* 参数1: 函数参数2:执行时间*/function throttle(fn, time = 250) {let lastTime = null;return function (...args) {const now = Date.now(); //当前时间if (now - lastTime >= time) {fn();//帮助执行函数,改变上下文lastTime = now;}};}};/* getBoundingClientRect()——获取元素位置,这个方法没有参数——用于获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置。——是DOM元素到浏览器可视范围的距离(不包含文档卷起的部分)。该函数返回一个Object对象,该对象有6个属性:top,lef,right,bottom,width,height;*/</script></head><body><ul><li><img data-src="./img/img1.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img2.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img3.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img4.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img5.png" src="./img/loading.gif" alt="" /></li></ul></body>
</html>

方式三:IntersectionObserver(callback)

<!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>Document</title><style>* {padding: 0;margin: 0;list-style: none;}img {width: 400px;height: 300px;}</style></head><body><ul id="view"><li><img data-src="./img/img1.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img2.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img3.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img4.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img5.png" src="./img/loading.gif" alt="" /></li></ul><script>const imgs = document.querySelectorAll("img");const callback = (res) => {//res 是观察的元素数组   info 每个被观察的图片信息res.forEach((info) => {//  isIntersecting 目标是否被观察到,返回布尔值if (info.isIntersecting) {// img 就是当前的图片标签const img = info.target;img.src = img.getAttribute("data-src");// 真实地址替换后 取消对它的观察obs.unobserve(img);console.log("触发");}});};const obs = new IntersectionObserver(callback);// 实例化 IntersectionObserver//   遍历imgs所有的图片,然后给每个图片添加观察实例imgs.forEach((img) => {//  observe : 被调用的IntersectionObserver实例。给每个图片添加观察实例obs.observe(img);});/* IntersectionObserver(callback) callback回调触发两次,看见了出发,看不见也触发*/</script></body>
</html>

JavaScript中的懒加载——概念,作用,原理,实现步骤,以及3种原生js实现方式相关推荐

  1. java-web hibernate中的懒加载问题

    java-web hibernate中的懒加载问题 懒加载异常 1.延迟加载机制 延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作.在 ...

  2. bootstrap 数据加载中提示_解决Quartz定时器中查询懒加载数据no session的问题

    作者:下一秒升华 出自:CSDN 原文:blog.csdn.net/u013815546/article/details/53032445 相信大家在web开发过程中一定遇到过一种情况,Class班级 ...

  3. 解决hibernate中的懒加载(延迟加载)问题

    解决hibernate中的懒加载(延迟加载)问题 我们在开发的时候经常会遇到延迟加载问题,在实体映射时,多对一和多对多中,多的一样的属性默认是lazy="true"(即,默认是延迟 ...

  4. 关于swift中的懒加载

    懒加载 在 iOS 开发中,懒加载是无处不在的 懒加载的格式如下: lazy var person: Person = {print("懒加载")return Person() } ...

  5. 代码中避免懒加载错误_网站设计中应避免的5大错误

    代码中避免懒加载错误 The design of a website plays an imperative role in creating an effective and impressive ...

  6. vue2开发过程中el-select懒加载问题

    el-select懒加载 近期开发的项目进行压力测试,结果发现系统变得越来越卡,点击发现后台的响应时间并不慢,大部分都在200ms以内,table已经全部进行分页处理,排除el-table数据量过大导 ...

  7. vue中路由懒加载浅析

    http://www.cnblogs.com/zhanyishu/p/6587571.html 懒加载主要分为两步: 1.webpack配置使它支持懒加载. 2.router层面异步的方式加载组件. ...

  8. vue项目中 img标签加载失败方法,onerror事件的两种方法

    vue项目中 img标签加载失败方法 ?css 第一种方法 第二种方法 本人写的第一篇文章,希望对你有帮助 第一种方法 < img src="123" :οnerrοr=&q ...

  9. php自动加载原理,php中的自动加载类机制原理

    PHP最早讀取套件的方法 初學PHP時,最早會面對的問題之一就是require與include差別何在? require_once與include_once又是什麼? 弄懂這些問題之後,如果不使用fr ...

最新文章

  1. 超越英伟达的,不会是另一款GPU?这家深圳公司发布全球首款数据流AI芯片
  2. 数据挖掘相关知识介绍
  3. Linux软件安装的几种方法 (一)—— apt-get
  4. oracle常用的知识点
  5. phpstorm设置xdebug调试
  6. python自动化测试——元素操作
  7. C/S模型之TCP协议
  8. HDU 1811 Rank of Tetris(并查集+拓扑排序 非常经典)
  9. 生存的关键往往在于偶然的机遇——李光耀
  10. md(Markdown)文件编辑
  11. 思科网络设备命令大全
  12. Reports empty tag body. The validation works in XML / JSP / JSPX / HTML/ XHT
  13. 【电赛练习】手写绘图板 2013电赛G题
  14. 可以测试电脑网络速度的软件,介绍4种有用的Internet Speed软件应用程序,用于测试网络速度软件...
  15. 网易云信发送短信工具类
  16. 不是“饭饭之交”! 李彦宏丁磊CP乌镇神同步
  17. 在Godot中制作杀戮尖塔的箭头
  18. android 仿微信来电_仿MIUI、微信来电通知无法解决通知折叠到通知列表
  19. 阿里云——OSS的创建和使用
  20. 在IBM PureApplication System上安装IBM InfoSphere Guardium数据加密

热门文章

  1. linux查看硬盘插槽_linux下硬盘接口信息怎么查询
  2. Java反射的概念和作用
  3. java 302 301,http响应码301和302代表的是什么?有什么区别?
  4. C语言左移超过31的处理方法
  5. vue鼠标的移入移除事件
  6. 【Java学习笔记(五十三)】之Git简介,Git常用命令
  7. 上周热点回顾(2.10-2.16)
  8. mysql的命令行形式登录
  9. python 判断字符串中字符类型的常用方法
  10. 关于ns-3中安装openflow的问题,解决openflow not found