电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

基于Vue2實現移動端圖片上傳、壓縮、拖拽排序、拖拽刪除功能

瀏覽:4日期:2022-10-12 14:40:38

用Vue2實現移動端圖片上傳、壓縮、拖拽排序、拖拽刪除功能 圖片上傳圖片壓縮拖拽排序、拖拽刪除 之前在公司開發(fā)過一段時間的移動端H5頁面,有個功能就是要上傳圖片+壓縮。參考了一下網上的方法,外加自己摸索的過程,最終實現了這個功能。后面在家閑的時候又加多了個長按選中圖片,并且可以拖拽排序、拖拽到指定位置刪除的功能。

github地址:代碼地址

下面直接進入正題:

圖片上傳

圖片上傳用的是HTML的input標簽實現的。核心就是把獲取到的文件通過FileReader轉換成圖片,代碼如下:

<input type='file' accept='image/*' capture='camera' @change='selectFile'>selectFile(event:any){ this.showAlert = false if (event.target.files && event.target.files.length > 0) { this.isLoading = true let file:any = event.target.files[0] let fr:any = new FileReader() fr.readAsDataURL(file) fr.onload = (imgObj:any) => { let img:any = new Image() img.src = imgObj.target.result img.onload = (e:any) => { // 這里就可以獲取到上傳的圖片了 }) } } }}圖片壓縮

圖片壓縮用的是canvas重繪的方法實現的,具體代碼如下:

// 省略上面的代碼fr.onload = (imgObj:any) => {// 獲取到圖片文件后 let img:any = new Image() img.src = imgObj.target.result img.onload = (e:any) => { Compress(img,e.path[0].height,e.path[0].width,(newImg:any) => { this.imgList.push(newImg) this.isLoading = false // 待添加拖拽功能 }) }}/** * 圖片壓縮 * @param img 圖片對象 */export function Compress(img:any,height:number,width:number,callback:Function) { let canvas:any = document.createElement(’canvas’) let context:any = canvas.getContext(’2d’) canvas.width = width canvas.height = height context.clearRect(0,0,width,height) context.drawImage(img,0,0,width,height) callback(canvas.toDataURL('image/jpeg', 0.75))}拖拽排序、拖拽刪除

拖拽排序、拖拽到指定位置刪除是通過監(jiān)聽touch事件來實現的。核心思路:1、獲取到圖片dom元素,給圖片dom元素添加ontouchstart、ontouchend、ontouchmove 方法。2、在ontouchstart方法中new一個時間節(jié)點,在ontouchend中也new一個時間節(jié)點,通過判斷兩個時間節(jié)點之間的時間間隔判斷是點擊事件還是長按事件。3、ontouchstart中設置settimeout方法是延時判斷是點擊方法還是長按方法,如果是長按方法的則獲取圖片的所在頁面中的位置,設置圖片的位置為點擊屏幕的位置,改變圖片的布局方式,在ontouchmove方法中設置圖片的位置跟隨觸摸屏幕的位置變化。4、移動圖片后松開手時,觸發(fā)ontouchend方法,判斷手指離開后,圖片所在的位置是否處在刪除的區(qū)域當中,如果在則刪除圖片,并且重新渲染圖片列表,重新添加touch方法。如果不在刪除的區(qū)域中,則進行圖片位置排序,排序后還原圖片樣式。并強制重新渲染圖片列表。

代碼如下:

Compress(img,e.path[0].height,e.path[0].width,(newImg:any) => { this.imgList.push(newImg) this.isLoading = false // 在這里給加入方法 setTimeout(() => { this.addTouchEvent() });})addTouchEvent(){ let domList:any = document.querySelectorAll(’.show-img’) if (domList) { let domMoveFlag:boolean = true domList.forEach((item:any,index:any) => { item.ontouchstart = null item.ontouchmove = null item.ontouchend = null item.ontouchstart = (startEvent:any) => { startEvent.preventDefault() console.log(startEvent) this.touchStartTime = new Date() setTimeout(() => { if (domMoveFlag) {console.log(’執(zhí)行元素位置操作過程’) this.showDeleteArea = true let domClient:any = item.getBoundingClientRect() console.log(domClient) this.firstPosition = { x:startEvent.changedTouches[0].pageX, y:startEvent.changedTouches[0].pageY } item.style.position = ’fixed’ item.style.height = domClient.height + ’px’ item.style.width = domClient.width + ’px’ item.style.top = domClient.top + ’px’ item.style.left = domClient.left + ’px’ item.style.padding = 0 item.style.zIndex = 9 // 添加拖拽事件 item.ontouchmove = (moveEvent:any) => { // console.log(moveEvent) item.style.top = moveEvent.changedTouches[0].pageY - this.firstPosition.y + domClient.top + ’px’ item.style.left = moveEvent.changedTouches[0].pageX - this.firstPosition.x + domClient.left + ’px’ } } }, 600); } item.ontouchend = (endEvent:any) => { let time:any = new Date() console.log(time - this.touchStartTime) if (time - this.touchStartTime <= 400) { domMoveFlag = false item.click() setTimeout(() => { this.addTouchEvent() }); } else { let newItemCenter:any = item.getBoundingClientRect() let centerY:any = newItemCenter.top + newItemCenter.height / 2 let centerX:any = newItemCenter.left + newItemCenter.width / 2 let deleteDom:any = document.querySelector('.deleteImg') let deleteArea:any = deleteDom.getBoundingClientRect() if (centerY >= deleteArea.top) { let _imgList = JSON.parse(JSON.stringify(this.imgList)) let currentImg:any = _imgList.splice(index,1) this.imgList = [] this.showDeleteArea = false setTimeout(() => { this.imgList = _imgList setTimeout(() => {this.addTouchEvent()}); }); return } this.showDeleteArea = false // 計算所有圖片元素所在頁面位置 let domParentList:any = document.querySelectorAll(’.imgCtn’) domParentList && domParentList.forEach((domParent:any,cindex:any) => { let domPos:any = (domParent.getBoundingClientRect()) if (centerY >= domPos.top&& centerY <= domPos.bottom&& centerX >= domPos.left && centerX <= domPos.right ) { // 重新排序 console.log(’在目標區(qū)域內,重新排序’) let _imgList = JSON.parse(JSON.stringify(this.imgList)) let currentImg:any = _imgList.splice(index,1) _imgList.splice(cindex,0,...currentImg) this.imgList = [] setTimeout(() => {this.imgList = _imgListsetTimeout(() => { this.addTouchEvent() }); }); } }); // 還原樣式 item.style.position = ’absolute’; item.style.height = ’100%’ item.style.width = ’100%’ item.style.top = ’0’ item.style.left = ’0’ item.style.padding = ’10px’ } } }) }}

至此,圖片的上傳、壓縮、拖拽排序、拖拽刪除功能就已經完成了。

到此這篇關于基于Vue2實現移動端圖片上傳、壓縮、拖拽排序、拖拽刪除功能的文章就介紹到這了,更多相關vue實現圖片上傳拖拽排序內容請搜索好吧啦網以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
主站蜘蛛池模板: 广东教师资格网-广东教师资格证考试网 | 喷砂机厂家_自动喷砂机生产_新瑞自动化喷砂除锈设备 | 硬齿面减速机[型号全],ZQ减速机-淄博久增机械 | 防渗土工膜|污水处理防渗膜|垃圾填埋场防渗膜-泰安佳路通工程材料有限公司 | 手持式浮游菌采样器-全排二级生物安全柜-浙江孚夏医疗科技有限公司 | 苏州柯瑞德货架-仓库自动化改造解决方案 | 达利园物流科技集团- | 苏州伊诺尔拆除公司_专业酒店厂房拆除_商场学校拆除_办公楼房屋拆除_家工装拆除拆旧 | 新疆系统集成_新疆系统集成公司_系统集成项目-新疆利成科技 | 清水混凝土修复_混凝土色差修复剂_混凝土色差调整剂_清水混凝土色差修复_河南天工 | 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 盘式曝气器-微孔曝气器-管式曝气器-曝气盘-斜管填料 | 郑州市前程水处理有限公司 | 全屋整木定制-橱柜,家具定制-四川峨眉山龙马木业有限公司 | 创绿家招商加盟网-除甲醛加盟-甲醛治理加盟-室内除甲醛加盟-创绿家招商官网 | vr安全体验馆|交通安全|工地安全|禁毒|消防|安全教育体验馆|安全体验教室-贝森德(深圳)科技 | 密集架|电动密集架|移动密集架|黑龙江档案密集架-大量现货厂家销售 | 动环监控_机房环境监控_DCIM_机房漏水检测-斯特纽 | 美国PARKER齿轮泵,美国PARKER柱塞泵,美国PARKER叶片泵,美国PARKER电磁阀,美国PARKER比例阀-上海维特锐实业发展有限公司二部 | 茅茅虫AI论文写作助手-免费AIGC论文查重_写毕业论文降重 | 无硅导热垫片-碳纤维导热垫片-导热相变材料厂家-东莞市盛元新材料科技有限公司 | 塑胶跑道_学校塑胶跑道_塑胶球场_运动场材料厂家_中国塑胶跑道十大生产厂家_混合型塑胶跑道_透气型塑胶跑道-广东绿晨体育设施有限公司 | 哈尔滨京科脑康神经内科医院-哈尔滨治疗头痛医院-哈尔滨治疗癫痫康复医院 | 烟雾净化器-滤筒除尘器-防爆除尘器-除尘器厂家-东莞执信环保科技有限公司 | 深圳活动策划公司|庆典策划|专业公关活动策划|深圳艺典文化传媒 重庆中专|职高|技校招生-重庆中专招生网 | 冷藏车-东风吸污车-纯电动环卫车-污水净化车-应急特勤保障车-程力专汽厂家-程力专用汽车股份有限公司销售二十一分公司 | 重庆网站建设,重庆网站设计,重庆网站制作,重庆seo,重庆做网站,重庆seo,重庆公众号运营,重庆小程序开发 | 电镀电源整流器_高频电解电源_单脉双脉冲电源 - 东阳市旭东电子科技 | 航空障碍灯_高中低光强航空障碍灯_民航许可认证航空警示灯厂家-东莞市天翔航天科技有限公司 | 涡轮流量计_LWGY智能气体液体电池供电计量表-金湖凯铭仪表有限公司 | 山东风淋室_201/304不锈钢风淋室净化设备厂家-盛之源风淋室厂家 翻斗式矿车|固定式矿车|曲轨侧卸式矿车|梭式矿车|矿车配件-山东卓力矿车生产厂家 | 恒温水槽与水浴锅-上海熙浩实业有限公司 | 考勤系统_考勤管理系统_网络考勤软件_政企|集团|工厂复杂考勤工时统计排班管理系统_天时考勤 | 浙江浩盛阀门有限公司| 办公室家具公司_办公家具品牌厂家_森拉堡办公家具【官网】 | 马尔表面粗糙度仪-MAHR-T500Hommel-Mitutoyo粗糙度仪-笃挚仪器 | 闭端端子|弹簧螺式接线头|防水接线头|插线式接线头|端子台|电源线扣+护线套|印刷电路板型端子台|金笔电子代理商-上海拓胜电气有限公司 | 杜康白酒加盟_杜康酒代理_杜康酒招商加盟官网_杜康酒厂加盟总代理—杜康酒神全国运营中心 | 选矿设备-新型重选设备-金属矿尾矿重选-青州冠诚重工机械有限公司 | 拖鞋定制厂家-品牌拖鞋代加工厂-振扬实业中国高端拖鞋大型制造商 | 温室大棚建设|水肥一体化|物联网系统| 氢氧化钙设备_厂家-淄博工贸有限公司 |