当前位置:首页 > 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 }
}

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

相关文章

css制作图片

css制作图片

CSS 制作图片的方法 使用 background-image 属性 通过 background-image 属性可以为元素设置背景图片。这种方法适用于将图片作为背景而非内容的一部分。 .eleme…

css图片按钮制作

css图片按钮制作

使用纯CSS创建图片按钮 通过CSS的background-image属性可以轻松将图片设置为按钮背景。关键点在于设置合适的尺寸、去除默认边框并添加交互状态: .image-btn { wid…

css动画制作图片

css动画制作图片

CSS动画制作图片的方法 使用CSS动画可以为图片添加各种动态效果,提升网页的视觉吸引力。以下是几种常见的CSS动画实现方式: 关键帧动画(@keyframes) 通过定义关键帧来控制动画的各个阶段…

css3怎么制作图片

css3怎么制作图片

使用 CSS3 制作图片效果 CSS3 提供了多种方法来处理和美化图片,以下是几种常见的实现方式: 圆角效果 通过 border-radius 属性可以轻松为图片添加圆角: img { bor…

vue实现拖动图片验证

vue实现拖动图片验证

Vue 实现拖动图片验证功能 核心思路 拖动图片验证通常需要用户将图片拖动到指定区域或按正确顺序排列。实现时需要处理拖拽事件、验证逻辑和视觉反馈。 实现步骤 1. 基础组件结构 <templ…

vue实现组件循环图片

vue实现组件循环图片

Vue 实现组件循环图片的方法 在 Vue 中实现组件循环图片通常可以通过 v-for 指令结合动态数据绑定完成。以下是几种常见的实现方式: 使用静态图片路径数组 假设有一组本地图片路径,可以通过数…