当前位置:首页 > 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 属性的图片元素。

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 控制占位图样式,确保布局稳定。

<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 钩子中调用观察逻辑。

vue实现图片滚动加载

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)场景下,需避免客户端与服务器渲染不一致的问题。

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

相关文章

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

vue 实现异步加载

vue 实现异步加载

Vue 异步加载的实现方法 动态导入组件(懒加载) 使用 import() 语法动态导入组件,Vue 会将其转换为异步加载的组件。适用于路由或组件按需加载。 const AsyncComponent…

vue实现图片切换

vue实现图片切换

实现图片切换的方法 使用v-for和v-bind动态绑定图片 通过v-for循环渲染图片列表,结合v-bind动态绑定图片路径,实现切换效果。 <template> <div&…

vue 实现图片切换

vue 实现图片切换

实现图片切换的基本思路 在Vue中实现图片切换通常涉及数据绑定、事件处理和动态样式。核心是通过维护一个当前图片索引的状态,利用Vue的响应式特性更新显示的图片。 数据准备与绑定 定义一个数组存储图片…

react如何延迟加载

react如何延迟加载

延迟加载的实现方法 在React中实现延迟加载(Lazy Loading)通常指按需加载组件或资源,以提升初始页面加载性能。以下是几种常见方法: 使用React.lazy和Suspense Reac…

jquery图片轮播

jquery图片轮播

jQuery图片轮播实现方法 基础HTML结构 创建一个简单的HTML结构,包含轮播容器、图片列表和导航按钮。 <div class="slider"> <div class=…