摘要:移動(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:
123456
效果圖1(這些色塊都可以隨意拖動(dòng)):
代碼事例2:
移動(dòng)端觸摸滑動(dòng)
效果圖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
摘要:有二維碼掃描功能,還做了類似消息可拖拽效果,上拉下拉刷新,輪播圖組件。特別適合用于基于模式的移動(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è)...
這只是個(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...
摘要:也是一款優(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ù)...
閱讀 1792·2021-11-24 09:39
閱讀 1591·2021-11-16 11:54
閱讀 3530·2021-11-11 16:55
閱讀 1732·2021-10-14 09:43
閱讀 1468·2019-08-30 15:55
閱讀 1262·2019-08-30 15:54
閱讀 3451·2019-08-30 15:53
閱讀 1368·2019-08-30 14:18