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

使用 Intersection Observer 提高网站性能

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

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]删除
最新教程 更多>
  • PHP SimpleXML解析带命名空间冒号的XML方法
    PHP SimpleXML解析带命名空间冒号的XML方法
    在php 很少,请使用该限制很大,很少有很高。例如:这种技术可确保可以通过遍历XML树和使用儿童()方法()方法的XML树和切换名称空间来访问名称空间内的元素。
    编程 发布于2025-07-03
  • 您如何在Laravel Blade模板中定义变量?
    您如何在Laravel Blade模板中定义变量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配变量对于存储以后使用的数据至关重要。在使用“ {{}}”分配变量的同时,它可能并不总是最优雅的解决方案。幸运的是,Blade通过@php Directive提供了更优雅的方法: $ old_section =“...
    编程 发布于2025-07-03
  • Python中嵌套函数与闭包的区别是什么
    Python中嵌套函数与闭包的区别是什么
    嵌套函数与python 在python中的嵌套函数不被考虑闭合,因为它们不符合以下要求:不访问局部范围scliables to incling scliables在封装范围外执行范围的局部范围。 make_printer(msg): DEF打印机(): 打印(味精) ...
    编程 发布于2025-07-03
  • PHP未来:适应与创新
    PHP未来:适应与创新
    PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。 引言在编程世界中,PHP一直是网页开发的中流砥柱。作为一个从1994年就开始发展...
    编程 发布于2025-07-03
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制问题:考虑一个布局,其中我们具有与用户垂直滚动一起移动的可滚动地图div,同时与固定的固定sidebar保持一致。但是,地图的滚动无限期扩展,超过了视口的高度,阻止用户访问页面页脚。$("#map").css({ marginT...
    编程 发布于2025-07-03
  • 如何从Google API中检索最新的jQuery库?
    如何从Google API中检索最新的jQuery库?
    从Google APIS 问题中提供的jQuery URL是版本1.2.6。对于检索最新版本,以前有一种使用特定版本编号的替代方法,它是使用以下语法:获取最新版本:未压缩)While these legacy URLs still remain in use, it is recommended ...
    编程 发布于2025-07-03
  • 为什么HTML无法打印页码及解决方案
    为什么HTML无法打印页码及解决方案
    无法在html页面上打印页码? @page规则在@Media内部和外部都无济于事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: bo...
    编程 发布于2025-07-03
  • C++20 Consteval函数中模板参数能否依赖于函数参数?
    C++20 Consteval函数中模板参数能否依赖于函数参数?
    [ consteval函数和模板参数依赖于函数参数在C 17中,模板参数不能依赖一个函数参数,因为编译器仍然需要对非contexexpr futcoriations contim at contexpr function进行评估。 compile time。 C 20引入恒定函数,必须在编译时进行...
    编程 发布于2025-07-03
  • `console.log`显示修改后对象值异常的原因
    `console.log`显示修改后对象值异常的原因
    foo = [{id:1},{id:2},{id:3},{id:4},{id:id:5},],]; console.log('foo1',foo,foo.length); foo.splice(2,1); console.log('foo2', foo, foo....
    编程 发布于2025-07-03
  • 在Python中如何创建动态变量?
    在Python中如何创建动态变量?
    在Python 中,动态创建变量的功能可以是一种强大的工具,尤其是在使用复杂的数据结构或算法时,Dynamic Variable Creation的动态变量创建。 Python提供了几种创造性的方法来实现这一目标。利用dictionaries 一种有效的方法是利用字典。字典允许您动态创建密钥并分...
    编程 发布于2025-07-03
  • 为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    使用php dateTime修改月份:发现预期的行为在使用PHP的DateTime类时,添加或减去几个月可能并不总是会产生预期的结果。正如文档所警告的那样,“当心”这些操作的“不像看起来那样直观。 ; $ date->修改('1个月'); //前进1个月 echo $ date->...
    编程 发布于2025-07-03
  • 解决MySQL插入Emoji时出现的\\"字符串值错误\\"异常
    解决MySQL插入Emoji时出现的\\"字符串值错误\\"异常
    Resolving Incorrect String Value Exception When Inserting EmojiWhen attempting to insert a string containing emoji characters into a MySQL database us...
    编程 发布于2025-07-03
  • 大批
    大批
    [2 数组是对象,因此它们在JS中也具有方法。 切片(开始):在新数组中提取部分数组,而无需突变原始数组。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    编程 发布于2025-07-03
  • 如何使用Regex在PHP中有效地提取括号内的文本
    如何使用Regex在PHP中有效地提取括号内的文本
    php:在括号内提取文本在处理括号内的文本时,找到最有效的解决方案是必不可少的。一种方法是利用PHP的字符串操作函数,如下所示: 作为替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式来搜索特...
    编程 发布于2025-07-03

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

Copyright© 2022 湘ICP备2022001581号-3