当前位置:首页 > 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 结构示例:

js实现懒加载图片

<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"属性。

js实现懒加载图片

<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);
  }
});

使用方式:

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

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

相关文章

css3手工制作图片

css3手工制作图片

使用CSS3手工制作图片 CSS3可以通过各种属性如box-shadow、border-radius、gradient等来手工绘制简单的图形或图片效果。以下是几种常见的方法: 绘制圆形 通过bord…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div c…

h5实现图片压缩

h5实现图片压缩

使用Canvas API压缩图片 HTML5的Canvas API可以通过调整画布尺寸和图像质量来实现图片压缩。创建一个Canvas元素,将图片绘制到Canvas上,再通过toDataURL或toBl…

vue实现图片取色

vue实现图片取色

Vue 实现图片取色功能 在 Vue 中实现图片取色功能,可以通过 Canvas API 获取图片像素数据,并提取颜色信息。以下是具体实现方法: 使用 Canvas 获取图片颜色数据 创建 Canv…

vue实现图片闪烁

vue实现图片闪烁

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

vue图片实现旋转

vue图片实现旋转

使用 CSS transform 实现图片旋转 在 Vue 中可以通过 CSS 的 transform 属性实现图片旋转效果。创建一个数据属性控制旋转角度,通过绑定样式动态更新。 <t…