当前位置:首页 > 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" 原生属性作为降级方案(需注意浏览器兼容性)。

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

相关文章

react如何添加图片

react如何添加图片

在React中添加图片的方法 使用import导入本地图片 将图片文件放在项目目录中(如src/assets),通过import语句引入后作为src属性值: import logo from './…

vue实现滑动加载

vue实现滑动加载

滑动加载的实现思路 滑动加载通常通过监听滚动事件,判断是否滚动到页面底部来触发数据加载。Vue中可以通过结合v-for、@scroll事件和计算属性实现。 基础实现方法 监听滚动事件 在包含滚动区域…

js实现图片滚动

js实现图片滚动

图片滚动的实现方法 使用CSS动画实现 通过CSS的animation和@keyframes可以实现简单的图片滚动效果。这种方法适合静态图片的无缝循环滚动。 <style> .scr…

js实现图片拖动

js实现图片拖动

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

vue动态加载实现

vue动态加载实现

Vue动态加载实现方法 动态加载在Vue中通常指按需加载组件或资源,以下是几种常见实现方式: 使用异步组件 通过defineAsyncComponent或动态import()语法实现组件按需加载:…

vue实现同步加载

vue实现同步加载

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