…">
当前位置:首页 > 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 实现视口检测

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格式支持

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样式增强用户体验

vue实现图片插件

.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;
}

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

相关文章

js实现图片预览

js实现图片预览

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

uniapp插件收益

uniapp插件收益

uniapp插件收益来源 uniapp插件的收益主要来自开发者将插件发布到DCloud插件市场后的销售分成。开发者可以设置插件的价格,用户购买后,开发者获得相应收入。 插件定价策略 插件的定价根据功…

js实现图片滚动

js实现图片滚动

图片滚动的实现方法 使用CSS动画实现 通过CSS的animation和@keyframes可以实现简单的图片滚动效果。这种方法适合静态图片的无缝循环滚动。 <style> .scr…

js实现图片的懒加载

js实现图片的懒加载

实现图片懒加载的基本原理 懒加载的核心思想是延迟加载非视口内的图片,当用户滚动页面时再动态加载即将进入视口的图片资源。这能显著减少页面初始加载时的网络请求和带宽消耗。 Intersection Ob…

vue实现图片复制

vue实现图片复制

Vue 实现图片复制功能 在 Vue 中实现图片复制功能通常涉及两种方式:通过剪贴板 API 或借助第三方库。以下是具体实现方法: 使用 Clipboard API(现代浏览器支持) 通过 navi…

vue实现图片拖动

vue实现图片拖动

Vue 实现图片拖动的步骤 使用 HTML5 拖放 API 在 Vue 中实现图片拖动可以利用 HTML5 的拖放 API。通过 draggable 属性设置元素可拖动,监听 dragstart、dr…