”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 Intersection Observer 提高网站性能

使用 Intersection Observer 提高网站性能

发布于2024-07-30
浏览:817

Enhancing Website Performance with Intersection Observer

介绍

为了寻求更快、更高效的网络体验,开发人员不断寻求新的方法来优化性能。 Intersection Observer API 是 Web 开发人员武器库中的一项强大工具。此 API 允许您观察目标元素可见性的变化,从而启用延迟加载和延迟内容加载等高级策略。在本博客中,我们将探讨如何使用 Intersection Observer API 来提高网站的性能。

什么是交叉口观察者?

Intersection Observer API 提供了一种异步观察目标元素与祖先元素或顶级文档视口的交集变化的方法。这对于用户向下滚动页面时延迟加载图像或其他内容特别有用。

性能改进的关键用例

  1. 延迟加载图像和 iframe:仅在图像和 iframe 即将进入视口时才加载图像和 iframe,减少初始加载时间。
  2. 屏外内容的延迟加载:延迟加载广告、视频或繁重脚本等内容,直到它们出现在视图中。
  3. 无限滚动:当用户向下滚动页面时加载更多内容。
  4. 分析跟踪:跟踪元素何时进入用户参与分析视图。

基本用法

让我们深入了解 Intersection Observer API 的基本实现。

  1. 创建交叉口观察器

首先,创建 IntersectionObserver 的实例:

let observer = new IntersectionObserver((entries, observer) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      // Perform actions when the element is visible
      entry.target.src = entry.target.dataset.src;
      observer.unobserve(entry.target); // Stop observing after loading
    }
  });
}, {
  root: null, // relative to document viewport
  rootMargin: '0px', // margin around root
  threshold: 0.1 // visible amount of item shown in relation to root
});
  1. 观察目标元素

选择要观察的元素并开始观察:

document.querySelectorAll('img[data-src]').forEach(img => {
  observer.observe(img);
});
  1. 延迟加载的 HTML 结构

使用数据属性确保您的 HTML 结构支持延迟加载:

Lazy Loaded Image

高级配置

为了进行更多控制,您可以调整根边距和阈值选项:

  1. 根边距:在内容进入视口之前稍微预加载内容。
rootMargin: '100px' // preload 100px before entering viewport
  1. Threshold:确定在触发回调之前应该有多少元素可见。
threshold: [0.25, 0.5, 0.75, 1] // trigger at 25%, 50%, 75%, and 100% visibility

实际示例:延迟加载图像

这是延迟加载图像的完整示例:

  1. JavaScript 代码
document.addEventListener("DOMContentLoaded", function() {
  let lazyImages = document.querySelectorAll("img.lazy");

  let imageObserver = new IntersectionObserver((entries, observer) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        let img = entry.target;
        img.src = img.dataset.src;
        img.classList.remove("lazy");
        observer.unobserve(img);
      }
    });
  });

  lazyImages.forEach(image => {
    imageObserver.observe(image);
  });
});
  1. HTML 结构
Lazy Loaded Image

好处

  1. 缩短初始加载时间:通过仅加载视口中或视口附近的图像和内容,可以缩短初始加载时间。
  2. 改进的滚动性能:延迟加载离屏内容可以使滚动更流畅。
  3. 更好的用户体验:用户只下载他们将要查看的内容,从而获得更灵敏的体验。

结论

通过实施 Intersection Observer API,您可以显着增强网站的性能和用户体验。无论您是延迟加载图像、推迟加载繁重的脚本还是实现无限滚动,此 API 都提供了一种强大而有效的方法来管理内容可见性。立即开始使用 Intersection Observer,看看您网站性能的差异!

版本声明 本文转载于:https://dev.to/koolkamalkishor/enhancing-website-performance-with-intersection-observer-f89?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何在保持鼠标轮和箭头钥匙滚动的同时隐藏滚动条?
    如何在保持鼠标轮和箭头钥匙滚动的同时隐藏滚动条?
    在通过鼠标轮和箭头键启用滚动时隐藏scrollbars A:要完成此操作,请按照以下步骤:使用CSSS属性溢出:隐藏在目标div或身体上隐藏滚动条。 模仿鼠标轮滚动: javaScript或jquery。在函数中,修改目标div的scrolltop属性以仿真滚动。 : 绑定键盘事件(而不是Int...
    编程 发布于2025-02-07
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在java中的多个返回类型:一个误解介绍,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但是,情况确实如此吗?通用方法:拆开神秘 [方法仅具有单一的返回类型。相反,它采用机制,如钻石符号“ ”。分解方法签名: :本节定义了一个通用类型参数,E。它表示该方法接受了扩展foo类的任...
    编程 发布于2025-02-07
  • 如何使用组在MySQL中旋转数据?
    如何使用组在MySQL中旋转数据?
    在关系数据库中使用mysql组使用mysql组来调整查询结果。在这里,我们面对一个共同的挑战:使用组的组将数据从基于行的基于列的基于列的转换。通过子句以及条件汇总函数,例如总和或情况。让我们考虑以下查询: select d.data_timestamp, sum(data_id = 1 tata...
    编程 发布于2025-02-07
  • 如何检查对象是否具有Python中的特定属性?
    如何检查对象是否具有Python中的特定属性?
    方法来确定对象属性存在寻求一种方法来验证对象中特定属性的存在。考虑以下示例,其中尝试访问不确定属性会引起错误: >>> a = someClass() >>> A.property Trackback(最近的最新电话): 文件“ ”,第1行, AttributeError:SomeClass实...
    编程 发布于2025-02-07
  • 我可以在CSS中使用SVG作为伪元素吗?
    我可以在CSS中使用SVG作为伪元素吗?
    使用svgs用作pseudo-element content css content properts允许在使用元素之前或之后使用元素插入各种类型的内容伪元素,例如::之前和::之后。但是,对可以包括哪些内容有限制。可以将svgs用作pseudo-element Content?,现在可以使用s...
    编程 发布于2025-02-07
  • 如何从PHP服务器发送文件?
    如何从PHP服务器发送文件?
    将文件发送到user
    编程 发布于2025-02-07
  • 为什么尽管有效代码,为什么在PHP中捕获输入?
    为什么尽管有效代码,为什么在PHP中捕获输入?
    [2 _post ['ss'];?> 的目的是从单击提交按钮时,文本框并显示。但是,输出保持空白。当方法=“ get”无缝工作时,方法=“ post”构成问题。 检查action属性:如果您正在刷新页面,请将操作属性设置为空字符串,例如] action ='&#...
    编程 发布于2025-02-07
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    </main> <section> ,但无法使其正常工作,如您所见。任何洞察力都将不胜感激! display:grid; { position:sticky; top:1em; z-index:1 1 ; { { { pos...
    编程 发布于2025-02-07
  • 'exec()
    'exec()
    Exec对本地变量的影响: exec function,python staple,用于动态代码执行的python staple,提出一个有趣的Query:它可以在函数中更新局部变量吗? python 3 Dialemma 在Python 3中,以下代码shippet无法更新本地变量,因为人们...
    编程 发布于2025-02-07
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    在这里工作/},false); 不幸的是,答案是否。除非在Creation中存储对处理程序的引用。要解决此问题,请考虑将事件处理程序存储在中心位置,例如页面的主要对象,请考虑将事件处理程序存储在中心位置,否则无法清理匿名事件处理程序。 。这允许在需要时轻松迭代和清洁处理程序。
    编程 发布于2025-02-07
  • 如何在整个HTML文档中设计特定元素类型的第一个实例?
    如何在整个HTML文档中设计特定元素类型的第一个实例?
    [2单独使用CSS,整个HTML文档可能是一个挑战。 the:第一型伪级仅限于与其父元素中类型的第一个元素匹配。 以下CSS将使用添加的类样式的第一个段落: }
    编程 发布于2025-02-07
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    如何为JavaScript对象变量创建动态键,尝试为JavaScript对象创建动态键,使用此Syntax jsObj['key' i] = 'example' 1;将不起作用。正确的方法采用方括号:他们维持一个长度属性,该属性反映了数字属性(索引)和一个数字属性的数量。标准对象没有模仿这...
    编程 发布于2025-02-07
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    使用(1)而不是(;;)会导致无限循环的性能差异? 现代编译器,(1)和(;;)之间没有性能差异。 是如何实现这些循环的技术分析在编译器中: perl: S-> 7 8 unstack v-> 4 -e语法ok 在GCC中,两者都循环到相同的汇编代码中,如下所示:。 globl t_时 t_时...
    编程 发布于2025-02-07
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php 您的目标可能是检索“ varnum”属性值,其中提取数据的传统方法可能会使您感到困惑。 - > attributes()为$ attributeName => $ attributeValue){ echo $ attributeName,'=“',$ at...
    编程 发布于2025-02-07
  • 为什么使用Firefox后退按钮时JavaScript执行停止?
    为什么使用Firefox后退按钮时JavaScript执行停止?
    导航历史记录问题:JavaScript使用Firefox Back Back 此行为是由浏览器缓存JavaScript资源引起的。 To resolve this issue and ensure scripts execute on subsequent page visits, Firefox...
    编程 发布于2025-02-07

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3