当前位置:首页 > 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 Router 配置: const routes = [ { path: '/hom…

js实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('image…

vue实现加载

vue实现加载

Vue 实现加载功能的方法 使用 v-if 或 v-show 控制加载状态 在模板中通过 v-if 或 v-show 控制加载动画的显示与隐藏。v-if 会完全移除 DOM 元素,而 v-show 仅…

jquery加载

jquery加载

jQuery 加载方法 使用 CDN 加载 jQuery 推荐通过公共 CDN(如 Google、Microsoft 或 jQuery 官方)加载,速度快且可能已被浏览器缓存。 <scr…

uniapp实现懒加载

uniapp实现懒加载

uniapp实现懒加载的方法 在uniapp中实现懒加载可以通过多种方式,以下是几种常见的方法: 使用uni.lazyLoad组件 uniapp提供了内置的懒加载组件,适用于图片等资源的懒加载。在…

H5图片实现地图

H5图片实现地图

实现H5图片地图的方法 在H5中实现图片地图功能,可以通过以下方式完成。图片地图允许用户在图片的特定区域点击,触发不同的交互效果。 使用HTML的<map>和<area>标…