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 相关文章推荐
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
Feb 03 Javascript
jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)
May 23 Javascript
js制作的鼠标悬浮时产生的下拉框效果
Oct 27 Javascript
form表单只提交数据而不进行页面跳转的解决方案
Sep 18 Javascript
jQuery实现可收缩展开的级联菜单实例代码
Nov 27 Javascript
JavaScript及jquey实现多个数组的合并操作
Sep 06 Javascript
使用jQuery将多条数据插入模态框的实现代码
Oct 08 Javascript
JS深度拷贝Object Array实例分析
Mar 31 Javascript
JavaScript数组方法大全(推荐)
Jul 05 Javascript
vue从使用到源码实现教程详解
Sep 19 Javascript
Web纯前端“旭日图”实现元素周期表
Mar 10 Javascript
Node做中转服务器转发接口
Oct 18 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实现文件上传二法
2006/10/09 PHP
PHP模板解析类实例
2015/07/09 PHP
微信公众号OAuth2.0网页授权问题浅析
2017/01/21 PHP
[企业公众号]升级到[企业微信]之后发送消息失败的解决方法
2017/06/30 PHP
Yii2使用表单上传文件的实例代码
2017/08/03 PHP
Js 获取当前日期时间及其它操作实现代码
2021/03/04 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
2013/09/18 Javascript
利用JQuery和Servlet实现跨域提交请求示例分享
2014/02/12 Javascript
jquery操作对象数组元素方法详解
2014/11/26 Javascript
基于jQuery.Hz2Py.js插件实现的汉字转拼音特效
2015/05/07 Javascript
jqTransform美化表单
2015/10/10 Javascript
浅谈json取值(对象和数组)
2016/06/24 Javascript
深入理解(function(){... })();
2016/08/16 Javascript
详解JavaScript跨域总结与解决办法
2016/10/31 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
2016/11/21 Javascript
JavaScript调试之console.log调试的一个小技巧分享
2017/08/07 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
2018/11/12 jQuery
浅谈JavaScript 代码简洁之道
2019/01/09 Javascript
vue3.0生命周期的示例代码
2020/09/24 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
2021/02/18 Vue.js
[01:02:32]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第二场 2月26日
2021/03/11 DOTA
400多行Python代码实现了一个FTP服务器
2012/05/10 Python
python使用sqlite3时游标使用方法
2018/03/13 Python
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
布鲁明戴尔百货店:Bloomingdale’s
2016/12/21 全球购物
基层干部十八大感言
2014/01/19 职场文书
一年级家长会邀请函
2014/01/25 职场文书
机电专业毕业生求职信
2014/07/01 职场文书
医院护士见习期自我鉴定
2014/09/15 职场文书
2015年国庆节活动总结
2015/03/23 职场文书
早会开场白台词大全
2015/06/01 职场文书
如何起草一份正确的合伙创业协议书?
2019/07/04 职场文书
2019感恩宣传标语!
2019/07/05 职场文书
MySQL 数据库范式化设计理论
2022/04/22 MySQL
python blinker 信号库
2022/05/04 Python
mysql中关键词exists的用法实例详解
2022/06/10 MySQL