Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 59825d8

Browse files
authored
Merge pull request #32 from github/support-touch-events
Support touch events
2 parents b496c92 + ac2faee commit 59825d8

File tree

3 files changed

+35
-8
lines changed

3 files changed

+35
-8
lines changed

examples/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
<head>
44
<style>
55
.wrapper {
6-
width: 500px;
76
margin: 30px auto;
87
}
98
.loading {
@@ -13,6 +12,7 @@
1312
}
1413
</style>
1514
<meta charset="utf-8">
15+
<meta name="viewport" content="width=device-width, initial-scale=1" />
1616
<link href="../src/index.css" rel="stylesheet">
1717
<!-- <script type="module" src="../dist/index.js"></script> -->
1818
<script type="module" src="https://unpkg.com/@github/image-crop-element@latest/dist/index.js"></script>

src/index.css

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
image-crop { display: block; }
1+
image-crop {
2+
touch-action: none;
3+
display: block;
4+
}
25
image-crop.nesw { cursor: nesw-resize; }
36
image-crop.nwse { cursor: nwse-resize; }
47
image-crop.nesw .crop-box,

src/index.ts

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const startPositions: WeakMap<ImageCropElement, {startX: number; startY: number}
1818
const dragStartPositions: WeakMap<ImageCropElement, {dragStartX: number; dragStartY: number}> = new WeakMap()
1919
const constructedElements: WeakMap<ImageCropElement, {image: HTMLImageElement; box: HTMLElement}> = new WeakMap()
2020

21-
function moveCropArea(event: MouseEvent | KeyboardEvent) {
21+
function moveCropArea(event: TouchEvent | MouseEvent | KeyboardEvent) {
2222
const el = event.currentTarget
2323
if (!(el instanceof ImageCropElement)) return
2424
const {box, image} = constructedElements.get(el) || {}
@@ -37,10 +37,16 @@ function moveCropArea(event: MouseEvent | KeyboardEvent) {
3737
deltaX = 1
3838
}
3939
} else if (dragStartPositions.has(el) && event instanceof MouseEvent) {
40-
const pos = dragStartPositions.get(el)
41-
if (!pos) return
40+
const pos = dragStartPositions.get(el)!
4241
deltaX = event.pageX - pos.dragStartX
4342
deltaY = event.pageY - pos.dragStartY
43+
} else if (dragStartPositions.has(el) && event instanceof TouchEvent) {
44+
// Only support a single touch at a time
45+
const {pageX, pageY} = event.changedTouches[0]
46+
47+
const {dragStartX, dragStartY} = dragStartPositions.get(el)!
48+
deltaX = pageX - dragStartX
49+
deltaY = pageY - dragStartY
4450
}
4551

4652
if (deltaX !== 0 || deltaY !== 0) {
@@ -57,10 +63,17 @@ function moveCropArea(event: MouseEvent | KeyboardEvent) {
5763
dragStartX: event.pageX,
5864
dragStartY: event.pageY
5965
})
66+
} else if (event instanceof TouchEvent) {
67+
// Only support a single touch at a time
68+
const {pageX, pageY} = event.changedTouches[0]
69+
dragStartPositions.set(el, {
70+
dragStartX: pageX,
71+
dragStartY: pageY
72+
})
6073
}
6174
}
6275

63-
function updateCropArea(event: MouseEvent | KeyboardEvent) {
76+
function updateCropArea(event: TouchEvent | MouseEvent | KeyboardEvent) {
6477
const target = event.target
6578
if (!(target instanceof HTMLElement)) return
6679

@@ -84,12 +97,17 @@ function updateCropArea(event: MouseEvent | KeyboardEvent) {
8497
if (!pos) return
8598
deltaX = event.pageX - pos.startX - rect.left - window.pageXOffset
8699
deltaY = event.pageY - pos.startY - rect.top - window.pageYOffset
100+
} else if (event instanceof TouchEvent) {
101+
const pos = startPositions.get(el)
102+
if (!pos) return
103+
deltaX = event.changedTouches[0].pageX - pos.startX - rect.left - window.pageXOffset
104+
deltaY = event.changedTouches[0].pageY - pos.startY - rect.top - window.pageYOffset
87105
}
88106

89107
if (deltaX && deltaY) updateDimensions(el, deltaX, deltaY, !(event instanceof KeyboardEvent))
90108
}
91109

92-
function startUpdate(event: MouseEvent) {
110+
function startUpdate(event: TouchEvent | MouseEvent) {
93111
const currentTarget = event.currentTarget
94112
if (!(currentTarget instanceof HTMLElement)) return
95113

@@ -105,6 +123,7 @@ function startUpdate(event: MouseEvent) {
105123
const direction = target.getAttribute('data-direction') || ''
106124
// Change crop area
107125
el.addEventListener('mousemove', updateCropArea)
126+
el.addEventListener('touchmove', updateCropArea)
108127
if (['nw', 'se'].indexOf(direction) >= 0) el.classList.add('nwse')
109128
if (['ne', 'sw'].indexOf(direction) >= 0) el.classList.add('nesw')
110129
startPositions.set(el, {
@@ -115,6 +134,7 @@ function startUpdate(event: MouseEvent) {
115134
} else {
116135
// Move crop area
117136
el.addEventListener('mousemove', moveCropArea)
137+
el.addEventListener('touchmove', moveCropArea)
118138
}
119139
}
120140

@@ -164,14 +184,16 @@ function setInitialPosition(el: ImageCropElement) {
164184
updateDimensions(el, side, side)
165185
}
166186

167-
function stopUpdate(event: MouseEvent) {
187+
function stopUpdate(event: TouchEvent | MouseEvent) {
168188
const el = event.currentTarget
169189
if (!(el instanceof ImageCropElement)) return
170190

171191
dragStartPositions.delete(el)
172192
el.classList.remove('nwse', 'nesw')
173193
el.removeEventListener('mousemove', updateCropArea)
174194
el.removeEventListener('mousemove', moveCropArea)
195+
el.removeEventListener('touchmove', updateCropArea)
196+
el.removeEventListener('touchmove', moveCropArea)
175197
}
176198

177199
interface Result {
@@ -208,8 +230,10 @@ class ImageCropElement extends HTMLElement {
208230

209231
image.addEventListener('load', imageReady)
210232
this.addEventListener('mouseleave', stopUpdate)
233+
this.addEventListener('touchend', stopUpdate)
211234
this.addEventListener('mouseup', stopUpdate)
212235
box.addEventListener('mousedown', startUpdate)
236+
box.addEventListener('touchstart', startUpdate)
213237
this.addEventListener('keydown', moveCropArea)
214238
this.addEventListener('keydown', updateCropArea)
215239

0 commit comments

Comments
 (0)