国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - vue.js - 基于Vue2實現移動端圖片上傳、壓縮、拖拽排序、拖拽刪除功能

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

2021-12-27 15:56前端小白菜~ vue.js

這篇文章主要介紹了基于Vue2實現移動端圖片上傳、壓縮、拖拽排序、拖拽刪除功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

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

github地址:代碼地址

下面直接進入正題:

圖片上傳

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<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重繪的方法實現的,具體代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 省略上面的代碼
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))
}

拖拽排序、拖拽刪除

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

代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
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('執行元素位置操作過程')
      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('在目標區域內,重新排序')
       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 = _imgList
        setTimeout(() => {
         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實現圖片上傳拖拽排序內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/qq_18901079/article/details/112191132

延伸 · 閱讀

精彩推薦
  • vue.js梳理一下vue中的生命周期

    梳理一下vue中的生命周期

    看過很多人講vue的生命周期,但總是被繞的云里霧里,尤其是自學的同學,可能js的基礎也不是太牢固,聽起來更是吃力,那我就已個人之淺見,以大白話...

    CRMEB技術團隊7992021-12-22
  • vue.jsVue多選列表組件深入詳解

    Vue多選列表組件深入詳解

    這篇文章主要介紹了Vue多選列表組件深入詳解,這個是vue的基本組件,有需要的同學可以研究下...

    yukiwu6752022-01-25
  • vue.jsVue中引入svg圖標的兩種方式

    Vue中引入svg圖標的兩種方式

    這篇文章主要給大家介紹了關于Vue中引入svg圖標的兩種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的...

    十里不故夢10222021-12-31
  • vue.jsVue2.x-使用防抖以及節流的示例

    Vue2.x-使用防抖以及節流的示例

    這篇文章主要介紹了Vue2.x-使用防抖以及節流的示例,幫助大家更好的理解和學習使用vue框架,感興趣的朋友可以了解下...

    Kyara6372022-01-25
  • vue.js詳解vue 表單綁定與組件

    詳解vue 表單綁定與組件

    這篇文章主要介紹了vue 表單綁定與組件的相關資料,幫助大家更好的理解和學習使用vue框架,感興趣的朋友可以了解下...

    Latteitcjz6432022-02-12
  • vue.jsVue2.x 項目性能優化之代碼優化的實現

    Vue2.x 項目性能優化之代碼優化的實現

    這篇文章主要介紹了Vue2.x 項目性能優化之代碼優化的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋...

    優小U9632022-02-21
  • vue.js用vite搭建vue3應用的實現方法

    用vite搭建vue3應用的實現方法

    這篇文章主要介紹了用vite搭建vue3應用的實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下...

    Asiter7912022-01-22
  • vue.jsVue項目中實現帶參跳轉功能

    Vue項目中實現帶參跳轉功能

    最近做了一個手機端系統,其中遇到了父頁面需要攜帶參數跳轉至子頁面的問題,現已解決,下面分享一下實現過程,感興趣的朋友一起看看吧...

    YiluRen丶4302022-03-03
主站蜘蛛池模板: 日韩一区精品视频 | 特污影院 | 青青国产视频 | 亚洲一区在线日韩在线深爱 | 在线观看三区 | 精品在线一区二区 | 国产看片网站 | 久久久久久久久久久网站 | 精品国产资源 | 亚洲一区二区三区四区的 | 一区二区三区四区免费看 | 黄色片网站在线 | 日韩视频免费在线观看 | 中文字幕在线播放一区 | 欧美日本在线观看 | 久久久精品日本 | 黄毛片网站 | 亚洲高清www | 亚洲高清在线 | 龙珠z普通话国语版在线观看 | 伊人成人222 | 亚洲欧美国产另类 | 国产精品免费久久久久久 | 九九热精品在线 | 欧美精品在线观看 | 台湾一级特黄aa大片免费看 | 日韩欧美国产一区二区三区 | 91免费版在线观看 | 亚洲日本国产 | 国内久久精品 | 成年女人免费v片 | 久久久久久久久久久久久久免费看 | 久久一二区| 一级片网 | 中文字幕av网站 | 午夜影院 | 亚洲精品视频在线 | 亚洲精品免费在线观看视频 | 久久精品2019中文字幕 | 日韩中文字幕视频 | 国产精品一区二区免费 |