当前位置:首页 > VUE

vue2实现图片懒加载

2026-03-27 06:03:39VUE

使用 Intersection Observer API

Intersection Observer API 是浏览器原生支持的 API,用于监听目标元素与视口的交叉状态。创建一个观察器实例,配置回调函数和选项(如阈值、根元素等)。当目标图片进入视口时,将 data-src 属性替换为 src 属性。

// 创建观察器实例
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const img = entry.target;
      img.src = img.dataset.src;
      observer.unobserve(img);
    }
  });
}, {
  rootMargin: '0px 0px 100px 0px' // 提前100px触发加载
});

// 对所有懒加载图片进行观察
document.querySelectorAll('img[data-src]').forEach(img => {
  observer.observe(img);
});

自定义指令实现

Vue 2 支持自定义指令,可以封装懒加载逻辑为全局指令 v-lazy。在指令的 inserted 钩子中绑定观察器,当元素进入视口时动态修改 src

// main.js 或单独指令文件
Vue.directive('lazy', {
  inserted: (el, binding) => {
    const observer = new IntersectionObserver(([entry]) => {
      if (entry.isIntersecting) {
        el.src = binding.value;
        observer.unobserve(el);
      }
    });
    observer.observe(el);
  }
});

// 模板中使用
<img v-lazy="imageUrl" alt="Lazy Image">

兼容旧浏览器的滚动监听

对于不支持 Intersection Observer 的浏览器(如 IE),可通过监听滚动事件实现。计算图片位置与视口的关系,手动触发加载。

function lazyLoad() {
  const images = document.querySelectorAll('img[data-src]');
  images.forEach(img => {
    const rect = img.getBoundingClientRect();
    if (rect.top < window.innerHeight + 100) {
      img.src = img.dataset.src;
    }
  });
}

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

使用第三方库

现有库如 vue-lazyload 提供了开箱即用的解决方案,支持占位图、错误处理等高级功能。安装后通过 Vue 插件形式集成。

vue2实现图片懒加载

npm install vue-lazyload
import VueLazyload from 'vue-lazyload';
Vue.use(VueLazyload, {
  preLoad: 1.3, // 预加载比例
  error: 'error.png', // 错误占位图
  loading: 'loading.gif', // 加载中占位图
  attempt: 3 // 重试次数
});

// 模板中使用
<img v-lazy="imageUrl" alt="Lazy Image">

性能优化建议

设置合适的触发阈值(如 rootMargin)避免频繁计算。对已加载的图片取消观察(unobserve)。使用 loading="lazy" 原生属性作为降级方案(需注意浏览器兼容性)。

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

相关文章

vue实现图片单选

vue实现图片单选

Vue 实现图片单选功能 在 Vue 中实现图片单选功能可以通过多种方式完成,以下是两种常见的实现方法: 方法一:使用 v-model 和单选按钮 通过将单选按钮与图片绑定,利用 v-mod…

vue实现展示图片

vue实现展示图片

在 Vue 中展示图片的方法 静态图片展示 静态图片通常存放在项目的 public 或 assets 目录下。使用 img 标签直接引用。 <template> <img sr…

js实现图片加载

js实现图片加载

使用Image对象加载图片 通过JavaScript的Image对象可以动态加载图片,适用于需要预加载或动态插入图片的场景。 const img = new Image(); img.src =…

vue实现同步加载

vue实现同步加载

Vue 实现同步加载的方法 在 Vue 中,通常推荐使用异步加载(如 async/await 或 Promise)来优化性能,但在某些场景下可能需要同步加载。以下是几种实现同步加载的方法: 使用 c…

vue实现打印图片

vue实现打印图片

实现图片打印的基本思路 在Vue中实现图片打印功能,通常需要借助浏览器原生的打印API以及CSS控制打印样式。核心步骤包括创建一个隐藏的打印容器,将图片放入其中,然后触发浏览器的打印对话框。 创建打…

vue实现预览图片

vue实现预览图片

实现图片预览功能 在Vue中实现图片预览功能可以通过多种方式完成,以下是几种常见的方法: 使用原生HTML5的dialog元素 通过HTML5的dialog元素可以快速实现模态框效果,结合图片展示实…