当前位置:首页 > 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);

关键点

js如何实现懒加载

  • 使用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));
});

参数说明

js如何实现懒加载

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

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

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

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

注意事项

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

性能优化建议

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

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

分享给朋友:

相关文章

vue自动登录如何实现

vue自动登录如何实现

实现自动登录的基本思路 自动登录通常通过结合本地存储(如localStorage或cookie)和token验证机制实现。用户首次登录成功后,服务器返回的认证token会被保存在客户端,下次打开应用时…

vue如何实现两栏布局

vue如何实现两栏布局

使用Flexbox实现两栏布局 Flexbox是CSS3中强大的布局方式,可以轻松实现两栏布局。在Vue中可以直接在组件的style标签中使用。 <template> <div…

jquery 加载

jquery 加载

jQuery 加载方法 使用jQuery需要先将其库文件加载到网页中。以下是几种常见的加载方式: 通过CDN加载 推荐使用官方或公共CDN(内容分发网络)加载jQuery,速度快且可能被浏览器缓存:…

vue如何实现重新实现主题

vue如何实现重新实现主题

Vue 主题切换的实现方法 使用 CSS 变量动态切换主题 定义主题相关的 CSS 变量,通过修改这些变量实现主题切换。在根元素(如 :root)中定义默认主题的变量,在特定类名下定义其他主题的变量。…

java如何实现多线程

java如何实现多线程

实现多线程的方法 在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。此外,还可以使用ExecutorService等高级工具类来管理线程。 继承Thread类 通…

java如何实现跨平台

java如何实现跨平台

Java实现跨平台的原理 Java通过“一次编写,到处运行”的设计理念实现跨平台能力。其核心机制包括: Java虚拟机(JVM) Java源代码编译为字节码(.class文件),由JVM解释执行。不…