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 prototype 原型链
Mar 12 Javascript
JavaScript DOM节点添加示例
Jul 16 Javascript
Node.js中的process.nextTick使用实例
Jun 25 Javascript
jQuery插件开发汇总
May 15 Javascript
Bootstrap表单布局样式源代码
Jul 04 Javascript
关于vue.js过渡css类名的理解(推荐)
Apr 10 Javascript
老生常谈js中的MVC
Jul 25 Javascript
Angular4学习笔记之根模块与Ng模块
Sep 09 Javascript
深入理解JS异步编程-Promise
Jun 03 Javascript
详解element-ui中表单验证的三种方式
Sep 18 Javascript
Javascript Dom元素获取和添加详解
Sep 24 Javascript
Vue3中toRef与toRefs的区别
Mar 24 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
Bo-Blog专用的给Windows服务器的IIS Rewrite程序
2007/08/26 PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
2013/07/05 PHP
WordPress中编写自定义存储字段的相关PHP函数解析
2015/12/25 PHP
JavaScript高级程序设计(第3版)学习笔记9 js函数(下)
2012/10/11 Javascript
Javascript中自动切换焦点实现代码
2012/12/15 Javascript
jquery实现文本框数量加减功能的例子分享
2014/05/10 Javascript
纯HTML5制作围住神经猫游戏-附源码下载
2015/08/23 Javascript
js H5 canvas投篮小游戏
2016/08/18 Javascript
jQuery判断是否存在滚动条的简单方法
2016/09/17 Javascript
JavaScript实现的CRC32函数示例
2016/11/23 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
canvas绘制一个常用的emoji表情
2017/03/30 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
2017/04/07 Javascript
深入浅析ES6 Class 中的 super 关键字
2017/10/20 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
2017/12/16 Javascript
js计算两个日期间的天数月的实例代码
2018/09/20 Javascript
NodeJS模块与ES6模块系统语法及注意点详解
2019/01/04 NodeJs
vue vant Area组件使用详解
2019/12/09 Javascript
JavaScript如何实现防止重复的网络请求的示例
2021/01/28 Javascript
Python pickle类库介绍(对象序列化和反序列化)
2014/11/21 Python
在Python中使用PIL模块处理图像的教程
2015/04/29 Python
Python 文件管理实例详解
2015/11/10 Python
对tensorflow中tf.nn.conv1d和layers.conv1d的区别详解
2020/02/11 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
mui几种页面跳转方式对比总结概括
2017/08/18 HTML / CSS
使用layui实现左侧菜单栏及动态操作tab项的方法
2020/11/10 HTML / CSS
太阳镜仓库,售价20美元或更少:Sunglass Warehouse
2016/09/28 全球购物
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
建议书的格式
2014/05/12 职场文书
购房委托书
2014/10/15 职场文书
信用卡工资证明范本
2014/10/17 职场文书
2014年药店工作总结
2014/11/20 职场文书
小浪底导游词
2015/02/12 职场文书
深入理解margin塌陷和margin合并的解决方案
2021/06/26 HTML / CSS
SpringBoot快速入门详解
2021/07/21 Java/Android
详解Python+OpenCV进行基础的图像操作
2022/02/15 Python