…">
当前位置:首页 > VUE

vue实现图片插件

2026-03-29 19:47:44VUE

Vue 图片插件实现方案

基础组件封装

创建可复用的图片组件,支持懒加载、错误处理和占位图

<template>
  <div class="image-wrapper">
    <img 
      :src="realSrc" 
      :alt="altText"
      @load="handleLoad"
      @error="handleError"
      v-if="!isError"
    >
    <div v-else class="error-placeholder">
      {{ errorText }}
    </div>
  </div>
</template>

<script>
export default {
  props: {
    src: String,
    altText: { type: String, default: 'image' },
    placeholder: { type: String, default: 'data:image/svg+xml...' },
    errorText: { type: String, default: '加载失败' }
  },
  data() {
    return {
      isError: false,
      isLoading: true
    }
  },
  computed: {
    realSrc() {
      return this.isLoading ? this.placeholder : this.src
    }
  },
  methods: {
    handleLoad() {
      this.isLoading = false
      this.$emit('loaded')
    },
    handleError() {
      this.isError = true
      this.$emit('error')
    }
  }
}
</script>

懒加载实现

结合 IntersectionObserver API 实现视口检测

vue实现图片插件

const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const img = entry.target
      img.src = img.dataset.src
      observer.unobserve(img)
    }
  })
})

export default {
  mounted() {
    observer.observe(this.$el.querySelector('img'))
  },
  beforeDestroy() {
    observer.disconnect()
  }
}

图片预览功能

通过指令实现点击放大预览

Vue.directive('preview', {
  bind(el, binding) {
    el.style.cursor = 'zoom-in'
    el.addEventListener('click', () => {
      const previewEl = document.createElement('div')
      previewEl.className = 'image-preview-overlay'
      previewEl.innerHTML = `
        <img src="${binding.value}" class="preview-image">
        <button class="close-btn">×</button>
      `
      document.body.appendChild(previewEl)

      previewEl.querySelector('.close-btn').addEventListener('click', () => {
        document.body.removeChild(previewEl)
      })
    })
  }
})

性能优化方案

实现渐进式加载和WebP格式支持

vue实现图片插件

export default {
  computed: {
    optimizedSrc() {
      const supportsWebP = document.createElement('canvas')
        .toDataURL('image/webp')
        .indexOf('data:image/webp') === 0

      const src = this.src.replace(/\.(jpg|png)$/, supportsWebP ? '.webp' : '$&')
      return `${src}?width=${this.width}&quality=${this.quality}`
    }
  }
}

插件化封装

将功能封装为可安装的Vue插件

const ImagePlugin = {
  install(Vue, options = {}) {
    Vue.component(options.componentName || 'SmartImage', ImageComponent)
    Vue.directive('preview', previewDirective)
    Vue.prototype.$image = {
      preload(urls) {
        return Promise.all(urls.map(url => new Promise((resolve) => {
          const img = new Image()
          img.src = url
          img.onload = resolve
        })))
      }
    }
  }
}

export default ImagePlugin

样式处理方案

添加必要的CSS样式增强用户体验

.image-wrapper {
  position: relative;
  overflow: hidden;
}

.image-preview-overlay {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: rgba(0,0,0,0.8);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 9999;
}

.preview-image {
  max-width: 90vw;
  max-height: 90vh;
  object-fit: contain;
}

标签: 插件图片
分享给朋友:

相关文章

css制作图片

css制作图片

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

react如何添加图片

react如何添加图片

在React中添加图片的方法 使用import导入本地图片 将图片文件放在项目目录中(如src/assets),通过import语句引入后作为src属性值: import logo from './…

js实现保存图片

js实现保存图片

使用Canvas绘制并保存图片 在HTML中创建一个Canvas元素,通过JavaScript绘制内容后转换为图片并保存。Canvas的toDataURL方法可将画布内容转为Base64编码的图片数据…

uniapp 路由插件

uniapp 路由插件

在UniApp中,路由管理通常依赖框架内置的页面跳转API,但若需要更高级的路由功能(如动态路由、拦截器等),可通过以下插件或方案实现: 路由插件推荐 uni-simple-router 专为Uni…

vue实现图片拼接

vue实现图片拼接

Vue 实现图片拼接的方法 使用 Canvas 进行图片拼接 Canvas 提供了强大的绘图能力,可以用于实现图片拼接功能。通过创建一个 Canvas 元素,将多张图片绘制到 Canvas 上,最终导…

vue实现预热插件

vue实现预热插件

Vue 预热插件实现方法 预热插件(Preheat Plugin)通常用于在 Vue 应用初始化前预加载数据或执行必要操作,提升用户体验。以下是实现方案: 插件基本结构 创建 preheat-plu…