vue.js 实现图片本地预览 裁剪 压缩 上传功能


Posted in Javascript onMarch 01, 2018

以下代码涉及 Vue 2.0 及 ES6 语法。

目标

纯 javascrpit 实现,兼容ie9及以上浏览器,在本地做好文件格式、长宽、大小的检测,减少浏览器交互。

现实是残酷的,为了兼容Ie9 还是用上了 flash,第二篇来解释解释。

代码结构

<div id="wrap">
 <label>
  点我上传图片
  <input type='file' @change="change" ref="input">
 </label>
 <img :src="src" ref="img">
</div>
new Vue({
 el: '#wrap',
 data: {
  // 一张透明的图片
  src:'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7', 
  elInput: null
 },
 methods: {
  change(e){
   // ...
  }
 }
})

如何获取图片大小

现代浏览器中十分简单

function getSize(e){
 return e.target.files[0].size;
}

但 ie9 下暂时没有找到纯 JS 的方案。

因此,在需要判断大小时,遇到 ie9 直接绕过不去判断

如何预览本地图片

const refs = this.$refs
const elInput = refs.input
const elImg = refs.img

现代浏览器中,通过调用 FileReader 读取本地图片,将图片地址转成 Base64 格式实现预览。

function getSrc(){
 const reader = new FileReader();
 reader.onload = (e) => {
  const src = e.target.result;
  elImg.src = src;
 };
 if (elInput.files && elInput.files[0]) {
  reader.readAsDataURL(elInput.files[0]);
 }
}

但是问题又来了,ie9 并不支持 FileReader,但可以通过 ie 滤镜显示。

function getSrc(){
 elInput.select();
 elInput.blur();
 const src = document.selection.createRange().text;
 document.selection.empty();
 elImg.style.filter = `progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale',src='${src}')`;
}

滤镜中 sizingMethod='scale' 的写法是为了图片能适应内容缩放。

由于 IE9 对安全限制有所增强,实践中会遇到以下两个问题:

如果 file 控件获得焦点,则 document.selection.createRange() 拒绝访问,因此需要在 elInput.select() 后面加一句 elInput.blur() 即可。

为了让上传按钮更美观,默认给 input[type=file] 的设置了样式 visible:hidden ,这样会导致 ie9 下报错。应该会被浏览器认为欺骗用户点击,只好曲线救国。

label{
 overflow:hidden;
}
label input[type='file']{
 position:absolute;
 top:9999px;
 left:9999px;
}

如何获取图片长宽

同理,利用 ie 滤镜和 FileReader 的方案对 ie9 和非 ie9 分别实现。

ie9 的方案

参数 src 接受的是本地图片路径

let tempEl;
const getSizeIncompatible = (src, callback) => {
 if (!tempEl) {
  tempEl = document.createElement('div');
  tempEl.style.position = 'absolute';
  tempEl.style.width = '1px';
  tempEl.style.height = '1px';
  tempEl.style.left = '-9999px';
  tempEl.style.top = '-9999px';
  tempEl.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=image)';
  document.body.insertBefore(tempEl, document.body.firstChild);
 }
 tempEl.filters.item('DXImageTransform.Microsoft.AlphaImageLoader').src = src;
 callback(tempEl.offsetWidth, tempEl.offsetHeight);
};

其中 sizingMethod='image' 是为了图片显示原始大小。

非 ie9 方案

参数 src 接受的是 base64 编码后的图片路径

const getSize = (src, callback) => {
 const image = new Image();
 image.onload = () => {
  callback(image.width, image.height);
 };
 image.src = src;
};

参考

https://elemefe.github.io/ima...

总结

以上所述是小编给大家介绍的vue.js 实现图片本地预览 裁剪 压缩 上传功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
div移动 输入框不能输入的问题
Nov 19 Javascript
JavaScript类属性的访问方式详解
Feb 11 Javascript
JavaScript lastIndexOf方法入门实例(计算指定字符在字符串中最后一次出现的位置)
Oct 17 Javascript
jQuery获取与设置iframe高度的方法
Aug 01 Javascript
JS实现动态添加DOM节点和事件的方法示例
Apr 28 Javascript
JavaScript引用类型Array实例分析
Jul 24 Javascript
小程序开发基础之view视图容器
Aug 21 Javascript
简述vue状态管理模式之vuex
Aug 29 Javascript
vue 地图可视化 maptalks 篇实例代码详解
May 21 Javascript
原生js实现trigger方法示例代码
May 22 Javascript
解决vue组件props传值对象获取不到的问题
Jun 06 Javascript
JavaScript 引用类型实例详解【数组、对象、严格模式等】
May 13 Javascript
vue中使用cropperjs的方法
Mar 01 #Javascript
cropper js基于vue的图片裁剪上传功能的实现代码
Mar 01 #Javascript
Vuex中mutations与actions的区别详解
Mar 01 #Javascript
vue 实现剪裁图片并上传服务器功能
Mar 01 #Javascript
解决easyui日期时间框ie的兼容的问题
Mar 01 #Javascript
详解Immutable及 React 中实践
Mar 01 #Javascript
解决VUEX兼容IE上的报错问题
Mar 01 #Javascript
You might like
PHP中空字符串介绍0、null、empty和false之间的关系
2012/09/25 PHP
thinkPHP的Html模板标签使用方法
2012/11/13 PHP
php结合js实现点击超链接执行删除确认操作
2014/10/31 PHP
composer.lock文件的作用
2016/02/03 PHP
thinkPHP框架中layer.js的封装与使用方法示例
2019/01/18 PHP
下载文件个别浏览器文件名乱码解决办法
2013/03/19 Javascript
JavaScript中判断对象类型的几种方法总结
2013/11/11 Javascript
排序算法的javascript实现与讲解(99js手记)
2014/09/28 Javascript
angularjs的select使用及默认选中设置
2017/04/08 Javascript
JavaScript如何对图片进行黑白化
2018/04/10 Javascript
angular实现input输入监听的示例
2018/08/31 Javascript
JQuery模拟实现网页中自定义鼠标右键菜单功能
2018/11/14 jQuery
微信小程序的开发范式BeautyWe.js入门详解
2019/07/10 Javascript
uni-app如何实现增量更新功能
2020/01/03 Javascript
Vue基于iview table展示图片实现点击放大
2020/08/05 Javascript
jQuery实现查看图片功能
2020/12/01 jQuery
详解Vue中的自定义指令
2020/12/07 Vue.js
[01:21:36]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[00:20]TI9观赛名额抽取Ⅱ
2019/07/24 DOTA
[01:30:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第二场 2月2日
2021/03/11 DOTA
用python实现批量重命名文件的代码
2012/05/25 Python
Python中获取对象信息的方法
2015/04/27 Python
python字符串str和字节数组相互转化方法
2017/03/18 Python
Python中列表与元组的乘法操作示例
2018/02/10 Python
python基础学习之如何对元组各个元素进行命名详解
2018/07/12 Python
详解用Python练习画个美队盾牌
2019/03/23 Python
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
英国排名第一的宠物店:PetPlanet
2020/02/02 全球购物
数据管理员的自我评价分享
2013/11/15 职场文书
网络事业创业计划书范文
2014/01/09 职场文书
制冷与空调专业毕业生推荐信
2014/07/07 职场文书
人事经理岗位职责范本
2014/08/04 职场文书
2015公司年度工作总结
2015/05/14 职场文书
中国文明网2015年“向国旗敬礼”活动网上签名寄语
2015/09/24 职场文书
python关于集合的知识案例详解
2021/05/30 Python
Java中使用Filter过滤器的方法
2021/06/28 Java/Android