如何使移動端 “觸摸滾動” 比默認的速度更快

默認觸摸滾動 PK 優(yōu)化后觸摸滾動

我們知道滾動響應(yīng)是至關(guān)重要的在用戶移動端網(wǎng)站上觸摸的時候,然而觸摸事件監(jiān)聽器經(jīng)常會導(dǎo)致嚴重的滾動性能問題明未。Chrome已經(jīng)通過允許觸摸事件監(jiān)聽器被動地解決了這個問題(將{passive:true}選項傳遞給addEventListener())并傳遞指針事件API痘绎。這些特性可以驅(qū)動新內(nèi)容引入到不阻止?jié)L動的模型中兔毒,但開發(fā)人員有時會發(fā)現(xiàn)它們很難理解和采用。

我們認為,如果開發(fā)人員不需要了解瀏覽器行為的晦澀細節(jié)黄娘,web應(yīng)該在默認情況下是快速的。在Chrome 56中克滴,默認情況下逼争,我們將默認的觸摸監(jiān)聽器設(shè)置為被動的,而這通常與開發(fā)人員的意圖相匹配劝赔。我們相信這樣做誓焦,我們可以大大提高用戶的體驗,同時減少對站點的負面影響着帽。

在極少數(shù)情況下杂伟,這種變化會導(dǎo)致非預(yù)期的滾動。這通常是通過添加一個 touch-action: none樣式使得元素滾動不再出現(xiàn)仍翰。閱讀有關(guān)細節(jié)赫粥,如何知道你是否受到影響,以及你能做些什么予借。

背景: Cancelable 事件降低你的頁面速度

如果在touchstart或第一個touchmove事件中調(diào)用preventDefault()越平,那么您將阻止?jié)L動频蛔。問題是,大多數(shù)情況下秦叛,監(jiān)聽器不會調(diào)用preventDefault()晦溪,但是瀏覽器需要等待事件完成才能確定它。開發(fā)人員定義的“被動事件監(jiān)聽器”解決了這個問題挣跋。當您在事件處理程序中添加一個帶有{passive:true}對象作為第三個參數(shù)的觸摸事件時三圆,您將告訴瀏覽器touchstart監(jiān)聽器不會調(diào)用preventDefault(),而瀏覽器可以安全地執(zhí)行滾動浆劲,而不會阻塞監(jiān)聽器嫌术。例如:

window.addEventListener("touchstart", func, {passive: true} );

干預(yù) The Intervention

我們的主要目的是減少在用戶觸摸屏幕后更新顯示所需的時間。為了理解touchstarttouchmove的使用牌借,我們添加了一些指標來確定滾動阻塞行為發(fā)生的頻率度气。

我們看了可取消觸摸事件,被發(fā)送到根目標(窗口膨报、文檔或主體)的的百分比磷籍,并確定大約80%的監(jiān)聽器在概念上是被動的,但未被注冊為此類现柠≡毫欤考慮到這個問題的規(guī)模,我們注意到一個很大的機會够吩,可以在沒有任何開發(fā)人員操作的情況下比然,自動地passive改進滾動。

這促使我們將我們的干預(yù)定義為:如果觸點或觸控式監(jiān)聽器的目標是窗口周循、文檔或主體强法,我們默認passivetrue。代碼示例:

window.addEventListener("touchstart", func);

相當于

window.addEventListener("touchstart", func, {passive: true} );

現(xiàn)在湾笛,在監(jiān)聽器內(nèi)部調(diào)用preventDefault()將被忽略饮怯。

下面的圖顯示用戶觸摸屏幕時,從用戶觸摸屏幕到顯示更新時所花費的時間嚎研。這一數(shù)據(jù)適用于所有的安卓網(wǎng)站蓖墅。在干預(yù)之前,1%的卷軸使用了400多毫秒×侔纾現(xiàn)在已經(jīng)減少到超過250ms的Chrome 56 Beta;大約減少了38%论矾。在未來,我們希望使所有touchstarttouchmove偵聽器的默認值都是被動的杆勇,將其降低到50毫秒以下贪壳。

image.png

問題和指導(dǎo) Breakage and Guidance

在絕大多數(shù)情況下,沒有問題靶橱。但當問題發(fā)生時寥袭,最常見的癥狀是當你不想要的時候滾動路捧。在極少數(shù)情況下,開發(fā)人員還可能注意到意外的單擊事件(在touchend偵聽器中丟失了preventDefault())传黄。

在Chrome 56和稍后的版本中杰扫,當您調(diào)用preventDefault()時,DevTools將記錄一個警告膘掰,在這個事件中章姓,干預(yù)是激活的。

touch-passive.html:19 Unable to preventDefault inside passive event listener due to target being treated as passive. See https://www.chromestatus.com/features/5093566007214080

您的應(yīng)用程序可以通過檢查調(diào)用preventDefault是否通過defaultPrevented屬性來確定它是否出現(xiàn)問題识埋。

我們發(fā)現(xiàn)凡伊,只要有可能,應(yīng)用touch-actionCSS屬性就可以相對容易地修復(fù)大部分受影響頁面窒舟。 如果你希望阻止瀏覽器的滾動和縮放系忙,可以再元素中應(yīng)用touch-action: none來實現(xiàn)。你過你需要水平的滾動惠豺,可以應(yīng)用touch-action: pan-y pinch-zoom,這樣用戶仍然可以正常使用垂直滾動和縮放银还。在桌面邊緣等瀏覽器上,正確地應(yīng)用touch-action已經(jīng)是必要的了洁墙,它支持指針事件蛹疯,而不是觸摸事件。對于不支持touch-action的移動Safari和老式移動瀏覽器热监,您的觸摸監(jiān)聽器必須繼續(xù)調(diào)用preventDefault捺弦,即使它將被Chrome忽略。

在更復(fù)雜的情況下孝扛,可能還需要依賴以下的一個:

  • 如果您的touchstart監(jiān)聽器調(diào)用preventDefault()列吼,確保preventDefault()也從相關(guān)的touchend監(jiān)聽器被調(diào)用,以繼續(xù)禁止單擊事件的生成和其他默認的點擊行為疗琉。
  • 最后(不推薦)通過{passive:false}addEventListener()來覆蓋默認行為冈欢。請注意歉铝,如果用戶代理支持EventListenerOptions盈简,則必須進行功能檢測。

總結(jié) Conclusion

在Chrome 56中太示,在許多網(wǎng)站上滾動的速度要快得多柠贤。這是大多數(shù)開發(fā)人員由于這種變化而引起的惟一影響。在某些情況下类缤,開發(fā)人員可能會注意到無意識的滾動臼勉。

盡管對于移動Safari來說仍然需要這樣做,但網(wǎng)站不應(yīng)該依賴于在touchstarttouchmove監(jiān)聽器內(nèi)部調(diào)用preventDefault()餐弱,因為這不再保證在Chrome中能夠支持宴霸。開發(fā)人員應(yīng)該在滾動和縮放的元素上應(yīng)用touch-actionCSS屬性囱晴,在發(fā)生任何觸摸事件之前通知瀏覽器。要禁止點擊的默認行為(例如單擊事件生成)瓢谢,請在touchend監(jiān)聽器內(nèi)部調(diào)用preventDefault()畸写。

本文翻譯自 " Marking touch scrolling fast by default"

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市氓扛,隨后出現(xiàn)的幾起案子枯芬,更是在濱河造成了極大的恐慌,老刑警劉巖采郎,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件千所,死亡現(xiàn)場離奇詭異,居然都是意外死亡蒜埋,警方通過查閱死者的電腦和手機淫痰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來整份,“玉大人黑界,你說我怎么就攤上這事≡砹郑” “怎么了朗鸠?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長础倍。 經(jīng)常有香客問我烛占,道長,這世上最難降的妖魔是什么沟启? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任忆家,我火速辦了婚禮,結(jié)果婚禮上德迹,老公的妹妹穿的比我還像新娘芽卿。我一直安慰自己,他們只是感情好胳搞,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布卸例。 她就那樣靜靜地躺著,像睡著了一般肌毅。 火紅的嫁衣襯著肌膚如雪筷转。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天悬而,我揣著相機與錄音呜舒,去河邊找鬼。 笑死笨奠,一個胖子當著我的面吹牛袭蝗,可吹牛的內(nèi)容都是我干的唤殴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼到腥,長吁一口氣:“原來是場噩夢啊……” “哼眨八!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起左电,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤廉侧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后篓足,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體段誊,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年栈拖,在試婚紗的時候發(fā)現(xiàn)自己被綠了连舍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡涩哟,死狀恐怖索赏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贴彼,我是刑警寧澤潜腻,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站器仗,受9級特大地震影響融涣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜精钮,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一威鹿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧轨香,春花似錦忽你、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至策橘,卻和暖如春炸渡,著一層夾襖步出監(jiān)牢的瞬間娜亿,已是汗流浹背丽已。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留买决,地道東北人沛婴。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓吼畏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嘁灯。 傳聞我的和親對象是個殘疾皇子泻蚊,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

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