移動端點擊穿透的5種解決方案

移動端點擊穿透問題由來

這要追溯至 2007 年初。蘋果公司在發(fā)布首款 iPhone 前夕导匣,遇到一個問題:當時的網(wǎng)站都是為大屏幕設(shè)備所設(shè)計的。于是蘋果的工程師們做了一些約定茸时,應對 iPhone 這種小屏幕瀏覽桌面端站點的問題贡定。這當中最出名的,當屬雙擊縮放(double tap to zoom)可都,這也是會有上述 300 毫秒延遲的主要原因缓待。雙擊縮放,顧名思義渠牲,即用手指在屏幕上快速點擊兩次旋炒,iOS 自帶的 Safari 瀏覽器會將網(wǎng)頁縮放至原始比例。 那么這和 300 毫秒延遲有什么聯(lián)系呢嘱兼? 假定這么一個場景。用戶在 iOS Safari 里邊點擊了一個鏈接贤徒。由于用戶可以進行雙擊縮放或者雙擊滾動的操作芹壕,當用戶一次點擊屏幕之后,瀏覽器并不能立刻判斷用戶是確實要打開這個鏈接接奈,還是想要進行雙擊操作踢涌。因此,iOS Safari 就等待 300 毫秒序宦,以判斷用戶是否再次點擊了屏幕睁壁。 鑒于iPhone的成功,其他移動瀏覽器都復制了 iPhone Safari 瀏覽器的多數(shù)約定互捌,包括雙擊縮放潘明,幾乎現(xiàn)在所有的移動端瀏覽器都有這個功能。之前人們剛剛接觸移動端的頁面秕噪,在欣喜的時候往往不會care這個300ms的延時問題钳降,可是如今touch端界面如雨后春筍,用戶對體驗的要求也更高腌巾,這300ms帶來的卡頓慢慢變得讓人難以接受遂填。

那神馬是移動端穿透呢铲觉?假如頁面上有兩個元素A和B。B元素在A元素之上吓坚。我們在B元素的touchstart事件上注冊了一個回調(diào)函數(shù)撵幽,該回調(diào)函數(shù)的作用是隱藏B元素。我們發(fā)現(xiàn)礁击,當我們點擊B元素盐杂,B元素被隱藏了,B在300ms后產(chǎn)生的click事件由于找不到B,B會把click事件強行加給A執(zhí)行客税,這個過程就叫點擊穿透况褪,動畫如下

注意!是B先消失后A觸發(fā)click事件

分析A產(chǎn)生click事件的原因更耻,由于點擊B后B會依次發(fā)生touchstart--->touchend-->click事件测垛,但當B的touchstart事件產(chǎn)生后,B消失了秧均,B會把它的300ms后產(chǎn)生的click事件強加到它z軸下方的A上食侮,代碼如下:

<!DOCTYPE html>

<html lang="en">

<head>

? ? <meta charset="UTF-8">

?<!-- <meta name="viewport" content="width=device-width, initial-scale=1.0"> -->

? ? <meta http-equiv="X-UA-Compatible" content="ie=edge">

? ? <title>Document</title>

</head>

<body>

? ? <style>

? ? #A{

? ? ? ? font-size:50px;

? ? ? ? width:400px;

? ? ? ? height:400px;

? ? ? ? background:gray

? ? }

? ? #B{

? ? ? ? font-size:50px;

? ? ? ? width:400px;

? ? ? ? height:400px;

? ? ? ? background:blue;

? ? ? ? position:absolute;

? ? ? ? left: 200px;

? ? ? ? top: 200px;

? ? }

? ? </style>

<div id="A">A</div>

<div id="B">B:點我穿透A</div>

? ? <script>

? ? let A=document.getElementById('A')

? ? let B=document.getElementById('B')

? ? B.addEventListener('touchstart',function(){

? ? ? ? B.style.display="none"

? ? })

? ? A.addEventListener('click',function(){

? ? ? ? console.log('A:啊目胡!我被穿透了')

? ? })

? ? </script>

</body>

</html>

大家請注意我把meta標簽注釋了锯七,因為當我們在 meta標簽加上?width=device-width?和 user-scalable=0時,移動端的瀏覽器就會自動去掉click的事件300ms的延時誉己,因為我們已經(jīng)為用戶適配了頁面大小和阻止了用戶縮放眉尸,所有瀏覽器就不用判斷用戶雙擊縮放了,因此瀏覽器就自動取消了click事件300ms的延遲

那么如何消除點擊穿透呢巨双,大家先來看這張圖噪猾。

300ms延遲?

小編第一次學習解決移動端點擊穿透的時候,覺得這之間非常繞筑累,往往搞不清事件的根源袱蜡,后來用了簡單的數(shù)學分析,才覺得思路特別清晰慢宗,

首先我們先來看產(chǎn)生點擊穿透的必要條件:

1.meta標簽沒有width=device-width和?user-scalable=0

2.B(mask)蒙版在A之上坪蚁,且在點擊后B在300ms之前消失

3.B(mask)綁定的是touchstart事件,A綁定的是click事件

所以解決的方案無非就是不讓上述三種情況不發(fā)生而已镜沽,是不是瞬間腦子就靈光了敏晤。

解決方案:

1.meta?標簽設(shè)置?width=device-width?和?user-scalable=0

2.在整個項目中只用touchstart事件,缺點:a標簽的herf跳轉(zhuǎn)仍需要click事件缅茉。

3.在整個項目中只用click事件茵典,優(yōu)點:使用簡單,適合使用對用戶點擊事件響應實時性不高的? ? ? ? 應 用宾舅, 缺點:點擊仍有300ms的延遲统阿,不適合游戲類的應用

4.在點擊B后彩倚,不讓B立刻消失,給B添加一個漸進(fade)消失的動畫效果扶平,時間大于300ms? ? ? ? 就可以了

5.最后一個是我覺得是最好的解決方案帆离,消除300ms的延遲后,再使用click事件结澄,使用fastclick? ? ? ? ?(大小?10kB)這個庫來實現(xiàn)哥谷,只需要多加幾kB的大小,還是很劃算的

總結(jié):解決點擊穿透的方式還是比較多的麻献,具體使用那種方案還是結(jié)合實際項目才能決定

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末们妥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子勉吻,更是在濱河造成了極大的恐慌监婶,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件齿桃,死亡現(xiàn)場離奇詭異惑惶,居然都是意外死亡,警方通過查閱死者的電腦和手機短纵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門带污,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人香到,你說我怎么就攤上這事鱼冀。” “怎么了悠就?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵千绪,是天一觀的道長。 經(jīng)常有香客問我理卑,道長翘紊,這世上最難降的妖魔是什么蔽氨? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任藐唠,我火速辦了婚禮,結(jié)果婚禮上鹉究,老公的妹妹穿的比我還像新娘宇立。我一直安慰自己,他們只是感情好自赔,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布妈嘹。 她就那樣靜靜地躺著,像睡著了一般绍妨。 火紅的嫁衣襯著肌膚如雪润脸。 梳的紋絲不亂的頭發(fā)上柬脸,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音毙驯,去河邊找鬼倒堕。 笑死,一個胖子當著我的面吹牛爆价,可吹牛的內(nèi)容都是我干的垦巴。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼铭段,長吁一口氣:“原來是場噩夢啊……” “哼骤宣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起序愚,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤憔披,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后展运,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體活逆,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年拗胜,在試婚紗的時候發(fā)現(xiàn)自己被綠了蔗候。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡埂软,死狀恐怖锈遥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情勘畔,我是刑警寧澤所灸,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站炫七,受9級特大地震影響爬立,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜万哪,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一侠驯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奕巍,春花似錦吟策、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春匾委,著一層夾襖步出監(jiān)牢的瞬間拖叙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工赂乐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留憋沿,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓沪猴,卻偏偏與公主長得像辐啄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子运嗜,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351