- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章基于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 。
最后此篇关于基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能的文章就讲到这里了,如果你想了解更多关于基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有点想做 the reverse of this. 我不想解压缩并将收集文件添加到 S3 应用户要求: 生成一堆xml文件 使用一些图像(托管在 s3 上的预先存在的图像)压缩 xml 文件 下载
将此添加到域的虚拟主机后 AddOutputFilterByType DEFLATE application/javascript text/javascript text/css 响应头不包含任何内
在 Apache Im 中,通过将以下内容添加到我的 .htaccess 文件来启用输出压缩: # compress text, html, javascript, css, xml: AddOutp
是否可以以压缩格式将请求数据从浏览器发送到服务器? 如果是,我们该怎么做? 最佳答案 压缩从浏览器发送到服务器的数据是不受 native 支持 在浏览器中。 您必须找到一种解决方法,使用客户端语言(可
我正在寻找可以压缩JavaScript源代码的工具。我发现一些网络工具只能删除空格字符?但也许存在更好的工具,可以压缩用户的函数名称、字段名称、删除未使用的字段等。 最佳答案 经常用来压缩JS代码的工
使用赛马博彩场景,假设我有许多单独的投注来预测比赛的前 4 名选手 (superfecta)。 赌注如下... 1/2/3/4 1/2/3/5 1/2/4/3 1/2/4/5 1/2/5/3
我是一名实习生,被要求对 SQL 2008 数据压缩进行一些研究。我们想将 Outlook 电子邮件的几个部分存储在一个表中。问题是我们想将整个电子邮件正文存储在一个字段中,然后又想压缩它。使用 Ch
我目前有一个系统,用户可以在其中上传 MP4 文件,并且可以在移动设备上下载该文件。但有时,这些视频的大小超过 5MB,在我国,大多数人使用 2G。因此,下载大型视频通常需要 15-20 分钟。 有什
假设我有一个带有类型列的简单文档表: Documents Id Type 1 A 2 A 3 B 4 C 5 C 6 A 7 A 8 A 9 B 10 C 用户
我有一个较大字符串中的(子)字符串位置的 data.frame。数据包含(子)字符串的开头及其长度。可以很容易地计算出(子)字符串的结束位置。 data1 start length end #>
我想知道是否 文件加密算法可以设计成它也可以执行文件压缩的事件(任何活生生的例子?)。 我也可以将它集成到移动短信服务中,我的意思是短信吗? 另外我想知道二进制文件...如果纯文本文件以二进制编码
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我们有几个具有大量 JavaScript 的 Java 项目,目前我们使用的是旧版本的 YUICompressor (2.4.2)。然而,我在这篇博文中发现 YUICompressor 正在 depr
从之前关于尝试提高网站性能的文章中,我一直在研究 HTTP 压缩。我读过有关在 IIS 中设置它的信息,但它似乎是所有 IIS 应用程序池的全局事物,我可能不允许这样做,因为还有另一个站点在其上运行。
我有一个 REST 服务,它返回一大块 XML,大约值(value) 150k。 例如http://xmlservice.com/services/RestService.svc/GetLargeXM
我正在尝试获取一个简单的 UglifyJS (v2.3.6) 示例来处理压缩。 具体来说,“未使用”选项,如果从未使用过,变量和函数将被删除。 这是我在命令行上的尝试: echo "function
我正在开发一个项目,如果我的磁盘出现问题,我将在使用 ZLIB 压缩内存块后将其发送到另一个磁盘。然后我计划下载该转储并用于进一步调试。这种压缩和上传将一次完成一个 block - 比如说 1024
LZW 压缩算法在压缩后增加了位大小: 这是压缩函数的代码: // compression void compress(FILE *inputFile, FILE *outputFile) {
我的问题与如何在 3D 地形上存储大量信息有关。这些信息应该是 secret 的,因为它们非常庞大,也应该被压缩。我选择了文件存储,现在我想知道将对象数据加密/压缩(或压缩/加密)到文件的最佳做法。
我使用以下代码来压缩我的文件并且效果很好,但我只想压缩子文件夹而不是在压缩文件中显示树的根。 public boolean zipFileAtPath(String sourcePath, Strin
我是一名优秀的程序员,十分优秀!