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 相关文章推荐
关于恒等于(===)和非恒等于(!==)
Aug 20 Javascript
JS与框架页的操作代码
Jan 17 Javascript
EasySlider 基于jQuery功能强大简单易用的滑动门插件
Jun 11 Javascript
setInterval与clearInterval的使用示例代码
Jan 28 Javascript
浅析JS异步加载进度条
May 05 Javascript
JavaScript cookie详解及简单实例应用
Dec 31 Javascript
js仿新浪微博消息发布功能
Feb 17 Javascript
bootstrap 点击空白处popover弹出框隐藏实例
Jan 24 Javascript
fullpage.js最后一屏滚动方式
Feb 06 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
Sep 04 Javascript
加快Vue项目的开发速度的方法
Dec 12 Javascript
localstorage实现带过期时间的缓存功能
Jun 28 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
destoon实现调用图文新闻的方法
2014/08/21 PHP
Yii针对添加行的增删改查操作示例
2016/10/18 PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
2017/10/26 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
28个JS验证函数收集
2010/03/02 Javascript
基于promise.js实现nodejs的promises库
2014/07/06 NodeJs
JS中处理时间之setUTCMinutes()方法的使用
2015/06/12 Javascript
15位和18位身份证JS校验的简单实例
2016/07/18 Javascript
javascript跨域请求包装函数与用法示例
2016/11/03 Javascript
jQuery输入框密码的显示隐藏【代码分享】
2017/04/29 jQuery
Es6 Generator函数详细解析
2018/02/24 Javascript
JS实现移动端触屏拖拽功能
2018/07/31 Javascript
vue项目打包之后背景样式丢失的解决方案
2019/01/17 Javascript
layui的layedit富文本赋值方法
2019/09/18 Javascript
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
通过实例了解JS执行上下文运行原理
2020/06/17 Javascript
手把手带你搭建一个node cli的方法示例
2020/08/07 Javascript
浅析 Vue 3.0 的组装式 API(一)
2020/08/31 Javascript
学习python处理python编码问题
2011/03/13 Python
django 创建过滤器的实例详解
2017/08/14 Python
python+opencv实现的简单人脸识别代码示例
2017/11/14 Python
Python虚拟环境项目实例
2017/11/20 Python
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
2018/03/22 Python
pandas读取csv文件,分隔符参数sep的实例
2018/12/12 Python
python版百度语音识别功能
2019/07/09 Python
Python数据可视化实现正态分布(高斯分布)
2019/08/21 Python
python pygame实现球球大作战
2019/11/25 Python
python实现图像外边界跟踪操作
2020/07/13 Python
详解pandas映射与数据转换
2021/01/22 Python
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
介绍一下SQL注入攻击的种类和防范手段
2012/02/18 面试题
装饰资料员岗位职责
2013/12/30 职场文书
ktv总经理岗位职责
2014/02/17 职场文书
2014年元旦感言
2014/03/06 职场文书
幼儿园老师新年寄语2015
2014/12/08 职场文书
如何用JavaScipt测网速
2021/05/09 Javascript