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窗口宽高,鼠标位置,滚动高度(详细解析)
Nov 18 Javascript
jquery创建表格(自动增加表格)代码分享
Dec 25 Javascript
js/jQuery简单实现选项卡功能
Jan 02 Javascript
JavaScript使用简单正则表达式的数据验证功能示例
Jan 13 Javascript
基于Vue实现后台系统权限控制的示例代码
Aug 29 Javascript
Angular HMR(热模块替换)功能实现方法
Apr 04 Javascript
React Native基础入门之调试React Native应用的一小步
Jul 02 Javascript
微信小程序实现获取准确的腾讯定位地址功能示例
Mar 27 Javascript
javascript实现5秒倒计时并跳转功能
Jun 20 Javascript
Vue 中可以定义组件模版的几种方式
Aug 06 Javascript
原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
Feb 23 Javascript
vue 递归组件的简单使用示例
Jan 14 Vue.js
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+javascript实现的动态显示服务器运行程序进度条功能示例
2017/08/07 PHP
PHP中“=&gt;
2019/03/01 PHP
JQuery jsonp 使用示例代码
2009/08/12 Javascript
jquery bind(click)传参让列表中每行绑定一个事件
2014/08/06 Javascript
JavaScript中的Primitive对象封装介绍
2014/12/31 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
2015/02/17 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
使用jquery.qrcode.min.js实现中文转化二维码
2016/03/11 Javascript
微信小程序开发之录音机 音频播放 动画实例 (真机可用)
2016/12/08 Javascript
uploader秒传图片到服务器完整代码
2017/04/22 Javascript
原生js封装添加class,删除class的实例
2017/11/06 Javascript
原生JS实现简单的无缝自动轮播效果
2018/09/26 Javascript
H5+C3+JS实现双人对战五子棋游戏(UI篇)
2020/05/28 Javascript
element-ui upload组件多文件上传的示例代码
2018/10/17 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
2019/09/18 Javascript
vue实现商城秒杀倒计时功能
2019/12/12 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
[52:03]Secret vs VG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python使用PyGame绘制图像并保存为图片文件的方法
2015/04/24 Python
python fabric实现远程部署
2017/01/05 Python
机器学习python实战之决策树
2017/11/01 Python
对Python多线程读写文件加锁的实例详解
2019/01/14 Python
pandas 层次化索引的实现方法
2019/07/06 Python
自定义django admin model表单提交的例子
2019/08/23 Python
Python编程快速上手——疯狂填词程序实现方法分析
2020/02/29 Python
CHARLES & KEITH英国官网:新加坡时尚品牌
2018/07/04 全球购物
生日宴会答谢词
2014/01/09 职场文书
不打扫卫生检讨书
2014/02/12 职场文书
教师节促销活动方案
2014/02/14 职场文书
财务担保书范文
2014/04/02 职场文书
我有一个梦想演讲稿
2014/05/05 职场文书
2014年工程部工作总结
2014/11/25 职场文书
大学生个人简历自荐信
2015/03/06 职场文书
期中考试后的感想
2015/08/07 职场文书
环保主题班会教案
2015/08/13 职场文书
oracle索引总结
2021/09/25 Oracle