当前位置:首页 > JavaScript

js如何实现懒加载

2026-03-01 07:20:28JavaScript

实现懒加载的基本原理

懒加载的核心思想是延迟加载非关键资源(如图片、视频等),直到它们进入或即将进入视口(viewport)时才加载。JavaScript通过监听滚动事件或使用Intersection Observer API实现。

方法一:基于滚动事件监听

通过监听页面滚动事件,计算目标元素与视口的相对位置,触发加载逻辑。

function lazyLoad() {
  const lazyImages = document.querySelectorAll('img[data-src]');
  lazyImages.forEach(img => {
    const rect = img.getBoundingClientRect();
    if (rect.top < window.innerHeight && rect.bottom >= 0) {
      img.src = img.dataset.src;
      img.removeAttribute('data-src');
    }
  });
}

// 初始加载 + 滚动事件监听
window.addEventListener('load', lazyLoad);
window.addEventListener('scroll', lazyLoad);
window.addEventListener('resize', lazyLoad);

关键点

  • 使用data-src存储真实URL,默认src为空或占位图。
  • getBoundingClientRect()获取元素相对于视口的位置。
  • 需结合防抖(debounce)优化性能。

方法二:使用Intersection Observer API

现代浏览器支持的API,性能更优,无需手动计算滚动位置。

document.addEventListener('DOMContentLoaded', () => {
  const lazyTargets = document.querySelectorAll('[data-src]');
  const observer = new IntersectionObserver((entries, observer) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        const target = entry.target;
        if (target.tagName === 'IMG') {
          target.src = target.dataset.src;
        } else {
          target.style.backgroundImage = `url(${target.dataset.src})`;
        }
        observer.unobserve(target);
      }
    });
  }, { threshold: 0.1 });

  lazyTargets.forEach(target => observer.observe(target));
});

参数说明

  • threshold: 0.1表示当元素10%进入视口时触发回调。
  • 支持图片、背景图等多种资源的懒加载。

方法三:原生HTML的loading="lazy"

现代浏览器(Chrome 77+)支持原生懒加载,无需JavaScript:

<img src="image.jpg" loading="lazy" alt="示例">

注意事项

  • 仅适用于<img><iframe>
  • 兼容性需验证(可通过'loading' in HTMLImageElement.prototype检测)。

性能优化建议

  • 占位图:使用低分辨率占位图避免布局偏移。
  • 预加载相邻资源:通过调整threshold或提前加载视口附近的资源。
  • 兼容性处理:对旧浏览器回滚到滚动事件方案。

通过上述方法可实现高效懒加载,显著提升页面加载性能。

js如何实现懒加载

分享给朋友:

相关文章

如何实现vue表格联动

如何实现vue表格联动

实现 Vue 表格联动的方法 数据绑定与响应式更新 通过 Vue 的响应式特性,将多个表格的数据绑定到同一个数据源或计算属性。当一个表格的数据发生变化时,另一个表格会自动更新。例如: data()…

vue如何实现曲线图

vue如何实现曲线图

使用 ECharts 实现曲线图 在 Vue 项目中安装 ECharts 依赖: npm install echarts --save 引入 ECharts 并创建基础图表组件: <temp…

js双击事件如何实现

js双击事件如何实现

实现双击事件的方法 在JavaScript中,可以通过监听dblclick事件或手动检测两次点击的时间间隔来实现双击事件。以下是几种常见的方法: 使用原生dblclick事件 element.ad…

vue如何实现单选

vue如何实现单选

使用原生 HTML 单选按钮 在 Vue 中可以直接使用 HTML 的原生单选按钮,通过 v-model 绑定数据。 <template> <div>…

react如何实现插槽

react如何实现插槽

React 实现插槽的方法 React 本身没有直接提供类似 Vue 的插槽(slot)概念,但可以通过以下几种方式实现类似功能: 使用 props.children React 组件可以通过 pr…

java如何实现异步

java如何实现异步

Java实现异步的方法 Java中实现异步编程可以通过多种方式,每种方式适用于不同的场景和需求。以下是常见的实现方法: 使用Thread类 创建新线程执行异步任务是最基础的方式。通过继承Threa…