举例说明图片懒加载的方案有哪些?

图片懒加载的方案有很多,以下列举几种常见的方案,并分别解释其原理和优缺点:

1. 基于 Intersection Observer API 的方案:

  • 原理: 利用 Intersection Observer API 监听目标元素是否进入视口(viewport)。当目标元素进入视口时,触发回调函数,将图片的真实 srcsrcset 属性赋值,从而加载图片。

  • 代码示例:

const images = document.querySelectorAll('img.lazy');

const observer = new IntersectionObserver((entries, observer) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const img = entry.target;
      img.src = img.dataset.src; // data-src 存储图片真实地址
      img.onload = () => {
        img.classList.remove('lazy'); // 可选:移除懒加载类名
      };
      observer.unobserve(img); // 停止观察已加载的图片
    }
  });
}, {
  rootMargin: '0px 0px 50px 0px' // 可选:提前加载,例如在元素距离视口 50px 时就开始加载
});

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

// HTML 结构示例
//<img class="lazy" data-src="image.jpg" src="placeholder.jpg" alt="My Image">
  • 优点: 性能优秀,兼容性好,API 简洁易用。
  • 缺点: 需要一定的 JavaScript 代码实现。

2. 基于 scroll 事件监听的方案 (不推荐):

  • 原理: 监听页面的 scroll 事件,在事件回调函数中计算每个图片的位置,判断其是否进入视口。如果进入视口,则加载图片。

  • 缺点: 性能较差,scroll 事件触发频率很高,频繁计算位置和判断会导致页面卡顿。不推荐使用。

3. 使用 <picture> 元素和 srcset 属性结合 sizes 属性:

  • 原理: 利用 <picture> 元素和 srcset 属性,浏览器会根据当前视口大小和网络状况选择最合适的图片加载。 sizes 属性定义了不同视口宽度下图片所占的宽度,浏览器会根据这个信息选择合适的图片源。

  • 代码示例:

<picture>
  <source media="(min-width: 800px)" srcset="large.jpg">
  <source media="(min-width: 400px)" srcset="medium.jpg">
  <img src="small.jpg" alt="My Image">
</picture>
  • 优点: 浏览器原生支持,无需 JavaScript 代码。可以根据不同的屏幕大小和网络状况加载不同的图片,提升用户体验。
  • 缺点: 不能实现真正的懒加载,只是根据视口大小选择合适的图片。

4. 使用 JavaScript 插件:

  • 原理: 一些 JavaScript 插件封装了懒加载的逻辑,例如 lazysizeslozad.js 等。这些插件通常使用 Intersection Observer API 或其他技术实现懒加载。

  • 优点: 使用方便,功能丰富,通常性能优化较好。

  • 缺点: 需要引入额外的 JavaScript 文件。

最佳实践:

  • 使用 Intersection Observer API 是目前最推荐的懒加载方案,性能好,兼容性佳。
  • 使用占位图 (placeholder) 提升用户体验,例如使用低质量的模糊图片或纯色背景。
  • 结合 <picture> 元素和 srcset 属性,可以根据不同的屏幕大小加载不同的图片,进一步优化性能。

选择哪种方案取决于项目的具体需求和技术栈。 对于大多数项目来说,使用 Intersection Observer API 或者一个轻量级的 JavaScript 插件是最佳选择。

posted @   王铁柱6  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示