当前位置:首页 > JavaScript

js实现懒加载图片

2026-03-01 07:16:00JavaScript

实现懒加载图片的基本原理

懒加载(Lazy Loading)是一种延迟加载非关键资源的技术,对于图片来说,只有当图片进入或即将进入视口(viewport)时才加载,从而减少初始页面加载时间和带宽消耗。

Intersection Observer API 实现

现代浏览器支持IntersectionObserver API,可以高效监听元素是否进入视口。

document.addEventListener('DOMContentLoaded', function() {
  const lazyImages = [].slice.call(document.querySelectorAll('img.lazy'));

  if ('IntersectionObserver' in window) {
    const lazyImageObserver = new IntersectionObserver(function(entries, observer) {
      entries.forEach(function(entry) {
        if (entry.isIntersecting) {
          const lazyImage = entry.target;
          lazyImage.src = lazyImage.dataset.src;
          lazyImage.classList.remove('lazy');
          lazyImageObserver.unobserve(lazyImage);
        }
      });
    });

    lazyImages.forEach(function(lazyImage) {
      lazyImageObserver.observe(lazyImage);
    });
  }
});

HTML 结构示例:

<img class="lazy" data-src="image.jpg" alt="Lazy loaded image">

兼容旧浏览器的实现方式

对于不支持IntersectionObserver的浏览器,可以使用滚动事件监听结合getBoundingClientRect

function lazyLoad() {
  const lazyImages = [].slice.call(document.querySelectorAll('img.lazy'));

  if ('IntersectionObserver' in window) {
    // 使用 IntersectionObserver
  } else {
    lazyImages.forEach(function(lazyImage) {
      if (isInViewport(lazyImage)) {
        lazyImage.src = lazyImage.dataset.src;
        lazyImage.classList.remove('lazy');
      }
    });
  }
}

function isInViewport(element) {
  const rect = element.getBoundingClientRect();
  return (
    rect.bottom >= 0 &&
    rect.right >= 0 &&
    rect.top <= (window.innerHeight || document.documentElement.clientHeight) &&
    rect.left <= (window.innerWidth || document.documentElement.clientWidth)
  );
}

// 初始加载
document.addEventListener('DOMContentLoaded', lazyLoad);
// 滚动时加载
window.addEventListener('scroll', lazyLoad);
window.addEventListener('resize', lazyLoad);

使用 loading="lazy" 原生属性

现代浏览器已支持原生懒加载,只需添加loading="lazy"属性。

<img src="image.jpg" loading="lazy" alt="Lazy loaded image">

性能优化建议

  • 为懒加载图片设置占位图或背景色,避免布局抖动
  • 使用widthheight属性固定图片尺寸
  • 考虑预加载即将进入视口的图片(提前100-300px)
  • 对动态加载的内容(如无限滚动)需要重新监听新图片

框架实现示例(Vue.js)

在Vue中可以通过自定义指令实现懒加载:

Vue.directive('lazy', {
  inserted: function(el) {
    const observer = new IntersectionObserver((entries) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {
          el.src = el.dataset.src;
          observer.unobserve(el);
        }
      });
    });
    observer.observe(el);
  }
});

使用方式:

js实现懒加载图片

<img v-lazy data-src="image.jpg" alt="Lazy loaded image">

标签: 加载图片
分享给朋友:

相关文章

vue实现图片闪烁

vue实现图片闪烁

实现图片闪烁效果的方法 在Vue中实现图片闪烁效果可以通过CSS动画或JavaScript动态控制样式。以下是几种常见方法: CSS动画实现 通过@keyframes定义闪烁动画,并应用到图片元素上…

vue实现图片切换

vue实现图片切换

实现图片切换的方法 使用v-for和v-bind动态绑定图片 通过v-for循环渲染图片列表,结合v-bind动态绑定图片路径,实现切换效果。 <template> <div&…

js实现图片拖动

js实现图片拖动

实现图片拖动的步骤 使用JavaScript实现图片拖动功能,可以通过HTML5的拖放API结合事件监听实现。以下是具体方法: 设置HTML结构 为图片添加draggable属性,并设置唯一ID以便…

vue实现生成图片

vue实现生成图片

Vue 实现生成图片的方法 使用 html2canvas 库 html2canvas 是一个流行的库,可以将 DOM 元素转换为 Canvas,进而生成图片。适用于 Vue 项目。 安装 html2…

vue实现图片插件

vue实现图片插件

Vue 图片插件实现方案 在 Vue 中实现图片插件通常涉及图片展示、懒加载、预览等功能。以下是几种常见的实现方式: 基础图片组件封装 创建一个可复用的图片组件,支持默认图片、加载失败处理等基础功能…

vue实现图片复制

vue实现图片复制

Vue 实现图片复制功能 在 Vue 中实现图片复制功能通常涉及两种方式:通过剪贴板 API 或借助第三方库。以下是具体实现方法: 使用 Clipboard API(现代浏览器支持) 通过 navi…