点击图片弹出文件选择(vue2)

做项目的时候遇到一个功能,点击选择封面图片,上传图片的功能,取消显示回选择封面图片。

 查阅一些资料后,发现主要还是使用到css样式来完成。

该代码是vue2+element-ui的代码,只用于展示思路,请勿盲目copy

代码如下:

方法一:使用readAsDataURL,转化成base64

(注意:img标签的src只能接收base64,绝对路径,相对路径,不支持其他的!!)

html代码:

<el-form-item label="文章图片" prop="cover_Img">
            <div class="articleImg">
              <img src="@/assets/images/cover.jpg" alt=""
 v-if="!this.articleForm.cover_Img">
              <img :src="cover_Img" alt="" v-else>
              <input type="file" name="" id="" accept="image/*,.pdf" @change="changeFn" />
            </div>
</el-form-item>

思路:一张图片,一个input框(type="file"),将input大小设置为和图片同等大小,然后使用

opacity: 0;将input标签透明化,使用定位,input定位在图片相同位置。这样样式这块就基本完成

css代码:

.articleImg {
  position: relative;
  width: 400px;
  height: 280px;

  img {
    width: 400px;
    height: 280px;
  }

  input {
    position: absolute;
    opacity: 0;
    top: 0;
    left: 0;
    width: 400px;
    line-height: 280px;
  }
}

js代码:


changeFn(e){
// 在input标签内@change = changeFn, 监听change事件
// e.target.files 获取到选择的文件,也就是图片 e.target.files[0]就是你选择的图片的信息

if (e.target.files.length === 0) {
        // 没有选择任何
        this.articleForm.cover_Img = ''
      } else {
//用户操作并选中,则应该让图片显示在页面上
// 这里用到FileReader 对象,
//他允许 Web 应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容
// 构造器创建一个新的对象fr
        const fr = new FileReader()

//fr将图片转化成base64格式
        fr.readAsDataURL(e.target.files[0])
// 页面加载完毕,将转化的base64传入cover_img
        fr.onload = e => {
          this.articleForm.cover_Img = e.target.result
        }
   
}

方法二: 使用URL.ctreateObjectURL来完成

  • createObjectURL返回一段带hash的url,并且一直存储在内存中,直到document触发了unload事件(例如:document close)或者执行revokeObjectURL来释放。
  • 使用createObjectURL可以节省性能并更快速,只不过需要在不使用的情况下手动释放内存
  • 大家可以看一下掘金的这篇文章!!!
  • 上面两条引用自URL.createObjectURL讲解 - 掘金

只用一个标签来完成功能:
html代码:

 <el-form-item label="文章图片" prop="cover_Img">
            <div class="articleImg">
              <img src="../../assets/images/cover.jpg" alt="" class="cover-img" ref="imgRef" />
              <input type="file" name="" id="" accept="image/*,.pdf" @change="changeFn" />
            </div>
</el-form-item>

js代码

import coverImg from '@/assets/images/cover.jpg'



export default{
//...... 此处省略

methods{

changeFn(){
 const files = e.target.files
      if (e.target.files.length === 0) {
        // 没有选择任何
        this.articleForm.cover_Img = ''
        // 标签里面可以写路径,css也可以,但是js里不能写路径,webpack打包时会把他当成了字符串解析!!!!
    // 通过setAtrribute方法来设置其属性
        this.$refs.imgRef.setAttribute('src', coverImg)
      } else {
        this.articleForm.cover_Img = files[0]
        const url = URL.createObjectURL(files[0])
        this.$refs.imgRef.setAttribute('src', url)
      }
}

}

}

思路同上:帅哥美女帮忙点个赞,点个关注,会持续更新的,感谢!!!跪谢(显然,这句才是重点啊,图穷匕见了)

上面两种方法,第二种方法性能要个更好一些,所以个人更推荐第二种方法!!

原因如下:
   URL.ctreateObjectURL可以节省性能,而且更快(同步代码),
   readAsDataURL属于异步,FileReader.readAsDataURL(file)可以获取一段data:base64的字符串,会消耗一些内存。

Vue.js 是一种用于构建用户界面的渐进式前端架,Vue 的版本分为 Vue.jsVueX,其中 Vue.js 是核心库部分,而 VueX 则主要用于状态管理。 关于您提到的“点击图片放大”功能,在 Vue 项目中实现通常涉及以下几个步骤: 1. **HTML 结构**:首先创建包含图片元素的 HTML 结构,并添加一些额外的属性以便识别点击事件,如 `@click` 绑定到某个方法。 ```html <div id="app"> <img :src="imageSrc" @click="handleImageClick" alt="Sample Image"> </div> ``` 2. **JavaScript 逻辑**:在 Vue 实例中,通过数据绑定 (`v-bind`) 将图片路径赋值给 `imageSrc` 属性,并定义一个处理图像点击的函数 `handleImageClick`。 ```javascript new Vue({ el: '#app', data: { imageSrc: 'path/to/your/image.jpg' }, methods: { handleImageClick() { // 进行图片放大的操作,这可以基于不同的需求使用不同的方法实现 this.scaleImage(); }, scaleImage() { // 可以在这里设置图片缩放比例、显示弹出层等交互效果 alert('图片已放大'); } } }); ``` 3. **样式调整**:通常需要对放大后的图片以及相关的 UI 元素进行样式调整,以提供更好的用户体验。这可以在 CSS 中完成,例如增加过渡效果,或者利用 Vue 的组件和插件进一步优化。 4. **响应性和状态管理**:由于 Vue 是基于组件化的架,因此可以根据实际需要拆分组件来管理局部状态,如当前是否处于放大状态等,以保持应用的响应性和效率。 5. **性能优化**:在处理大量图片或者高频率的操作时,要注意性能优化。例如,避免不必要的 DOM 操作、合理使用虚拟滚动技术等。 --- ### 相关问题 - 点击图片放大的 Vue 应用实例 1. **如何检测图片是否被用户拖拽而非点击**:为了区分点击与拖拽,通常在 `handleImageClick` 函数内部检查鼠标事件的 `event.button` 或者 `event.buttons` 字段,以确定用户是在单击还是双击或按下左键后移动了鼠标。 2. **如何实现动态加载大图资源**:当用户点击小图时,预加载大图资源可以提升用户体验。可以借助 Vue 生命周期钩子如 `mounted()` 或 Vue 插件如 Axios 来实现异步加载图片。 3. **如何处理图片文件过大导致的性能问题**:优化图片大小(如使用在线工具压缩图片)、采用懒加载技术(Lazily Loading Images),只在需要的时候加载图片,同时监控浏览器缓存策略,确保有效利用缓存减轻服务器负载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值