首页 > 其他分享 >性能优化利器❕ - 深入浅出IntersectionObserver系列

性能优化利器❕ - 深入浅出IntersectionObserver系列

时间:2024-12-28 13:55:18浏览次数:6  
标签:动画 元素 observer 深入浅出 利器 视口 IntersectionObserver 加载

在这里插入图片描述

这IntersectionObserver

IntersectionObserver

IntersectionObserver(交叉观察器)是浏览器提供的一种API,用于检测一个元素是否出现在视口(viewport)内,或者与另一个元素或浏览器的边界相交。这个API非常有用,特别是在实现懒加载图片无限滚动页面或是其他基于可见性的交互效果时。


基本用法

1、创建观察器

const observer = new IntersectionObserver(entries => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      // 元素在视口内
    }
  });
}, {
  threshold: 0.5 // 可以设置多个阈值,这里表示当元素50%出现在视口内时触发回调
});
  • 创建一个 IntersectionObserver 实例,并指定回调函数以及可选的配置对象

2、观察目标元素

observer.observe(targetElement);

使用 .observe() 方法来开始观察特定的DOM元素。


3、停止观察:

observer.unobserve(targetElement); // 停止观察单个元素
observer.disconnect(); // 断开观察器的所有观察
// 使用 .unobserve() 方法可以停止观察某个元素,
// 或者使用 .disconnect() 方法来完全断开观察器的所有观察。

4、配置项

  • root: 定义相对于哪个元素进行观察,默认为视口
  • rootMargin: 定义相对于根元素边缘的偏移量
  • threshold: 一个数值或数值数组,定义了何时调用回调函数。数值范围从0到1,分别代表没有交集和完全交集。

图片懒加载

假设你有一个包含许多图片的页面,但希望只有当图片进入视口时才加载它们。你可以使用 IntersectionObserver 来实现这样的懒加载功能:

const images = document.querySelectorAll('.lazy');
const observer = new IntersectionObserver((entries, observer) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      entry.target.src = entry.target.dataset.src; 
      // 设置图片的真实src
      observer.unobserve(entry.target); 
      // 不再观察已经加载的图片
    }
  });
}, {
  threshold: 0.5
});

images.forEach(img => observer.observe(img));

在这个例子中,当图片元素与视口至少有50%的交集时,就会被加载并从观察列表中移除

拓展:

使用 onscroll实现来懒加载

window.onscroll = function() {
  const images = document.querySelectorAll('.lazy:not(img[src])');
  images.forEach(img => {
    if (isInViewport(img)) {
      img.src = img.dataset.src;
    }
  });
};

function isInViewport(element) {
  const rect = element.getBoundingClientRect();
  return (
    rect.top >= 0 &&
    rect.left >= 0 &&
    rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
    rect.right <= (window.innerWidth || document.documentElement.clientWidth)
  );
}

在上述示例中,IntersectionObserver 版本更加简洁,同时也避免了在滚动时执行额外的计算,从而提高了性能


无限滚动

IntersectionObserver 也可以用来实现无限滚动,即当用户滚动到页面底部时自动加载更多内容

let observer = new IntersectionObserver((entries, observer) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      loadMore();
      observer.unobserve(entry.target);
    }
  });
});

observer.observe(document.querySelector('.footer'));

无限滚动的用处比较多

  • 社交媒体网站:在社交媒体网站上,可以使用无限滚动来加载用户的动态或新闻源的文章,使用户能够无限地向下滚动并加载更多内容
  • 电子商务网站:在商品列表页面,可以使用无限滚动来实现滚动到页面底部时自动加载更多商品,提供更好的浏览体验。
  • 新闻网站:在新闻列表或文章阅读页面,可以使用无限滚动来加载更多新闻或相关文章,使用户可以持续阅读感兴趣的内容。
  • 图片浏览器和相册:在图片浏览器或相册应用中,可以使用无限滚动来加载更多照片,使用户可以连续地查看图片。
  • 博客或论坛:在博客网站或论坛上,可以使用无限滚动来加载更多帖子或博客文章,让用户可以方便地浏览并获取更多信息。

首屏动画优化

页面动画当元素进入视口时触发动画效果,为页面增添交互与吸引力。

// 创建 IntersectionObserver 实例
const options = {
  root: null,
  rootMargin: '0px',
  threshold: 0.2 // 元素交叉区域达到视口20%时触发回调
};

const observer = new IntersectionObserver(callback, options);

// 定义回调函数
function callback(entries, observer) {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const element = entry.target;
      element.classList.add('animate'); // 添加动画类或样式,触发动画效果

      observer.unobserve(element); // 停止观察该元素
    }
  });
}

// 找到所有需要触发动画效果的元素
const elements = document.querySelectorAll('.animated-element');

// 将元素添加到 IntersectionObserver 中进行观察
elements.forEach(element => {
  observer.observe(element);
});

当元素进入视口并与视口的交叉区域达到预设的阈值时,回调函数会被触发。在回调函数中,可以使用 entry.target 来访问触发动画效果的元素。
在这个示例中,我们使用 element.classList.add('animate') 来添加动画类或样式,从而触发元素的动画效果。通过调整 IntersectionObserver 实例的 threshold 属性,可以控制什么时候触发动画效果。

  • 例如,将 threshold 设置为 0.5 表示元素至少与视口有一半交叉时触发动画。这种页面动画效果可以应用于多种场景,

  • 例如:首屏加载动画:当页面加载完成后,逐个触发元素进入视口时添加动画效果,增添页面的过渡效果。

  • 滚动加载动画:当页面滚动到某个特定区域时,触发该区域内的元素添加动画效果,提高用户体验。

  • 图片懒加载动画:当图片进入视口时,添加动画效果显示图片,提升页面的视觉吸引力。

注意,在使用动画效果时要注意性能和用户体验,避免过多或复杂的动画效果影响页面加载速度和流畅度。


好处

  • 更好的性能:传统的监听滚动事件方式可能会导致频繁的计算,影响页面性能。而 IntersectionObserver 是浏览器原生提供的API,它使用异步执行,可以更高效地监听元素是否进入视口,减少了不必要的计算和性能开销。
  • 减少代码复杂性:IntersectionObserver可以简化代码逻辑。使用传统的方式监听滚动事件需要手动计算元素的位置、判断元素是否进入视口,以及处理滚动事件的节流等。而通过IntersectionObserver,只需定义回调函数,在元素进入或离开视口时触发相应操作,大大简化了代码
  • 支持懒加载和无限滚动:IntersectionObserver可以实现图片懒加载无限滚动等常见效果。当元素进入视口时,可以延迟加载图片或触发数据请求,避免不必要的资源加载,提升页面加载速度和性能。
  • 更精确的可见性控制:IntersectionObserver提供了更精确的可见性控制。通过设置合适的阈值(threshold),可以灵活地控制元素与视口的交叉区域达到多少时触发回调。这使得开发者可以根据需求来定义元素何时被认为是进入或离开视口,从而触发相应的操作。

标签:动画,元素,observer,深入浅出,利器,视口,IntersectionObserver,加载
From: https://blog.csdn.net/weixin_46714216/article/details/144758985

相关文章

  • 掌控云端迁移:构建MySQL跨云迁移的成本效益分析利器
    在当今数字化转型的浪潮中,企业对云计算的需求日益增长,多云策略逐渐成为主流。为了更好地管理资源、降低运营成本并提高灵活性,越来越多的企业选择将数据库迁移到不同的云环境中。然而,在享受这些优势的同时,如何有效地控制迁移过程中的成本成为了亟待解决的问题之一。本文将详......
  • 深入浅出AI落地应用之AI+「低代码平台」!
    低代码(LowCode)是一种可视化的应用开发方法,用较少的代码、以较快的速度来交付应用程序(来源于百度百科)。从百度百科对低代码平台的定义可以了解到低代码平台是利用可视化开发与较少的代码相结合的方式来实现快速高效地开发应用。一、构成一般的低代码平台由以下几部分组成......
  • 3款.NET开源、功能强大的通讯调试工具,效率提升利器!
    前言今天大姚给大家分享3款.NET开源、功能强大的通讯调试工具,帮助大家提高通讯调试的效率和准确性。LLCOMLLCOM是一个.NET开源的、功能强大的串口调试工具。支持Lua自动化处理、串口调试、串口监听、串口曲线、TCP测试、MQTT测试、编码转换、乱码恢复等功能。项目开源地址:htt......
  • 【Linux】Linux开发利器:make与Makefile自动化构建详解
    Linux相关知识点可以通过点击以下链接进行学习一起加油!初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G++编译器在现代软件开发中,自动化构建工具显得尤为重要,make和Makefile是Linux环境下的常用选择。它们通过定义规则和依赖关系,帮助开发者高效管理项目的构建过程。......
  • 深入浅出ArkTS开发指南之底部导航和页面跳转
    大家好,我是全栈的峰哥,独立开发者,相关问题可以加v:2588234,联系我一起沟通今天带来的知识是Navigation组件的使用,同时通过属性:toolbarConfiguration的配置,配合router.pushUrl的运用,实现底部导航切换到首页、会员中心,同时支持多个Navigation,并跳转到NavDestination子页面中。定义......
  • Taipy是个好神器!Python+Flask+ React快速构建 AI Web 应用的利器
    随着人工智能在各行业的应用越来越广泛,开发快速、高效的AIWeb应用成为众多互联网企业和开发者共同需求。Taipy,作为一个专为Python数据和AIWeb应用构建而生的工具,正迅速赢得大家的青睐。无论是算法专家还是开发新手,Taipy都提供了简洁高效的解决方案,让AIWeb应用......
  • 精确计算的利器:Decimal.js 基本用法与详解
    一、Decimal.js简介decimal.js是一个用于任意精度算术运算的JavaScript库,它可以完美解决浮点数计算中的精度丢失问题。特性:1.任意精度计算:支持大数、小数的高精度运算。2.链式调用:简洁的链式操作方式。3.支持所有常见运算:加减乘除、取幂、平方根、取模等。4.跨平台:......
  • IntelliJ IDEA 快捷键大全:提升开发效率的利器
    目录一、基础快捷键1.文件操作快捷键2.编辑(Editing)2.1代码补全与导航2.2代码编辑2.3代码折叠与展开3.查找与替换4.调试5.版本控制高级快捷键重构快捷键:让代码更加优雅导航快捷键:快速定位代码Git快捷键:版本控制更高效其他快捷键:更多高效操作快捷键图片......
  • 探索数据可视化的利器:Matplotlib
    探索数据可视化的利器:Matplotlib引言在数据科学和机器学习领域中,有效的数据可视化是理解和传达信息的关键。Python拥有许多优秀的可视化库,其中Matplotlib是最基础也是最强大的之一。它不仅为其他高级可视化库(如Seaborn、Plotly等)提供了底层支持,而且自身也具备绘制高质量......
  • 【Spring事务】深入浅出Spring事务从原理到源码
    什么是事务保证业务操作完整性的一种数据库机制(driver驱动)事务特定ACIDA原子性(多次操作要不一起成功要不一起失败(部分失败savepoint))C一致性(事务开始时数据状态,事务结束是数据状态一致)I隔离性(多个事务不能互相影响,做到隔离)D持久性(事务操作的结果,永......