谈一谈移动端300ms点击延迟

  • 有时候我们会发现,用手机浏览网站的时候,点击之后总会有一些小小的延迟,才能触发我们想要的点击效果。

  • 原因:浏览器要进行一次缩放判断,如果你是快速的双击,就应该去缩放页面,顾会有300ms延迟来进行该判断。

  • 具体原因:在很久很久以前,智能手机刚出现的时候,大多数网站还都没有移动化,但是人们在手机浏览器上还是可以访问到网站的。于是由于手机的屏幕十分小,浏览到的页面会变得十分小。(为了可访问性,浏览器厂商默认把viewpoint视口的宽度设置为了980px,也有部分不太相同的。为的是强行把网站缩放到手机屏幕可以全部浏览。理解这个地方还需要对虚拟像素、物理像素和视口的一些知识,可以百度得到)于是就缩放页面就成了一个很重要的需求,毕竟没有人乐意看十分小的字。于是就造成了这个双击缩放的事件,随之带来了300ms延迟的响应。

  • 现状:如今智能手机越来越普及了,很多网站都做了响应式适配或者为移动端开发了m站,专门适配手机,也就使缩放显得不是十分有必要了,而300ms的延迟还是会在一定程度上影响客户体验。

  • 移动端点击事件基本知识
    点击事件触发的顺序 touchstart -> touchend -> mousedown -> mouseup -> click
    在touchstart和touchend中使用preventDefault()方法可以取消点击事件,同时也会取消对表单的focus事件
    在mousedown mouseup mousemove中调用preventDefault()方法并不能取消click事件

  • 解决办法及其优劣
    1.设置<meta name="viewport" content="user-scalable=no" />
    既然是双击缩放的锅,那么我们直接禁止用户缩放,自然也就咩有了300ms延迟。但是缺点也很明显,即阻止了双击缩放,也阻止了两个手指的缩放,再有这个需求的时候显得很尴尬
    2.设置<meta name="viewport" content="width=device-width, initial-scale=1">
    较高级的浏览器都会在看到这个meta标签的时候都会移除300ms的点击判断。
    缺点大概就是如果你需要兼容很低版本的浏览器,最好先测试一下这个标签能不能有效果,因为真的很少浏览器在设置这个标签后还会有300ms的点击延迟
    3.使用zepto的tap事件
    从原理上说是监听touchstart和touchend 在结束的时候模拟一个tap事件并触发他,来获得与touchend同时相应的效果。
    会有点透的问题(这个问题可以百度google一下,不详细说了)就是因为并没有做事件的取消,导致上层tap后,300ms过后点击事件作用在了下层元素上。
    并且不利于做移动pc端的统一,需要给两个端绑定不同的事件,比较麻烦
    4.使用fastclick库
    从原理上说也是监听touchstart和touchend事件,在结束的时候模拟一个click事件并立即触发他,同时取消300ms后应该触发的click事件。
    这个库很棒,但是会增加项目体积。也会出现一些focus事件上的小bug。

  • fastclick源码
    网上已经有了许多fastclick的源码注释,喜欢看的可以自行研究一下(还是可以学到一些api和一些有趣的bug及对点击事件处理有更加好的认识)。该库的整体思路也已经在上面说过了,也做了很多兼容性的处理。不过这个库已经很久没更新了,按照我现在的测试结果来看库里的对是否需要fastclick检验已经没有再更新了(例如ios的一些系统已经可以用meta标签来避免300ms的延迟
    github官网上说的并不是很全面,通过看源码与自己测试得出以下情况并不需要fastclick

    • chrome系列 版本 >= 32 并设置了meta标签的安卓 || 其他系统的chrome
    • 黑莓 版本>= 10 并设置了meta标签
    • IE10 设置了-ms-touch-action: none or manipulation
    • IE11 设置了touch-action: none or manipulation
    • 火狐 版本>=27 并设置了meta标签
    • IOS 测试了较高版本的IOS都没有什么问题(自己测试的,源码里认为IOS设备都需要fastclick)
  • 最后的建议
    如果不需要兼容很低的浏览器,尽量使用meta标签来解决,很完美没有什么副作用,不用引库体积也小。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容