当前位置:首页 > VUE

vue实现懒加载图片

2026-01-23 01:03:38VUE

使用 Intersection Observer API

Intersection Observer API 是现代浏览器提供的原生 API,用于检测目标元素是否进入视口。在 Vue 中可以通过自定义指令或组件实现懒加载。

// 自定义指令实现
Vue.directive('lazy', {
  inserted: (el, binding) => {
    const observer = new IntersectionObserver((entries) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {
          el.src = binding.value
          observer.unobserve(el)
        }
      })
    })
    observer.observe(el)
  }
})
<!-- 使用方式 -->
<img v-lazy="imageUrl" alt="lazy image">

使用 vue-lazyload 插件

vue-lazyload 是社区成熟的懒加载解决方案,支持占位图、加载失败处理等高级功能。

安装插件:

npm install vue-lazyload

配置使用:

vue实现懒加载图片

import VueLazyload from 'vue-lazyload'

Vue.use(VueLazyload, {
  preLoad: 1.3,
  error: 'error.png',
  loading: 'loading.gif',
  attempt: 3
})

模板中使用:

<img v-lazy="imageUrl">

实现图片加载状态反馈

可以扩展自定义指令实现加载中和加载失败的视觉反馈:

vue实现懒加载图片

Vue.directive('lazy', {
  bind: (el, binding) => {
    el.dataset.src = binding.value
    el.src = 'placeholder.png'
  },
  inserted: (el) => {
    const observer = new IntersectionObserver((entries) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {
          const img = new Image()
          img.src = el.dataset.src
          img.onload = () => {
            el.src = img.src
            el.classList.add('loaded')
          }
          img.onerror = () => {
            el.src = 'error.png'
            el.classList.add('error')
          }
          observer.unobserve(el)
        }
      })
    })
    observer.observe(el)
  }
})

响应式图片处理

结合 picture 元素和 srcset 实现响应式懒加载:

<picture>
  <source 
    v-lazy="imageWebp" 
    type="image/webp"
    media="(min-width: 1200px)">
  <source 
    v-lazy="imageJpeg" 
    type="image/jpeg"
    media="(min-width: 1200px)">
  <img 
    v-lazy="fallbackImage" 
    alt="responsive lazy image">
</picture>

性能优化建议

设置适当的 rootMargin 可以提前触发加载:

const observer = new IntersectionObserver(callback, {
  rootMargin: '200px 0px'
})

对于大量图片列表,考虑使用虚拟滚动技术结合懒加载。在 Vue 3 中可以使用 Composition API 封装可复用的懒加载逻辑。

// Vue 3 Composition API
export function useLazyLoad(options) {
  const observedEl = ref(null)

  onMounted(() => {
    const observer = new IntersectionObserver((entries) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {
          // 加载逻辑
          observer.unobserve(entry.target)
        }
      })
    }, options)

    if (observedEl.value) {
      observer.observe(observedEl.value)
    }

    onUnmounted(() => observer.disconnect())
  })

  return { observedEl }
}

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

相关文章

vue 实现图片

vue 实现图片

Vue 实现图片加载与展示的方法 在 Vue 中实现图片加载和展示可以通过多种方式完成,以下是一些常见的方法: 使用 v-bind 绑定图片路径 通过 v-bind(或简写为 :)动态绑定图片的…

css网页制作漂浮图片

css网页制作漂浮图片

使用CSS实现漂浮图片效果 通过CSS的animation属性和@keyframes规则可以轻松实现图片漂浮效果。以下是几种常见实现方式: 基础漂浮动画 通过关键帧定义图片的垂直移动,模拟漂浮感:…

vue实现图片轮播

vue实现图片轮播

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

vue懒加载实现难吗

vue懒加载实现难吗

Vue懒加载的实现难度 Vue懒加载的实现并不复杂,尤其是借助现代工具和库的支持。懒加载的核心思想是按需加载资源,通常用于路由或组件,以提升页面初始加载速度。以下是常见的实现方法和注意事项: 路由懒…

vue实现图片单选

vue实现图片单选

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

vue实现滑动加载

vue实现滑动加载

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