1. 程式人生 > >使用觸控檢測滑動(左,右,上或下)

使用觸控檢測滑動(左,右,上或下)

觸控式滑動是指在特定方向上快速移動手指穿過觸控表面的行為。onswipeJavaScript中目前沒有“ ”事件,這意味著我們可以使用可用的觸控事件來實現一個事件,並且只需在刷卡時定義,即“刷卡”。

讓我們首先定義何時應該將觸控表面上的移動視為滑動。有在玩兩個變數這裡-在距離旅行了使用者對x或y軸的手指touchstart來 touchend,而且,它花時間。基於這兩個因素,我們可以決定該操作是否符合滑動和方向。

有了這個,讓我們把想法付諸行動,看看如何檢測右鍵(從左到右)。一旦我們能夠做到這一點,檢測其他3個方向的滑動幾乎完全相同。在這個練習中,我們將規定,當用戶提出他在觸控手指表面最低為150px發生向右滑動水平

從左至右在200毫秒以內。此外,垂直移動的距離不應超過100px,以避免使用者斜向滑動的“誤報”,我們不希望將其視為向右滑動。

1

2

3

4

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

三十

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;"><SCRIPT></font></font><font></font>

<font></font><font style="vertical-align: inherit;"

><font style="vertical-align: inherit;">

window.addEventListener('load'function(){</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

var touchsurface = document.getElementById('touchsurface'),</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

startx的,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

startY,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

DIST,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

閾值= 150,//所需的最小行程距離被視為滑動</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

allowedTime = 200,//允許行進該距離的最長時間</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

elapsedTime,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

開始時間</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

function handleswipe(isrightswipe){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

if(isrightswipe)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

touchsurface.innerHTML ='恭喜,你已經做了<span style =“color:red”>右滑動!</ span>'</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

其他{</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

touchsurface.innerHTML ='尚未滿足右鍵滑動的條件'</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

}</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

touchsurface.addEventListener('touchstart'function(e){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

touchsurface.innerHTML =''</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

var touchobj = e.changedTouches [0]</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

dist = 0</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

startX = touchobj.pageX</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

startY = touchobj.pageY</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

startTime = new Date()。getTime()//記錄手指首次與曲面接觸時的時間</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

e.preventDefault()</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

},false)</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

touchsurface.addEventListener('touchmove'function(e){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

e.preventDefault()//在DIV內阻止滾動</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

},false)</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

touchsurface.addEventListener('touchend'function(e){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

var touchobj = e.changedTouches [0]</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

dist = touchobj.pageX  -  startX //在與表面接觸時獲得手指行進的總dist</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

elapsedTime = new Date()。getTime() -  startTime //經過時間</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

//檢查經過的時間是否在指定範圍內,水平dist行進> =閾值,垂直dist行進<= 100</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

var swiperightBol =(elapsedTime <= allowedTime && dist> = threshold && Math.abs(touchobj.pageY  -  startY)<= 100)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

handleswipe(swiperightBol)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

e.preventDefault()</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

},false)</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

},false//結束window.onload</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

</ SCRIPT></font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

<div id =“touchsurface”>向我掃描</ div></font></font>

touchend,我們檢查DIST從行進 touchstarttouchend在指定的閾值以上的正數(即:150),因為在向右掃動,即DIST應該總是基於所使用(與陰性對左輕掃)等式是正。同時,我們確保任何垂直橫向移動都小於100px以排除對角線滑動。由於垂直運動可以在起始觸點上方或下方發生,因此我們Math.abs()在獲得絕對垂直dist旅行時使用,因此在將其與我們的垂直閾值100進行比較時會涵蓋兩種情況。

通用滑動檢測功能

現在我們向右滑動,讓我們建立一個更通用的功能,檢測4個方向(左,右,上或下)中的任何一個方向的滑動:

1

2

3

4

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

三十

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

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">function swipedetect(el,callback){</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

var touchsurface = el,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

swipedir,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

startx的,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

startY,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

distX,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

distY,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

閾值= 150,//所需的最小行程距離被視為滑動</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

約束= 100,//垂直方向同時允許的最大距離</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

allowedTime = 300,//允許行進該距離的最長時間</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

elapsedTime,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

開始時間,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

handleswipe = callback || </font><font style="vertical-align: inherit;">函式(swipedir){}</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

touchsurface.addEventListener('touchstart'function(e){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

var touchobj = e.changedTouches [0]</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

swipedir ='無'</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

dist = 0</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

startX = touchobj.pageX</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

startY = touchobj.pageY</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

startTime = new Date()。getTime()//記錄手指首次與曲面接觸時的時間</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

e.preventDefault()</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

},false)</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

touchsurface.addEventListener('touchmove'function(e){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

e.preventDefault()//在DIV內阻止滾動</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

},false)</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

touchsurface.addEventListener('touchend'function(e){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

var touchobj = e.changedTouches [0]</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

distX = touchobj.pageX  -  startX //在接觸表面時手指移動水平dist</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

distY = touchobj.pageY  -  startY //在接觸表面時手指移動垂直dist</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

elapsedTime = new Date()。getTime() -  startTime //經過時間</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

if(elapsedTime <= allowedTime){//滿足awipe的第一個條件</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

if(Math.abs(distX)> = threshold && Math.abs(distY)<= restraint){//水平滑動的第二個條件遇到</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

swipedir =(distX <0)?</font><font style="vertical-align: inherit;">'left''right'//如果dist行進是負數,則表示左滑動</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

否則if(Math.abs(distY)> = threshold && Math.abs(distX)<= restraint){//垂直滑動的第二個條件遇到</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

swipedir =(distY <0)?</font><font style="vertical-align: inherit;">'up''down'//如果dist旅行是負面的,它表示向上滑動</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

handleswipe(swipedir)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

e.preventDefault()</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

},false)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

}</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

//用法:</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

/ *</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

var el = document.getElementById('someel')</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

swipedetect(el,function(swipedir){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

swipedir包含“none”,“left”,“right”,“top”或“down”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

if(swipedir =='left')</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

警報('你剛剛向左滑!')</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

})</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

* /</font></font>

swipedetect()接受兩個引數,即將觸控事件繫結到的元素,以及在滑動發生時執行的函式。函式引數“ swipedir”告訴您剛剛使用五個可能值進行的滑動型別:“ none ”,“ left ”,“ right ”,“ top ”或“ down ”。

下面使用該swipedetect()功能顯示“左”,“右”,“頂部”或“向下”背景影象(覆蓋在預設背景影象的頂部),具體取決於剛剛發生的滑動:

使用的程式碼是:

1

2

3

4

6

7

8

9

10

11

12

13

14

15

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">window.addEventListener('load'function(){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

var el = document.getElementById('touchsurface2')</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

var inner = document.getElementById('inner')</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

var hidetimer = null</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

swipedetect(el,function(swipedir){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

if(swipedir!='none'){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

clearTimeout(hidetimer)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

var bgimage = swipedir +'arrow.png'//命名約定是“leftarrow.png”,“rightarrow.png”等</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

inner.style.background ='透明網址('+ bgimage +')中心無重複'</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

hidetimer = setTimeout(function(){// 1秒後重置背景影象</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

inner.style.background =''</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

},1000)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

})</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

},false)</font></font>

HTML標記是:

1

2

3

4

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;"><div id =“touchsurface2”></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

<div id =“inner”></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

刷我</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

</ DIV></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

</ DIV></font></font>

我們繫結swipedetect()到“ #touchsurface2”,每當在其中發生有效的滑動時,我們相應地更改“ #inner”DIV的背景影象以反映剛剛發生的滑動型別。