移動端觸摸事件

移動端

一、定義

觸摸事件類型

touchstart:手指觸摸到一個 DOM 元素時觸發(fā)。
touchmove:手指在一個 DOM 元素上滑動時觸發(fā)。
touchend:手指從一個 DOM 元素上移開時觸發(fā)。
touchcancel 當(dāng)一些更高級別的事件發(fā)生的時候(如電話接入或者彈出信息)會取消當(dāng)前的touch操作,即觸發(fā)touchcancel。一般會在touchcancel時暫停游戲、存檔等操作。

二、接口

TouchEvent

TouchEvent的屬性繼承了 UIEventEvent。
其中三個主要屬性:
TouchEvent.changedTouches:一個 TouchList對象,包含了代表所有從上一次觸摸事件到此次事件過程中,狀態(tài)發(fā)生了改變的觸點(diǎn)的 Touch對象。

TouchEvent.targetTouches: 一個 TouchList 對象,是包含了如下觸點(diǎn)的 Touch 對象:觸摸起始于當(dāng)前事件的目標(biāo) element 上,并且仍然沒有離開觸摸平面的觸點(diǎn)。

TouchEvent.touches: 一 個 TouchList 對象,包含了所有當(dāng)前接觸觸摸平面的觸點(diǎn)的 Touch 對象,無論它們的起始于哪個 element 上,也無論它們狀態(tài)是否發(fā)生了變化。

TouchList

一個TouchList代表一個觸摸屏幕上所有觸點(diǎn)的列表。
事件對應(yīng)的三個列表包含了當(dāng)前事件的一些相關(guān)信息,比如:一些坐標(biāo)信息。

Touch

?Touch
1、屬性

TouchList

上面就是一個 TouchList 列表。它對應(yīng)的就是前面提到的三種事件(touchstart、touchmove、touchend)中的一種,在觸發(fā)時生成的一個對象列表。列表里最有用的就是 Touch 對象了,Touch 對象里存放著對應(yīng)事件的一些相關(guān)的信息,我們就是通過這種個事件里這些屬性的結(jié)合來實現(xiàn)各種效果。

三、示例:

1、拖拽元素

思路:

獲取按下時和選中元素的坐標(biāo)。獲取相對于元素偏移的位置。根據(jù)當(dāng)前的按下的位置減去元素偏移的位置。得到元素拖拽后的位置。在利用CSS定位和left、top屬性實現(xiàn)滑動的效果。

var moveElem = document.querySelector('.move'); //待拖拽元素      
var dragging; //是否激活拖拽狀態(tài)
var tLeft, tTop;
moveElem.addEventListener("touchstart", function (e) {
      dragging = true;
      var moveElemRect = moveElem.getBoundingClientRect();
      tLeft = e.touches[0].pageX - moveElemRect.left; //按下時和選中元素的坐標(biāo)偏移:x坐標(biāo)
      tTop = e.touches[0].pageY - moveElemRect.top; //按下時和選中元素的坐標(biāo)偏移:y坐標(biāo)
});
moveElem.addEventListener('touchmove', function(e) {
      if (dragging) {
          var moveX = e.touches[0].pageX - tLeft, 
                moveY = e.touches[0].pageY - tTop;
          moveElem.style.left = moveX + 'px';
          moveElem.style.top = moveY + 'px';
      }
});
moveElem.addEventListener('touchend', function(e) {
      dragging = false;
});

getBoundingClientRect:Element.getBoundingClientRect() 方法返回元素的大小及其相對于視口的位置。

2、長按

思路:

在touchstart中開啟一個定時器,比如在700ms后顯示一個長按菜單
在touchend中清除這個定時器,這樣如果按下的時間超過700ms,那么長按菜單已經(jīng)顯示出來了,清除定時器不會有任何影響;如果按下的時間小于700ms,那么touchstart中的長按菜單還沒來得及顯示出來,就被清除了。

label.addEventListener('touchstart', function () {
      startTime = +new Date()
      timer = setTimeout(function () {
          // 處理長按
      }, 700)
 })
label.addEventListener('touchend', function () {
      endTime = +new Date()
      clearTimeout(timer)
      if (endTime - startTime < 700) {
          // 處理點(diǎn)擊事件
      }
 });

3、兩指放大縮小操作

思路:

計算一開始兩指放在屏幕上時之間的距離x。在兩指滑動時,再計算兩指之間的距離y。x/y=縮放的比例。

實現(xiàn)

默認(rèn)事件

在移動端手指操作時會默認(rèn)觸發(fā)一些行為,比如:滾動,縮放。上面的例子由于沒有阻止觸摸事件的默認(rèn)行為導(dǎo)致的。所以當(dāng)你測試上面例子時,頁面很容易發(fā)生縮放行為,影響到測試效果。想阻止觸摸事件的默認(rèn)行為非常地簡單,只需要添加如下代碼就可以了:

document.addEventListener("touchstart", function (e) {
    e.preventDefault();
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 其實就是一個TouchEvent對象+上Vue的自定義事件,實現(xiàn)移動端的上滑、下滑、左滑、右滑,長按、點(diǎn)擊 組件 ...
    廢棄的種子閱讀 6,278評論 0 0
  • 15.1 移動端常見特效 15.1.1 案例講解-攜程移動端輪播圖 1.引入相關(guān)js 文件2.復(fù)制HTML 結(jié)構(gòu)3...
    Anwfly閱讀 647評論 0 1
  • 移動端觸摸事件添加方式值能用 addEventListeber(),方式綁定 移動觸摸事件有4個: 1、touch...
    山間的樹閱讀 511評論 0 0
  • 觸摸事件 touchstart:當(dāng)手指觸摸屏幕時觸發(fā);即使已經(jīng)有一個手指放在屏幕上也會觸發(fā)。touchmove:當(dāng)...
    cshooting閱讀 250評論 0 0
  • http://action.weixin.qq.com/payact/readtemplate?t=mobile/...
    jh2k15閱讀 160評論 0 0

友情鏈接更多精彩內(nèi)容