当前位置:首页 > VUE

vue实现图片滚动加载

2026-02-24 04:10:59VUE

Vue 实现图片滚动加载

监听滚动事件

通过 window.addEventListener 监听滚动事件,判断图片是否进入可视区域。在 Vue 的 mounted 钩子中绑定事件,并在 beforeDestroy 钩子中移除事件,避免内存泄漏。

mounted() {
  window.addEventListener('scroll', this.handleScroll);
},
beforeDestroy() {
  window.removeEventListener('scroll', this.handleScroll);
},
methods: {
  handleScroll() {
    const imgs = document.querySelectorAll('img[data-src]');
    imgs.forEach(img => {
      if (this.isInViewport(img)) {
        img.src = img.dataset.src;
        img.removeAttribute('data-src');
      }
    });
  },
  isInViewport(element) {
    const rect = element.getBoundingClientRect();
    return (
      rect.top <= window.innerHeight &&
      rect.bottom >= 0 &&
      rect.left <= window.innerWidth &&
      rect.right >= 0
    );
  }
}

使用 Intersection Observer API

Intersection Observer API 提供更高效的滚动监听方式,避免频繁计算。创建一个观察器实例,观察所有带有 data-src 属性的图片元素。

vue实现图片滚动加载

mounted() {
  const observer = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        const img = entry.target;
        img.src = img.dataset.src;
        observer.unobserve(img);
      }
    });
  });
  document.querySelectorAll('img[data-src]').forEach(img => {
    observer.observe(img);
  });
}

图片占位与懒加载

在 HTML 中使用 data-src 存储实际图片地址,初始时使用占位图或空白 src。通过 CSS 控制占位图样式,确保布局稳定。

vue实现图片滚动加载

<img data-src="real-image.jpg" src="placeholder.jpg" class="lazy-img">

性能优化

结合 throttledebounce 减少滚动事件触发频率。使用 requestAnimationFrame 优化滚动处理逻辑。

import { throttle } from 'lodash';
methods: {
  handleScroll: throttle(function() {
    window.requestAnimationFrame(() => {
      const imgs = document.querySelectorAll('img[data-src]');
      imgs.forEach(img => {
        if (this.isInViewport(img)) {
          img.src = img.dataset.src;
          img.removeAttribute('data-src');
        }
      });
    });
  }, 200)
}

动态加载图片资源

对于动态渲染的图片列表(如通过 v-for),在数据更新后手动触发检查逻辑。可在 updated 钩子中调用观察逻辑。

updated() {
  this.$nextTick(() => {
    const observer = new IntersectionObserver((entries) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {
          const img = entry.target;
          img.src = img.dataset.src;
          observer.unobserve(img);
        }
      });
    });
    document.querySelectorAll('img[data-src]').forEach(img => {
      observer.observe(img);
    });
  });
}

注意事项

  • 图片加载失败时,可通过 onerror 事件显示备用图。
  • 移动端需考虑 touchmove 事件兼容性。
  • 服务端渲染(SSR)场景下,需避免客户端与服务器渲染不一致的问题。

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

相关文章

vue实现图片查看

vue实现图片查看

Vue 实现图片查看功能 在 Vue 中实现图片查看功能,可以通过原生实现或使用第三方库。以下是几种常见的方法: 原生实现方式 使用 Vue 的指令和事件绑定实现基础的图片查看功能。 <te…

vue实现图片循环

vue实现图片循环

实现图片循环的基本方法 在Vue中实现图片循环通常使用v-for指令结合数组数据。以下是基础实现方式: <template> <div> <img v-fo…

vue实现图片轮播

vue实现图片轮播

Vue 实现图片轮播的方法 使用第三方库(推荐) 安装 vue-awesome-swiper 库,这是基于 Swiper 的 Vue 封装: npm install swiper vue-a…

jquery加载页面

jquery加载页面

jQuery 加载页面内容的方法 使用 .load() 方法 通过 AJAX 请求加载远程数据并插入到指定元素中。适用于加载部分页面片段。 $("#targetElement").load(…

vue实现无缝图片

vue实现无缝图片

实现无缝图片轮播的方法 在Vue中实现无缝图片轮播,可以通过以下步骤完成。这种方法利用Vue的响应式特性和CSS动画,确保图片切换平滑且无缝。 使用vue-awesome-swiper库 安装vue…

vue实现图片加载

vue实现图片加载

Vue 实现图片加载的方法 在 Vue 中实现图片加载可以通过多种方式,以下是一些常见的方法: 使用 v-bind 绑定图片路径 通过 v-bind 动态绑定图片路径,可以灵活地加载本地或远程图片。…