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 相关文章推荐
JavaScript this调用规则说明
Mar 08 Javascript
基于jquery的固定表头和列头的代码
May 03 Javascript
jquery如何改变html标签的样式(两种实现方法)
Jan 16 Javascript
浅析JS中document对象的一些重要属性
Mar 06 Javascript
jQuery DOM插入节点操作指南
Mar 03 Javascript
jQuery超赞的评分插件(8款)
Aug 20 Javascript
Layui table 组件的使用之初始化加载数据、数据刷新表格、传参数
Sep 11 Javascript
webstrom Debug 调试vue项目的方法步骤
Jul 17 Javascript
JavaScript执行环境及作用域链实例分析
Aug 01 Javascript
监听element-ui table滚动事件的方法
Mar 26 Javascript
详解利用eventemitter2实现Vue组件通信
Nov 04 Javascript
JS自定义右键菜单实现代码解析
Jul 16 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
PHP5中新增stdClass 内部保留类
2011/06/13 PHP
PHP实现异步调用方法研究与分享
2011/10/27 PHP
php+mysql删除指定编号员工信息的方法
2015/01/14 PHP
PHP http请求超时问题解决方案
2020/11/13 PHP
javascript开发随笔二 动态加载js和文件
2011/11/25 Javascript
javascript date格式化示例
2013/09/25 Javascript
Javascript字符串对象的常用方法简明版
2014/06/26 Javascript
js判断登录与否并确定跳转页面的方法
2015/01/30 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
jQuery插件Tmpl的简单使用方法
2015/04/27 Javascript
js实现表单多按钮提交action的处理方法
2015/10/24 Javascript
利用Node.js制作爬取大众点评的爬虫
2016/09/22 Javascript
JavaScript 数组的深度复制解析
2016/11/02 Javascript
详解RequireJS按需加载样式文件
2017/04/12 Javascript
AngularJS与后端php的数据交互方法
2018/08/13 Javascript
Element-ui之ElScrollBar组件滚动条的使用方法
2018/09/14 Javascript
基于vue如何发布一个npm包的方法步骤
2019/05/15 Javascript
Vue 开发必须知道的36个技巧(小结)
2019/10/09 Javascript
微信小程序个人中心的列表控件实现代码
2020/04/26 Javascript
在vue-cli创建的项目中使用sass操作
2020/08/10 Javascript
python使用正则表达式提取网页URL的方法
2015/05/26 Python
python开发之thread实现布朗运动的方法
2015/11/11 Python
解读! Python在人工智能中的作用
2017/11/14 Python
利用python3随机生成中文字符的实现方法
2017/11/24 Python
python机器学习理论与实战(四)逻辑回归
2018/01/19 Python
Python基于property实现类的特性操作示例
2018/06/15 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
2019/04/29 Python
python之mock模块基本使用方法详解
2019/06/27 Python
python的help函数如何使用
2020/06/11 Python
Python列表元素删除和remove()方法详解
2021/01/04 Python
美国鲍勃商店:Bob’s Stores
2018/07/22 全球购物
Mybag美国/加拿大:英国奢华包包和名牌手袋网站
2020/02/16 全球购物
经济学博士求职自荐信范文
2013/11/23 职场文书
咨询公司各岗位职责
2013/12/02 职场文书
影视广告专业求职信
2014/09/02 职场文书
小学四年级作文之最感动的一件事
2019/11/01 职场文书