当前位置:首页 > 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如何实现重新实现主题

动态主题切换的实现 在Vue中实现动态主题切换,通常需要结合CSS变量和状态管理。通过修改根元素的CSS变量值,可以全局改变应用的主题样式。 定义主题相关的CSS变量在根元素中: :root {…

vue如何实现单选

vue如何实现单选

Vue 实现单选的方法 在 Vue 中实现单选功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 v-model 绑定单选按钮 通过 v-model 绑定到同一个变量,确保同一时间只有一个选…

vue如何实现两栏布局

vue如何实现两栏布局

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

php如何实现静态化

php如何实现静态化

PHP 实现静态化的方法 使用 ob_start() 和 ob_get_contents() 利用 PHP 的输出缓冲功能捕获动态生成的页面内容,将其保存为静态文件。这种方法适用于内容不频繁变化的页面…

vue项目如何实现

vue项目如何实现

安装Vue.js 通过npm或yarn安装Vue.js。确保Node.js环境已配置完成。 npm install vue # 或 yarn add vue 创建Vue项目 使用Vue CLI工具快…

java如何实现跨平台

java如何实现跨平台

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