成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS移動(dòng)客戶端--觸屏滑動(dòng)事件及js手機(jī)拖拽效果

joyqi / 3515人閱讀

摘要:移動(dòng)端觸屏滑動(dòng)的效果其實(shí)就是圖片輪播,在的頁(yè)面上很好實(shí)現(xiàn),綁定和等事件來(lái)完成。處理事件能跟蹤到屏幕滑動(dòng)的每根手指。禁止?jié)L動(dòng)是阻止默認(rèn)行為,事件的默認(rèn)行為就是滾動(dòng)??上г诖送媪艘粋€(gè)小時(shí)也沒(méi)有看見(jiàn)一列火車(chē)經(jīng)過(guò),只好繼續(xù)趕往東烏旗。

移動(dòng)端觸屏滑動(dòng)的效果其實(shí)就是圖片輪播,在PC的頁(yè)面上很好實(shí)現(xiàn),綁定click和mouseover等事件來(lái)完成。但是在移動(dòng)設(shè)備上,要實(shí)現(xiàn)這種輪播的效果,就需要用到核心的touch事件。處理touch事件能跟蹤到屏幕滑動(dòng)的每根手指。

以下是四種touch事件

touchstart: //手指放到屏幕上時(shí)觸發(fā)

touchmove: //手指在屏幕上滑動(dòng)式觸發(fā)

touchend: //手指離開(kāi)屏幕時(shí)觸發(fā)

touchcancel: //系統(tǒng)取消touch事件的時(shí)候觸發(fā),這個(gè)好像比較少用

每個(gè)觸摸事件被觸發(fā)后,會(huì)生成一個(gè)event對(duì)象,event對(duì)象里額外包括以下三個(gè)觸摸列表

touches: //當(dāng)前屏幕上所有手指的列表

targetTouches: //當(dāng)前dom元素上手指的列表,盡量使用這個(gè)代替touches

changedTouches: //涉及當(dāng)前事件的手指的列表,盡量使用這個(gè)代替touches

這些列表里的每次觸摸由touch對(duì)象組成,touch對(duì)象里包含著觸摸信息,主要屬性如下:

clientX / clientY: //觸摸點(diǎn)相對(duì)瀏覽器窗口的位置

pageX / pageY: //觸摸點(diǎn)相對(duì)于頁(yè)面的位置

screenX / screenY: //觸摸點(diǎn)相對(duì)于屏幕的位置

identifier: //touch對(duì)象的ID

target: //當(dāng)前的DOM元素

注意:

手指在滑動(dòng)整個(gè)屏幕時(shí),會(huì)影響瀏覽器的行為,比如滾動(dòng)和縮放。所以在調(diào)用touch事件時(shí),要注意禁止縮放和滾動(dòng)。

1.禁止縮放

通過(guò)meta元標(biāo)簽來(lái)設(shè)置。


2.禁止?jié)L動(dòng)

preventDefault是阻止默認(rèn)行為,touch事件的默認(rèn)行為就是滾動(dòng)。

event.preventDefault();

案例:

下面給出一個(gè)案例,需在移動(dòng)設(shè)備上才能看出效果。

1.定義touchstart的事件處理函數(shù),并綁定事件:

if(!!self.touch) self.slider.addEventListener("touchstart",self.events,false); 

//定義touchstart的事件處理函數(shù)
start:function(event){
  var touch = event.targetTouches[0]; //touches數(shù)組對(duì)象獲得屏幕上所有的touch,取第一個(gè)touch
  startPos = {x:touch.pageX,y:touch.pageY,time:+new Date}; //取第一個(gè)touch的坐標(biāo)值
  isScrolling = 0; //這個(gè)參數(shù)判斷是垂直滾動(dòng)還是水平滾動(dòng)
  this.slider.addEventListener("touchmove",this,false);
  this.slider.addEventListener("touchend",this,false);
},

觸發(fā)touchstart事件后,會(huì)產(chǎn)生一個(gè)event對(duì)象,event對(duì)象里包括觸摸列表,獲得屏幕上的第一個(gè)touch,并記下其pageX,pageY的坐標(biāo)。定義一個(gè)變量標(biāo)記滾動(dòng)的方向。此時(shí)綁定touchmove,touchend事件。

2.定義手指在屏幕上移動(dòng)的事件,定義touchmove函數(shù)。

//移動(dòng)
move:function(event){
  //當(dāng)屏幕有多個(gè)touch或者頁(yè)面被縮放過(guò),就不執(zhí)行move操作
  if(event.targetTouches.length > 1 || event.scale && event.scale !== 1) return;
  var touch = event.targetTouches[0];
  endPos = {x:touch.pageX - startPos.x,y:touch.pageY - startPos.y};
  isScrolling = Math.abs(endPos.x) < Math.abs(endPos.y) ? 1:0; //isScrolling為1時(shí),表示縱向滑動(dòng),0為橫向滑動(dòng)
  if(isScrolling === 0){
    event.preventDefault(); //阻止觸摸事件的默認(rèn)行為,即阻止?jié)L屏
    this.slider.className = "cnt";
    this.slider.style.left = -this.index*600 + endPos.x + "px";
  }
},

同樣首先阻止頁(yè)面的滾屏行為,touchmove觸發(fā)后,會(huì)生成一個(gè)event對(duì)象,在event對(duì)象中獲取touches觸屏列表,取得第一個(gè)touch,并記下pageX,pageY的坐標(biāo),算出差值,得出手指滑動(dòng)的偏移量,使當(dāng)前DOM元素滑動(dòng)。

3.定義手指從屏幕上拿起的事件,定義touchend函數(shù)。

//滑動(dòng)釋放
end:function(event){
  var duration = +new Date - startPos.time; //滑動(dòng)的持續(xù)時(shí)間
  if(isScrolling === 0){ //當(dāng)為水平滾動(dòng)時(shí)
    this.icon[this.index].className = "";
    if(Number(duration) > 10){ 
      //判斷是左移還是右移,當(dāng)偏移量大于10時(shí)執(zhí)行
      if(endPos.x > 10){
        if(this.index !== 0) this.index -= 1;
      }else if(endPos.x < -10){
        if(this.index !== this.icon.length-1) this.index += 1;
      }
    }
    this.icon[this.index].className = "curr";
    this.slider.className = "cnt f-anim";
    this.slider.style.left = -this.index*600 + "px";
  }
  //解綁事件
  this.slider.removeEventListener("touchmove",this,false);
  this.slider.removeEventListener("touchend",this,false);
},

手指離開(kāi)屏幕后,所執(zhí)行的函數(shù)。這里先判斷手指停留屏幕上的時(shí)間,如果時(shí)間太短,則不執(zhí)行該函數(shù)。再判斷手指是左滑動(dòng)還是右滑動(dòng),分別執(zhí)行不同的操作。最后很重要的一點(diǎn)是移除touchmove,touchend綁定事件。

代碼事例1:




    
    
    
    
    


    
1
2
3
4
5
6

效果圖1(這些色塊都可以隨意拖動(dòng)):

代碼事例2:




    
    移動(dòng)端觸摸滑動(dòng)
    
    
    
    
    



  • 20140813鏡面的世界,終究只是倒影??吹玫侥愕纳碛?,卻觸摸不到你的未來(lái)

  • 20140812錫林浩特前往東烏旗S101必經(jīng)之處,一條極美的鐵路。鐵路下面是個(gè)小型的鹽沼,淡淡的有了一絲天空之境的感覺(jué)。可惜在此玩了一個(gè)小時(shí)也沒(méi)有看見(jiàn)一列火車(chē)經(jīng)過(guò),只好繼續(xù)趕往東烏旗。

  • 20140811水的顏色為什么那么藍(lán),我也納悶,反正自然飽和度和對(duì)比度拉完就是這個(gè)顏色的

  • 海洋星球3重慶天氣熱得我想臥軌自殺

  • 以上這些作品分別來(lái)自兩位設(shè)計(jì)師作為觀者,您能否通過(guò)設(shè)計(jì)風(fēng)格進(jìn)行區(qū)分

1 2 3 4 5

效果圖2(在手機(jī)上手指滑動(dòng)圖片可以進(jìn)行圖片切換):

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82159.html

相關(guān)文章

  • 一個(gè)基于Angular+Ionic+Phonegap的混合APP實(shí)戰(zhàn)

    摘要:有二維碼掃描功能,還做了類似消息可拖拽效果,上拉下拉刷新,輪播圖組件。特別適合用于基于模式的移動(dòng)應(yīng)用程序開(kāi)發(fā)。簡(jiǎn)介是一個(gè)用基于,和的,創(chuàng)建移動(dòng)跨平臺(tái)移動(dòng)應(yīng)用程序的快速開(kāi)發(fā)平臺(tái)。 這個(gè)項(xiàng)目做得比較早,當(dāng)時(shí)是基于ionic1和angular1做的。做了四個(gè)tabs的app,首頁(yè)模仿攜程首頁(yè),第二頁(yè)主要是phonegap調(diào)用手機(jī)核心功能,第三頁(yè)模仿微信和qq聊天頁(yè),第四頁(yè)模仿一般手機(jī)的表單設(shè)...

    孫淑建 評(píng)論0 收藏0
  • 用typescript開(kāi)發(fā)手勢(shì)庫(kù) - (1)web開(kāi)發(fā)常用手勢(shì)有哪些?

    這只是個(gè)開(kāi)頭 說(shuō)在最前面,本文是一個(gè)系列文章的開(kāi)頭, 這個(gè)系列里我會(huì)講如何用typescript開(kāi)發(fā)一款支持pc和手機(jī)端的手勢(shì)庫(kù)any-touch, 以及通過(guò)jest讓你的代碼測(cè)試覆蓋率100%. showImg(https://segmentfault.com/img/bVbp3B0?w=936&h=246); 目錄 用TypeScript開(kāi)發(fā)手勢(shì)庫(kù) - (2)tsconfig.json & r...

    raise_yang 評(píng)論0 收藏0
  • GitHub 值得收藏的前端項(xiàng)目[每月更新...]

    摘要:也是一款優(yōu)秀的響應(yīng)式框架站點(diǎn)所使用的一套框架為微信服務(wù)量身設(shè)計(jì)的一套框架一組很小的,響應(yīng)式的組件,你可以在網(wǎng)頁(yè)的項(xiàng)目上到處使用一個(gè)可定制的文件,使瀏覽器呈現(xiàn)的所有元素,更一致和符合現(xiàn)代標(biāo)準(zhǔn)。 GitHub 值得收藏的前端項(xiàng)目 整理與收集的一些比較優(yōu)秀github項(xiàng)目,方便自己閱讀,順便分享出來(lái),大家一起學(xué)習(xí),本篇文章會(huì)持續(xù)更新,版權(quán)歸原作者所有。歡迎github star與fork 預(yù)...

    maxmin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<