摘要:在逛b站时看到一个上传图片的效果,想着可以自己也做一个,因为原作者是用原生js写的,那我不如就用vue写好了,当然,是一个很小的东西,在HTML文件直接引用vue就好了,详细步骤如下~

本文分享自华为云社区《vue实现上传图片并预览效果》,原文作者:北极光之夜。 。

一.话不多,先看效果: 

大家好,(๑╹◡╹)ノ” 这是我在逛b站时看到一个上传图片的效果,想着可以自己也做一个,因为原作者是用原生js写的,那我不如就用vue写好了,当然,是一个很小的东西,在HTML文件直接引用vue就好了,详细步骤如下~

二.详细实现步骤:

1.先定义基本标签:

先不管标签里面的vue指令,先定义基本HTML标签。

 <div id="app"><div class="upload">           <input type="file" id="file" multiple @change="upload"></div><ul class="view"><li><img src="./img/52.jpg"><div class="delect" title="删不了我" @click="noDelect">×</div></li><li v-for="(item,index) in list" :key="index" ><img :src="item"><div class="delect" @click="delect(index)">×</div></li>     </ul></div>

.upload是上传图片盒子,里面有一个input类型为file的标签;
.view是放图片的大盒子,每个小 li 是一张图片,默认有一张图,还有一个小 li 是为了v-for渲染的;
delect是删除图片按钮;

2.开始定义基本css样式:

此为全局与底层盒子样式。

 *{margin: 0;padding: 0;box-sizing: border-box;}#app{width: 900px;background-color: rgb(241, 241, 241);margin: 50px auto;} 

3. .view的样式:

   .view{display: flex;justify-content: space-around;flex-wrap: wrap;align-items: space-around;}

display: flex; flex布局;
justify-content:space-around;主轴每个子项目间隔对齐。
flex-warp:warp;换行。
align-items:space-around:交叉轴每个子项目间隔对齐。

4. 图片的样式:

 .view > li{width: 200px;height: 120px;background-color: rgba(54, 194, 35,0.1);list-style: none;margin: 20px;position: relative;}.view > li > img{width: 100%;height: 100%;object-fit: cover;}

object-fit:cover; 图片保持原有比例,不拉伸。

5. .deldect按钮的样式:

 .delect{position: absolute;right: 0;top: 0;width: 20px;height: 20px;text-align: center;line-height: 20px;font-size: 15px;background-color: rgba(255, 255, 255,0.5);user-select: none;cursor: pointer;opacity: 0;}.delect:hover{background-color: rgba(31, 31, 31, 0.5);color: white;}.view>li:hover .delect{opacity: 1;}

user-select: none; 文本不可选中;
opacity:0; 透明度;

6.更改input标签的样式:

通过在input标签外套一个div,把input标签设为透明,然后给div设置想要的样式。可给div设置一个双伪类元素,填上文字与样式。

 .upload{width: 80px;height: 20px;background-color: rgba(135, 206, 235,0.2);border: 1px dashed black;border-radius: 5px;position: relative;}.upload:hover{background-color: rgba(135, 206, 235,1);}.upload::before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: '上传图片';font-size: 13px;text-align: center;font-family: 'fangsong';line-height: 20px;user-select: none;}#file{width: 100%;height: 100%;opacity: 0;}

7.给我们的单页面引入vue和声明vue实例对象:

 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script><script>var app = new Vue({el:"#app",data: {},methods: {}})     </script>

8. 给input标签绑定一个change事件,同时声明一个list数组:

list数组会存放每张图的地址。

 <input type="file" id="file" multiple @change="upload">
data: {list:[]},

9. 定义upload方法,实现把选择的全部图片地址存放到list数组:

upload函数在methods:{ } 里声明。

   upload(e){//e.target指向事件执行时鼠标所点击区域的那个元素,那么为input的标签,// 可以输出 e.target.files 看看,这个files对象保存着选中的所有的图片的信息。console.log(e.target.files)//------------------------------------------------------     // 既然如此,循环这个files对象,用for of 循环,     for(let item of e.target.files){//正则表达式,判断每个元素的type属性是否为图片形式,如图if (!/image\/\w+/.test(item.type)) {// 提示只能是图片,returnalert("只能选择图片");return;} // 保存下当前 this ,就是vue实例var _this = this;//  创建一个FileReader()对象,它里面有个readAsDataURL方法let reader = new FileReader();// readAsDataURL方法可以将上传的图片格式转为base64,然后在存入到图片路径, //这样就可以上传电脑任意位置的图片                            reader.readAsDataURL(item);//文件读取成功完成时触发reader.addEventListener('load',function(){//  reader.result返回文件的内容。//只有在读取操作完成后,此属性才有效,返回的数据的格式取决于是使用哪种读取方法来执行读取操作的。//给数组添加这个文件也就是图片的内容_this.list.push(this.result)})}//------------------------------------------------------------},

10.页面显示数组的每张图片:

           <li v-for="(item,index) in list" :key="index" ><img :src="item"><div class="delect" @click="delect(index)">×</div></li>    

给小 li 绑定v-for循环,循环 list 数组,每个元素其实就是一个地址,绑定到图片的 src 属性上。

index是给数组的每个元素设置一个索引值。可以理解成数组下标嘛。

11. 定义删除图片的方法:

先给做删除的盒子绑定一个点击事件,同时传入index索引值,好知道是点击了哪张图:

 <div class="delect" @click="delect(index)">×</div>

用splice方法删除list数组里对应的数据就好。

       delect(index){console.log(index);this.list.splice(index,1);                    },// 这是默认图片的方法,弹出默认图片无法删除noDelect(){alert('默认图片无法删除。')}}

三.源码分享:

下载地址如下: https://gitee.com/aurora-in-winter/blog/tree/master/

点击关注,第一时间了解华为云新鲜技术~

带你用VUE实现上传图片效果相关推荐

  1. 手摸手,带你用vue撸后台 系列一(基础篇) - 掘金

    完整项目地址:vue-element-admin 系列文章: 手摸手,带你用 vue 撸后台 系列一(基础篇) 手摸手,带你用 vue 撸后台 系列二(登录权限篇) 手摸手,带你用 vue 撸后台 系 ...

  2. vue+elementUI上传图片

    vue+elementUI上传图片笔记总结 有裁剪框 上传图片组件: <template slot="iconForm"><el-uploadclass=&quo ...

  3. 酸狗带你了解Vue.js

    带你了解Vue.js 今天酸狗就带着大家了解一个国内最火的前端框架Vue.js.希望对大家Vue的了解有帮助! 文章目录 带你了解Vue.js 前言 一.框架和库的区别 二.前端三大主流框架 三.什么 ...

  4. vue里面怎么删除部分页面_基于VUE选择上传图片并页面显示(图片可删除)

    基于VUE选择上传图片并在页面显示,图片可删除,具体内容如下 demo例子: 依赖文件: HTML文本内容: 相关照片 JS文本内容: /** * 从 file 域获取 本地图片 url */ fun ...

  5. java滑杆和进度条_HTML5实现自带进度条和滑块滑杆效果

    一.H5自带进度条 进度:% 运用progress标签,设置好min和max数值就好.可以用value获取其中的进度值 function staticProgress () { var pg = do ...

  6. css聊天气派,css如何实现小尖角聊天对话框带尖角的说话泡泡效果

    css如何实现小尖角聊天对话框带尖角的说话泡泡效果 发布时间:2021-03-20 09:44:20 来源:亿速云 阅读:58 作者:小新 这篇文章主要介绍了css如何实现小尖角聊天对话框带尖角的说话 ...

  7. 手把手带你用viewpager实现gallary效果,外加无限循环,自动轮播

    手把手带你用viewpager实现gallary效果,外加无限循环,自动轮播 效果图:图很丑,各位看官且按需更改. 主要功能: ①Gallary样式 ②无限轮播 ③自动轮播和手势操作间冲突解决 提前说 ...

  8. Vue+Element-UI 上传图片,打开相机,相册

    Vue+Element-UI 上传图片,打开相机,相册 Element-UI中提供的Upload组件,是用来上传文件用的,并没有单独的纯用来上传图片的组件,所以,在部分浏览器(手机)中,打开后会发现是 ...

  9. vue+element上传图片到阿里云(可直接运行domo)

    vue+element上传图片到阿里云,OSS(最简单,最详细,可在线运行domo),不要走弯路了 支持格式 jpeg,jpg,png,webp,gif =可限制大小== 4M 安装ali-oss n ...

最新文章

  1. ThinkPHP + Ajax 实现2级联动下拉菜单
  2. javascript底层练习
  3. 域传送漏洞(vulhub)
  4. vue中$router以及$route的使用
  5. 27muduo_net库源码分析(三)
  6. 《Effective Python 2nd》 读书笔记
  7. DxO FilmPack 5详细教程:对照片进行艺术渲染,使其具有专业电影的色彩和颗粒感
  8. KNN——K nearest neighbor
  9. 1.React学习笔记----基础模板创建+远程仓库建立
  10. STM32入门:STM32F401CDU6库函数工程文件搭建
  11. 维基百科(Wikipedia)网址
  12. 【Sql】sql server2008附加数据库:错误9003
  13. 交换机 路由器 DNS服务器基础实验
  14. 如何从菜鸟程序员成长为高手
  15. 编解码学习笔记(七) 微软Windows Media系列
  16. 哪些产品要做UV老化测试?
  17. LeetCode解析------111. 二叉树的最小深度-深度优先搜索
  18. STM32F407ZET6的RTC闹钟二次设置笔记
  19. 华为云·云享专家李万龙: IoT 梦想,从0到1的实现
  20. docker-compose:快速搭建didi开源测试平台AgileTC

热门文章

  1. 智慧电厂:打破电厂传统思路
  2. 基于单目相机的2D地图构建
  3. 1106: 找第K位数
  4. 711页的黄海广老师的《机器学习》课件合集.pdf
  5. [C++]简单的十六进制转十进制
  6. 读 程浩的《站在两个世界的边缘》
  7. Turtlebot移动机器人gazebo仿真及自动导航(详细级)
  8. 抽基类+MVP+Retrofit+Rxjava+适配器+Recyclerview展示数据
  9. OSPF路由协议原理
  10. 《Python数据可视化之Matplotlib与Pyecharts》之旭日图