利用Intersection Observer实现图片懒加载性能优化

这篇具有很好参考价值的文章主要介绍了利用Intersection Observer实现图片懒加载性能优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Intersection Observer是浏览器所提供的一个 Javascript API,用于异步的检测目标元素以及祖先或者是顶级的文档视窗的交叉状态

这句话的意思就是:

我们可以看的图片当中,绿色的 target element(目标元素),并且存在一个顶层的或者祖先的文档视窗也就是当前图片中的,灰色的 browser viewport(浏览器的视窗)

当 target element(目标元素)进行移动的时候,将会与 browser viewport(浏览器的视窗)进行交叉状态的监控,那么利用这个交叉状态的监控,我们就可以实现诸如一个懒加载无限滚动或者是与元素可见性相关的一种操作。

利用Intersection Observer实现图片懒加载性能优化,前端

Intersection Observer基本概念的理解:

Intersection Observer是一个观察期,创建一个观察的对象,该对象可以观察一个或多个元素,而我们的目标元素target element 则是需要被观察的 dom元素,至于 intersection ratio 也就是交叉 其目标元素 与 其祖先或视窗 相交的一个状态,那么交叉比例也就是 intersection ratio指的是目标元素与其视窗或祖先元素相交的一个百分比。我们可以从上方图片中感受到这里面如果绿色的顶部这条线和 browser viewport 的底部是重合的,我们的交叉比例应该是0;如果是图片中当前的位置,我们的交叉比例应该接近于0.5也就是百分之五十;如果在往上走的时候,我们的交叉比例可能就是1

那么利用Intersection Observer能否去实现懒加载的性能优化呢,我们需要先确认的是:为什么会需要进行性能优化、我们原来进行图片懒加载的方式又是怎样的,我们可以通过一个实例进行相应是说明:

html 代码:

利用link进行相对应的样式引入

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./index2.css">
</head>
<body>
    <div>
        <h1>图片相册</h1>
        <img data-src="http://pic1.win4000.com/wallpaper/2018-09-19/5ba21a3006800.jpg" alt="">
        <img data-src="https://t7.baidu.com/it/u=1785207335,3397162108&fm=193&f=GIF" alt="">
        <img data-src="https://t7.baidu.com/it/u=338595665,4065109605&fm=193&f=GIF" alt="">
        <img data-src="https://t7.baidu.com/it/u=1732966997,2981886582&fm=193&f=GIF" alt="">
        <img data-src="https://t7.baidu.com/it/u=2581522032,2615939966&fm=193&f=GIF" alt="">
        <img data-src="https://t7.baidu.com/it/u=245883932,1750720125&fm=193&f=GIF" alt="">
        <img data-src="https://t7.baidu.com/it/u=3423293041,3900166648&fm=193&f=GIF" alt="">
        <img data-src="https://t7.baidu.com/it/u=3241434606,2550606435&fm=193&f=GIF" alt=""> 
        <img data-src="https://t7.baidu.com/it/u=1417505637,1247476664&fm=193&f=GIF" alt="">
        <img data-src="https://img0.baidu.com/it/u=775184654,1087701200&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500">
        <img data-src="https://lmg.jj20.com/up/allimg/1114/1110200ZS0/2011100ZS0-9-1200.jpg" alt="">
    </div>
    
</body>
<script src="./index2.js"></script>
</html>

css代码:

// 对页面中的img标签进行一个控制
img{
    width: 100vw;  // 宽度
    transform: translateX(50%);  // 横轴变化的操作(也就是位移)
    opacity: 0;  // 不可见
    transition: all 500ms;  // 动画的控制
} 
 
.fade{
    transform: translateX(0);  // 位移操作
    opacity: 1;  // 可见状态
    transition: all 500ms;  // 动画的操作
}

js代码:

//查询所有的img标签内容
const targets = document.querySelectorAll('img');

// 监听滚动事件
window.addEventListener("scroll", (event) => {
    // 遍历所有的img标签
    targets.forEach((img) => {
        // 获取img标签的top值
        console.log("load img")
        const rect = img.getBoundingClientRect().top;
        // 如果img标签的top值小于窗口的高度
        if (rect <= window.innerHeight){
            // 获取img标签的data-src属性值
            const src = img.getAttribute("data-src");
            // 将data-src属性值赋值给src属性
            img.getAttribute("src", src);
            // 添加fade类名
            img.classList.add("fade");
        }
    })
})

我们可以查看一下页面:

利用Intersection Observer实现图片懒加载性能优化,前端

当我们进行滚动操作的时候,将会不断的加载显示我们所需要显示的应一个图片,但是,当我们将控制台切换到console,会发现当我们滚动滚动条时,打印的信息频率异常的高,随随便便就产生了上千次的打印代码的输出操作,这也就是意味着我们的性能其实是极其的低下的,那么如何去减少滚动时对于图片懒加载显示的性能提升呢?

我们可以去考虑,当这个图片显示在这个browser viewport(浏览器的视窗),我们对其进行的是观察操作,只有在可视区里面,我们才对图片进行处理,利用的就是Intersection Observer的操作处理。

那么利用Intersection Observer进行具体功能的实现:

//查询所有的img标签内容
const targets = document.querySelectorAll('img');

// 定义一个函数
const lazyload = target =>{
    // 进行实体对象entries,并且设置一个observer参数内容
    const io = new IntersectionObserver((entries,observer) =>{
        // 进行实体对象的循环(这个实体对象便是我们之后的图片)
        entries.forEach((entry)=>{  // entry:每一个实体对象
            console.log("load img")
            
            // 当图片实例内容进行到我们的观察区时(也就是交叉的一种状态)
            if(entry.isIntersecting){ 
                const img = entry.target  // 设置一个图片,便是target目标
                const src = img.getAttribute("data-src")  // 通过data-src这个自定义数据内容进行来源数据的获取属性
                img.setAttribute("src",src);  // 设置图片路径
                img.classList.add("fade")  // 添加动画效果
                observer.disconnect();  // 将观察的内容进行取消连接的一个状态
            }
        })
    })
    io.observe(target)  // 通过io进行具体的observe观察图片内容
}
 
targets.forEach(lazyload);  // 最终对图片(获取到的图片数组)进行循环,调用的则是lazyload 自定义函数

此时,我们再进行滚动下来操作时,console打印的次数只有十几次:

利用Intersection Observer实现图片懒加载性能优化,前端

而使用scroll监听滚动时,有成千次的执行,所以我们可以利用Intersection Observer进行一个图片懒加载性能优化的一个处理。文章来源地址https://www.toymoban.com/news/detail-817479.html

到了这里,关于利用Intersection Observer实现图片懒加载性能优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 请求优化--利用webpack实现根据路由进行懒加载

    使用动态导入语法 :在Vue组件中使用 import() 语法来实现按需加载。例如: 配置Webpack :确保您的Webpack配置中启用了代码分割功能。这通常通过设置 optimization.splitChunks 选项来实现。例如 使用命名块 :如果您想将某个路由下的所有组件都打包在同一个异步块中,可以使用命名

    2024年01月25日
    浏览(37)
  • 利用uniapp中模仿抖音、滑动视频组件、首个视频自动播放、预加载、实现加载更多,超高性能

    抖音效果图 本内容主要实现了滑动视频组件、首个视频自动播放、预加载、实现加载更多,超高性能, 前言:最近在做短剧,于是就在网上找了很多不错的例子,但是不是很完美,基本上都比较卡顿,我也是在站在巨人的肩膀上优化了一下。本片主要基于vue3、setup和ts开发的

    2024年02月04日
    浏览(58)
  • 性能优化之懒加载 - 基于观察者模式和单例模式的实现

            在前端性能优化中,关于图片/视频等内容的懒加载一直都是优化利器。当用户看到对应的视图模块时,才去请求加载对应的图像。 原理也很简单,通过浏览器提供的 IntersectionObserver - Web API 接口参考 | MDN (mozilla.org),观察“哪个元素和视口交叉”,从而进行懒加载。

    2024年02月05日
    浏览(35)
  • 利用闭包与高阶函数实现缓存函数的创建&&缓存函数在项目中的性能优化

    缓存函数是一种用于存储和重复利用计算结果的机制。其基本思想是,当一个函数被调用并计算出结果时,将该结果存储在某种数据结构中 (通常是一个缓存对象)以备将来使用。当相同的输入参数再次传递给函数时,不再执行实际的计算,而是直接返回之前缓存的结果,从而

    2024年02月03日
    浏览(52)
  • 前端面试:【性能优化】页面加载性能、渲染性能、资源优化

    嗨,亲爱的前端开发者!在今天的Web世界中,用户期望页面加载速度快、交互流畅。因此,前端性能优化成为了至关重要的任务。本文将探讨三个关键方面的性能优化:页面加载性能、渲染性能以及资源优化,以帮助你构建更快速、响应更快的Web应用程序。 1. 页面加载性能:

    2024年02月11日
    浏览(44)
  • Web 前端性能优化之三:加载优化

    2、加载优化 1、延迟加载 本着节约不浪费的原则,在首次打开网站时,应尽量只加载首屏内容所包含的资源,而首屏之外涉及的图片或视频,可以等到用户滚动视窗浏览时再去加载。以上就是延迟加载优化策略的产生逻辑,通过延迟加载“非关键”的图片及视频资源,使得页

    2024年04月26日
    浏览(39)
  • 【 Vue3 性能优化】页面加载性能 与 更新性能

    Vue 在大多数常见场景下性能都是很优秀的,通常不需要手动优化。然而,总会有一些具有挑战性的场景需要进行针对性的微调。 数字化管理平台 Vue3+Vite+VueRouter+Pinia+Axios+ElementPlus教程 权限系统-商城 个人博客地址 Web 性能优化主要有两个方面: 页面加载性能 首次访问时,应

    2024年02月14日
    浏览(41)
  • 性能优化-react路由懒加载和组件懒加载

    随着项目越来越大,打包后的包体积也越来越大,严重影响了首屏加载速度,需要对路由和组件做懒加载处理 主要用到了react中的lazy和Suspense。 废话不多说,直接上干货 核心代码 配合路由表的完整例子 效果 组件加载前 组件懒加载后 这样就会大大加快首屏加载速度

    2024年02月14日
    浏览(32)
  • 【Angular性能优化】项目8版本加载速度缓慢、白屏时间、首页渲染性能优化方案

    随着业务的代码一点点增加,加上Angular的项目本身就比 vue、react 的重一些,随之而来的启动速度,更改文件后编译速度,以及打包速度也会变慢,于是乎想着优化下我们的项目。 本文章主要说的是 : 打包Angular项目的一些配置,性能优化方面的方案 打包后,用户进入页面的

    2024年04月10日
    浏览(45)
  • 前端面试:【性能优化】前端缓存、CDN、懒加载和预加载

    亲爱的前端开发者,Web性能对用户体验至关重要。如果你想让你的网站更快、更具吸引力,就需要关注前端性能优化。在这篇文章中,我们将深入探讨四个关键的性能优化策略:前端缓存、CDN(内容分发网络)、懒加载和预加载,以助你构建高性能的Web应用。 1. 前端缓存:优

    2024年02月11日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包