iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >前端JS图片懒加载原理是什么
  • 931
分享到

前端JS图片懒加载原理是什么

2023-07-05 04:07:47 931人浏览 泡泡鱼
摘要

这篇文章主要介绍“前端js图片懒加载原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“前端JS图片懒加载原理是什么”文章能帮助大家解决问题。原理图片懒加载的原理是没有在可视区域的图片暂时不加载

这篇文章主要介绍“前端js图片懒加载原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“前端JS图片懒加载原理是什么”文章能帮助大家解决问题。

原理

图片懒加载的原理是没有在可视区域的图片暂时不加载图片,等进入可视区域后在加载图片,这样可以减少初始页面加载的图片数量而提升页面加载速度。 图片懒加载在提升页面加载速度的同时也会伴随用户看其他未展示的图片时会有等待时间;图片加载显示会伴有布局抖动等问题。

方案

图片懒加载的关键是:判断一个元素是否在可视区域。

方案一:img的loading属性设为“lazy”

htmlImageElement 的 loading 属性为一个字符串,它的值会提示 用户代理 告诉浏览器不在可视视口内的图片该如何加载。这样一来,通过推迟图片加载仅让其在需要的时候加载而非页面初始载入时立刻加载,优化了页面的载入。

lazy 告诉用户代理推迟图片加载直到浏览器认为其需要立即加载时才去加载。例如,如果用户正在往下滚动页面,值为 lazy 会导致图片仅在马上要出现在 可视视口中时开始加载。

使用方法
<img src="xxx.jpg" loading="lazy" />
优点

只设置一个属性不用 javascript 控制代码是最简单方便的方案,性能也是比较好的。

兼容性

前端JS图片懒加载原理是什么

大部分主流浏览器都兼容该属性。

缺点

虽然整个方案简单性能好,但问题也是最多的,所以很少使用这种方案。

  • 前面提到图片懒加载用户看其他未展示的图片时会有等待时间,一般会设置一个默认图片,这种方案不能设置默认图片

  • 图片的加载数量和图片的布局、可视区域尺寸有关,难以控制

  • 图片的加载顺序也难以控制

该方案能粗略的实现图片懒加载基本功能。

方案二:通过offsetTop来计算是否在可视区域内

可视区域高度是 document.documentElement.clientHeight ,而可视区域的位置是在滚动条滚动位置 scrollTopscrollTop+document.documentElement.clientHeight之间。因此通过 image.offsetTop <= document.documentElement.clientHeight + document.documentElement.scrollTop 判断图片是否可以在可视区域内。

  function lazyload() {        var lazyImages = document.querySelectorAll(".lazyload");        lazyImages.forEach(function (image) {          if ( image.offsetTop <= document.documentElement.clientHeight + document.documentElement.scrollTop) {            image.src = image.getAttribute("data-src");          }        });      }

添加滚动条监听。

  window.onscroll = function () {        lazyload();};

html结构。

 <img src="./default.gif" class="lazyload" data-src="./photo-1.jpg" />
优化

上面只是简单的实现图片懒加载,在实际开发中还要很多细节需要优化: 首先是兼容性,这里有两个点涉及到兼容性:document.documentElement.clientHeightdocument.documentElement.scrollTop 。 获取浏览器窗口的内部高度方法有 window.innerHeightdocument.documentElement.clientHeightwindow.innerHeight兼容性是 ie9+ 和其他主流浏览器。

前端JS图片懒加载原理是什么

document.documentElement.clientHeight 浏览器都支持。

前端JS图片懒加载原理是什么

获取滚动位置方法有 window.pageYOffsetdocument.documentElement.scrollTopwindow.pageYOffset 兼容性是 ie9+ 和其他主流浏览器。

前端JS图片懒加载原理是什么

第二优化点是offsetTop。

offsetParent 元素有滚动条的情况下计算会不会有问题

HTMLElement.offsetTop 为只读属性,它返回当前元素相对于其 offsetParent 元素的顶部内边距的距离。 &mdash;&mdash;MDN

offsetTop 是相对其 offsetParent 元素的并不是相对浏览器窗口可视区域的。如果图片元素有 offsetParent 那么 offsetTop 是有偏差的。

      function getBoundinGClientTop(el) {        let top = el.offsetTop;        let parent = el.offsetParent;        while (parent) {          top += parent.offsetTop;          parent = parent.offsetParent;        }        return top;      }

第三优化点避免赋值 src 。 代码是通过 lazyload 类获取需要懒加载的元素,这样会把之前已经加载图片的元素也获取到了,而重复设置 src属性。

   function lazyload() {        var lazyImages = document.querySelectorAll(".lazyload[data-src]");        lazyImages.forEach(function (image) {          if (            getBoundingClientTop(image) <=            document.documentElement.clientHeight +              document.documentElement.scrollTop          ) {            image.src = image.getAttribute("data-src");            image.removeAttribute("data-src")          }        });      }

通过 lazyload 类并且有 data-src 来获取元素,src 设置完后移除 data-src 属性来避免重复设置 src 。

第四优化点 onscroll 是否添加防抖。 onscroll 常用的优化点是加入防抖来减少事件触发的频率,但这里如果加了防抖,计算元素是否在可视区域内的精度就差很多,当滚动速度比较快的情况下加载反应不灵敏,这里就要找平衡点。

第五优化点页面中局部的 div 滚动图片懒加载。 除了整个页面的滚动图片懒加载,也有页面中局部滚动图片懒加载,就需要给制定的有滚动条 dom 元素绑定onscroll 事件。

    srcollDom.onscroll = function () {        lazyload();      };

并且获取图片 top 是相对有滚动条 dom 元素

getBoundingClientTop(image)-getBoundingClientTop(srcollDom) <= srcollDom.clientHeight + srcollDom.scrollTop

第六优化点加载图片的时间点提前。 代码中是图片元素进入可视区域后才加载图片,用户就需要等待一段时间才能看到图片显示出来,如果把图片加载时间提前,图片元素距离可视区域一定范围内就加载图片,那么用户等待时间就会减少一些。

优点

兼容性好,各个环节可以控制。

缺点

性能相对不是很好,滚动事件频繁触发,并且获取元素的位置信息,可能会强行触发重排和重绘导致一定的性能消耗。

方案三:通过getBoundingClientRect来计算是否在可视区域内

大致思路和方案二一样只是把获取图片元素 offsetTop 改成 getBoundingClientRect 方法获取离可视区顶端的距离。比方案一要简单一点,缺点也和方案一一样。

方案四:使用IntersectionObserver来判断是否在可视区域内

该方案是通过 IntersectionObserver 来判断图片元素是否在可视区域内。

IntersectionObserver() 构造器创建并返回一个 IntersectionObserver 对象。如果指定 rootMargin 则会检查其是否符合语法规定,检查阈值以确保全部在 0.0 到 1.0 之间,并且阈值列表会按升序排列。如果阈值列表为空,则默认为一个 [0.0] 的数组。 &mdash;&mdash; MDN

完全没看懂mdn的这段解释,简单说就是

IntersectionObserver 接口提供了一种异步观察目标元素与祖先元素或顶级文档 viewport 的交集中的变化的方法。祖先元素与视窗viewport被称为根(root)。

      var images = document.querySelectorAll(".lazyload");      var io = new IntersectionObserver(        function (entries) {          entries.forEach((item) => {            // isIntersecting是一个Boolean值,判断目标元素当前是否可见            if (item.isIntersecting) {              item.target.src = item.target.dataset.src;              // 图片加载后即停止监听该元素              io.unobserve(item.target);            }          });        }      );      images.forEach(function(image){        io.observe(image)      })

IntersectionObserver 的监听对于页面局部滚动条也是有效的,不用再单独对局部滚动条进行处理。 而提前加载图片通过配置 rootMargin 来扩大监听区域。

      var images = document.querySelectorAll(".lazyload");      var io = new IntersectionObserver(        function (entries) {          entries.forEach((item) => {            // isIntersecting是一个Boolean值,判断目标元素当前是否可见            if (item.isIntersecting) {              item.target.src = item.target.dataset.src;              // 图片加载后即停止监听该元素              io.unobserve(item.target);            }          });        },        {          root: null,          rootMargin: "0px 0px 300px 0px",        }      );      images.forEach(function(image){        io.observe(image);      })
兼容性

前端JS图片懒加载原理是什么

在一些低版本浏览器中还存在一些问题。

优点

性能好,简单。

缺点

低版本浏览器 IntersectionObserver 存在问题,不支持 IE。

问题

布局抖动

布局抖动是因为开始图片没有宽高,内容显示出来后有了宽高导致位置变动。带来的影响主要是用户体验不好,用户的注意力已经定了某个区域准备阅读,突然那个区域下移了,中断阅读而重新定位。可以直接在 img 标签上设置要加载图片的宽高。

<img src="blank.gif" data-src="nORMal.jpg"  />

解决问题:方案解决的问题范围是图片宽高固定的情况,在响应式环境图片宽高不确定下不适用。

用户体验:img的默认占位图是一个loading或是灰色背景,图片还没加载的体验。

响应式图片

虽然响应式下图片的宽高会变,但是图片的宽高比是不变的,图片的宽高比变了图片也就变形了。所以 img 标签设定图片宽高比,就能根据不同视图的宽度算出不同高度。 先创建一个宽高比为 5:1 的 div。

   <div ></div>

padding 为百分比是相对自身宽度的百分比。 然后再创建了一个宽高比为 5:1 的 img。

    <div >        <img >      </div>

这样就能适应响应式的宽度改变,这种方式叫 Aspect Ratio Boxes。 占位图片可以设置成原图片的小尺寸图片,被放大后图片变模糊,这样开始加载小图片但图片的轮廓出现,后面在加载大图片显示清晰,给用户的体验是图片开始就在加载,然后加载完成就变清晰了。 img 标签 srcset 属性是处理响应式图片的。懒加载中可以设置 data-srcset 来延迟修改 srcset 属性。

SEO不友好

<img> 标签中的 src 属性携带的仍然是原始大小的图片确保了站外 SEO、社会化分享、RSS 等不会读不到原图。Aspect Ratio Boxes 方式使占位图片适应响应式,srcset 属性存放了一张原图的小尺寸缩略图阻止 src 原图的加载而加载缩略图优化加载体验,最后延迟将 data-srcset 的值赋值到 srcset 中。

插件

  • lazyload.js 是 IntersectionObserver 方式,而且当浏览器不支持 IntersectionObserver 的时候就直接加载图片,没有延迟加载的功能。

  • Vue-lazyload 使用 IntersectionObserver 和 getBoundingClientRect 方式,默认 getBoundingClientRect 方式懒加载,里面的一些封装细节有很多有意思的地方,不止绑定了 onscroll 事件还绑定了 'onwheel'、'onmousewheel'、'onresize'、 'onanimationend'、'ontransitionend'、'ontouchmove'问什么要绑定这么多事件,插件为什么默认 getBoundingClientRect 方式而不用 IntersectionObserver 方式,待下回分解。

  • React-lazyload 只用了 getBoundingClientRect 方式,里面的封装细节也很有意思。

关于“前端JS图片懒加载原理是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: 前端JS图片懒加载原理是什么

本文链接: https://www.lsjlt.com/news/349492.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 前端JS图片懒加载原理是什么
    这篇文章主要介绍“前端JS图片懒加载原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“前端JS图片懒加载原理是什么”文章能帮助大家解决问题。原理图片懒加载的原理是没有在可视区域的图片暂时不加载...
    99+
    2023-07-05
  • js前端如何实现图片懒加载
    这篇文章主要介绍js前端如何实现图片懒加载,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!思路:将页面里所有img属性src属性用data-xx代替,当页面滚动直至此图片出现在可视区域...
    99+
    2024-04-02
  • 如何实现前端图片懒加载
    这篇文章主要介绍了如何实现前端图片懒加载,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。定义图片懒加载又称图片延时加载、惰性加载,即在用户需要...
    99+
    2024-04-02
  • 前端图片懒加载的原理与3种实现方式举例
    目录一. 图片懒加载的目的二. 图片懒加载的原理方法三. 图片懒加载的实现方法3.1 滚动监听+scrollTop+offsetTop+innerHeight3.2 滚动监听+get...
    99+
    2023-03-01
    怎么实现图片懒加载 懒加载实现原理 前端图片懒加载原理
  • web前端图片懒加载的原理与实现方式有哪些
    这篇文章主要讲解了“web前端图片懒加载的原理与实现方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“web前端图片懒加载的原理与实现方式有哪些”吧!一. 图片懒加载的目的大型网站如常...
    99+
    2023-07-05
  • js怎么实现图片的懒加载
    这篇文章给大家分享的是有关js怎么实现图片的懒加载的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。图片的懒加载是前端优化必须要掌握的东西,图片实现懒加载可以节省带宽又可以减轻我们网页的负荷。接下来我来记录一下我所掌...
    99+
    2023-06-14
  • 前端必会的图片懒加载(三种方式)
    目录一.何为懒加载🌃:二.实现懒加载🌄:2.1 第一种方式:2.2 第二种方式:2.3 第三种方式(优):三.总结:一.何为懒加载🌃:...
    99+
    2024-04-02
  • JS图片懒加载库VueLazyLoad怎么使用
    这篇文章主要介绍“JS图片懒加载库VueLazyLoad怎么使用”,在日常操作中,相信很多人在JS图片懒加载库VueLazyLoad怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JS图片懒加载库Vue...
    99+
    2023-07-05
  • js前端图片加载异常兜底方案
    目录背景<img>加载错误解决方案内联事件全局img添加事件利用error事件捕获替换src方式的最优解CSS处理的最优解<img>加载超时解决方案嗅探切换D...
    99+
    2024-04-02
  • VUE懒加载原理详解:一文带你读懂图片懒加载的奥秘
    VUE 是一个流行的前端框架,它提供了许多开箱即用的特性,其中之一就是懒加载。懒加载的目的是延迟加载资源,以提高网页加载速度和性能。 VUE 懒加载的原理很简单,它通过一个指令(v-lazy)来实现。当该指令应用于一个元素时,浏览器就会延...
    99+
    2024-02-13
    VUE 懒加载 图片懒加载 性能优化
  • java懒加载的实现原理是什么
    Java的懒加载(Lazy Loading)是一种延迟加载的策略,即在需要使用某个对象时才进行实例化和初始化,在之前不会占用额外的资...
    99+
    2023-09-14
    java
  • JavaScript怎么实现图片懒加载
    本篇内容介绍了“JavaScript怎么实现图片懒加载”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!实现思路实现图片懒加载我们需要先明白具体...
    99+
    2023-07-02
  • Vue怎么实现图片懒加载
    本篇内容主要讲解“Vue怎么实现图片懒加载”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue怎么实现图片懒加载”吧! 1.下载 npm i vue-laz...
    99+
    2024-04-02
  • redis懒加载是什么
    redis懒加载指的是延迟加载,当访问页面时,会把img标签中的src链接设为同一张图片,将其真正的图片地址存储在img标签的自定义属性中,当js监听到该图片元素进入可视窗口时,即将地址存储到src属性中,从而达到懒加载的效果。...
    99+
    2024-04-02
  • jQuery中图片懒加载lazyload.js怎么用
    这篇文章将为大家详细讲解有关jQuery中图片懒加载lazyload.js怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。lazyload是一个用Javascript...
    99+
    2024-04-02
  • JS前端instanceof的实现原理是什么
    这篇文章主要介绍了JS前端instanceof的实现原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JS前端instanceof的实现原理是什么文章都会有所收获,下面我们一起来看看吧。instanceo...
    99+
    2023-07-04
  • 怎么实现vue-lazyload图片懒加载
    这篇文章主要介绍“怎么实现vue-lazyload图片懒加载”,在日常操作中,相信很多人在怎么实现vue-lazyload图片懒加载问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2024-04-02
  • 什么是react懒加载
    本教程操作环境:Windows10系统、react18.0.0版、Dell G3电脑。什么是react懒加载?React懒加载一、懒加载是什么?为什么需要懒加载?懒加载:不会预加载,而是需要使用某段代码,某个组件或者某张图片时,才加载他们(...
    99+
    2023-05-14
    懒加载 React
  • vue3图片懒加载IntersectionObserver和useIntersectionObserver怎么用
    这篇文章主要介绍“vue3图片懒加载IntersectionObserver和useIntersectionObserver怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue3图片懒加载In...
    99+
    2023-07-05
  • 图片懒加载怎么从简单到复杂
    本篇内容主要讲解“图片懒加载怎么从简单到复杂”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“图片懒加载怎么从简单到复杂”吧!为什么要做图片的懒加载假设在用户访问某...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作