H5單頁面手勢滑屏切換原理

H5單頁面手勢滑屏切換是采用HTML5 觸摸事件(Touch) 和 CSS3動畫(Transform,Transition)來實現(xiàn)的,效果圖如下所示

111.jpg

1呀忧、實現(xiàn)原理

假設(shè)有5個頁面欺冀,每個頁面占屏幕100%寬咏闪,則創(chuàng)建一個DIV容器viewport发绢,將其寬度(width) 設(shè)置為500%陵且,然后將5個頁面裝入容器中辞色,并讓這5個頁面平分整個容器,最后將容器的默認位置設(shè)置為0,overflow設(shè)置為hidden,這樣屏幕就默認顯示第一個頁面僚碎。

<div id="viewport" class="viewport"> <div class="pageview" style="background: #3b76c0" > <h3 >頁面-1</h3> </div> <div class="pageview" style="background: #58c03b;"> <h3>頁面-2</h3> </div> <div class="pageview" style="background: #c03b25;"> <h3>頁面-3</h3> </div> <div class="pageview" style="background: #e0a718;"> <h3>頁面-4</h3> </div> <div class="pageview" style="background: #c03eac;"> <h3>頁面-5</h3> </div> </div>

CSS樣式:

.viewport{ width: 500%; height: 100%; display: -webkit-box; overflow: hidden; pointer-events: none; -webkit-transform: translate3d(0,0,0); backface-visibility: hidden; position: relative; }

啟用touchstart,touchmove和touchend事件揽涮,當手指在屏幕上滑動時,使用CSS3的transform來實時設(shè)置viewport的位置抠藕,比如要顯示第二個頁面,就設(shè)置viewport的transform:translate3d(100%,0,0) 即可蒋困, 在這里我們使用translate3d來代替translateX盾似,translate3d可以主動開啟手機GPU加速渲染,頁面滑動更流暢雪标。

2零院、主要思路
從手指放在屏幕上、滑動操作村刨、再到離開屏幕是一個完整的操作過程告抄,對應(yīng)的操作會觸發(fā)如下事件:

手指放在屏幕上:ontouchstart

手指在屏幕上滑動:ontouchmove

手指離開屏幕:ontouchend

我們需要捕獲觸摸事件的這三個階段來完成頁面的滑動:

ontouchstart: 初始化變量, 記錄手指所在的位置,記錄當前時間

/*手指放在屏幕上*/ document.addEventListener("touchstart",function(e){ e.preventDefault(); var touch = e.touches[0]; startX = touch.pageX; startY = touch.pageY; initialPos = currentPosition; //本次滑動前的初始位置 viewport.style.webkitTransition = ""; //取消動畫效果 startT = new Date().getTime(); //記錄手指按下的開始時間 isMove = false; //是否產(chǎn)生滑動 }.bind(this),false);

ontouchmove: 獲得當前所在位置,計算手指在屏幕上的移動差量deltaX,然后使頁面跟隨移動

/*手指在屏幕上滑動嵌牺,頁面跟隨手指移動*/ document.addEventListener("touchmove",function(e){ e.preventDefault(); var touch = e.touches[0]; var deltaX = touch.pageX - startX; var deltaY = touch.pageY - startY; //如果X方向上的位移大于Y方向打洼,則認為是左右滑動 if (Math.abs(deltaX) > Math.abs(deltaY)){ moveLength = deltaX; var translate = initialPos + deltaX; //當前需要移動到的位置 //如果translate>0 或 if (translate = maxWidth){ //移動頁面 this.transform.call(viewport,translate); isMove = true; } direction = deltaX>0?"right":"left"; //判斷手指滑動的方向 } }.bind(this),false);

ontouchend:手指離開屏幕時,計算屏幕最終停留在哪一頁逆粹。首先計算手指在屏幕上的停留時間deltaT,如果deltaT

(1)如果是快速滑動募疮,則讓當前頁面完整的停留在屏幕中央(需要計算當前頁面還有多少需要滑動)

(2)如果是慢速滑動,還需要判斷手指在屏幕上滑動的距離僻弹,如果滑動的距離沒有超過屏幕寬度50%阿浓,則要回退到上一頁,相反則要停留在當前頁面

/*手指離開屏幕時蹋绽,計算最終需要停留在哪一頁*/ document.addEventListener("touchend",function(e){ e.preventDefault(); var translate = 0; //計算手指在屏幕上停留的時間 var deltaT = new Date().getTime() - startT; if (isMove){ //發(fā)生了左右滑動 //使用動畫過渡讓頁面滑動到最終的位置 viewport.style.webkitTransition = "0.3s ease -webkit-transform"; if(deltaT //如果停留時間小于300ms,則認為是快速滑動芭毙,無論滑動距離是多少,都停留到下一頁 translate = direction == 'left'? currentPosition-(pageWidth+moveLength):currentPosition+pageWidth-moveLength; //如果最終位置超過邊界位置蟋字,則停留在邊界位置 translate = translate > 0 ? 0 : translate; //左邊界 translate = translate //右邊界 }else { //如果滑動距離小于屏幕的50%稿蹲,則退回到上一頁 if (Math.abs(moveLength)/pageWidth moveLength; }else{ //如果滑動距離大于屏幕的50%,則滑動到下一頁 translate = direction == 'left'? currentPosition-(pageWidth+moveLength):currentPosition+pageWidth-moveLength; translate = translate > 0 ? 0 : translate; translate = translate maxWidth : translate; } } //執(zhí)行滑動鹊奖,讓頁面完整的顯示到屏幕上 this.transform.call(viewport,translate); } }.bind(this),false);

除此之外苛聘,還要計算當前頁面是第幾頁,并設(shè)置當前頁碼

//計算當前的頁碼 pageNow = Math.round(Math.abs(translate) / pageWidth) + 1;

setTimeout(function(){ //設(shè)置頁碼,DOM操作需要放到子線程中设哗,否則會出現(xiàn)卡頓 this.setPageNow(); }.bind(this),100);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唱捣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子网梢,更是在濱河造成了極大的恐慌震缭,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件战虏,死亡現(xiàn)場離奇詭異拣宰,居然都是意外死亡,警方通過查閱死者的電腦和手機烦感,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門巡社,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人手趣,你說我怎么就攤上這事晌该。” “怎么了绿渣?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵朝群,是天一觀的道長。 經(jīng)常有香客問我中符,道長姜胖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任舟茶,我火速辦了婚禮谭期,結(jié)果婚禮上堵第,老公的妹妹穿的比我還像新娘吧凉。我一直安慰自己,他們只是感情好踏志,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布阀捅。 她就那樣靜靜地躺著,像睡著了一般针余。 火紅的嫁衣襯著肌膚如雪饲鄙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天圆雁,我揣著相機與錄音忍级,去河邊找鬼。 笑死伪朽,一個胖子當著我的面吹牛轴咱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼朴肺,長吁一口氣:“原來是場噩夢啊……” “哼窖剑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起戈稿,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤西土,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鞍盗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體需了,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年般甲,在試婚紗的時候發(fā)現(xiàn)自己被綠了援所。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡欣除,死狀恐怖住拭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情历帚,我是刑警寧澤滔岳,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站挽牢,受9級特大地震影響谱煤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜禽拔,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一刘离、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧睹栖,春花似錦硫惕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至曼氛,卻和暖如春豁辉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舀患。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工徽级, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人聊浅。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓餐抢,卻偏偏與公主長得像堵幽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子弹澎,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Meta 基礎(chǔ)知識: H5 頁面窗口自動調(diào)整到設(shè)備寬度朴下,并禁止用戶縮放頁面。 空白頁基本 meta 標簽 其他 m...
    Dimen_閱讀 1,000評論 2 4
  • H5頁面窗口自動調(diào)整到設(shè)備寬度苦蒿,并禁止用戶縮放頁面//一殴胧、HTML頁面結(jié)構(gòu) // width 設(shè)置viewp...
    tiandashu閱讀 16,721評論 0 9
  • meta基礎(chǔ)知識 H5頁面窗口自動調(diào)整到設(shè)備寬度,并禁止用戶縮放頁面 忽略將頁面中的數(shù)字識別為電話號碼 忽略And...
    Mycro閱讀 588評論 0 2
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,182評論 25 707
  • 前提工作 安裝后數(shù)據(jù)庫 數(shù)據(jù)庫初始化完畢 對數(shù)據(jù)庫進行操作 開始 大概步驟 1.新建一個空的項目2.新建一個.pc...
    YuWenHaiBo閱讀 535評論 0 0