移动端 300 毫秒延迟,怎么解决 ?

移动端 300 毫秒延迟,怎么解决?

移动端 300 毫秒延迟,指的是当没有经过特殊处理,移动端浏览器在派发点击事件的时候,通常会出现 300ms 左右的延迟。

为什么会有延迟?

1. 先说一下 300毫秒延迟的来历

    这个就是当初,也就是 2007 年的时候,苹果公司在发布首款 iPhone 前夕,遇到一个问题 ,当时的网站都是为大屏幕设备所设计的,于是苹果的工程师们做了一些约定,应对 iPhone 这种小屏幕浏览桌面端站点的问题。

这当中最出名的,就当属于双击缩放。这也就是上述 300毫秒延迟的主要原因。

那么这和 300毫秒延迟有什么联系?

假设用户在浏览器中,点击一个链接。由于是用户可以进行双击或者缩放或者其他操作,当用户一次点击屏幕之后,浏览器并不能立刻判断用户是确实要打开这个链接,还是要双击操作,因此浏览器就会等待 300 毫米,一判断用户是否再次点击了屏幕。于是这就是著名的 300 毫秒延迟。

2. 解决方案

2.1 禁止缩放

    首先看一个很直接的解决方案,既然双击缩放仅对那些 可被缩放 的页面存在意义,那可以对不可缩放的页面,直接去掉点击延迟

<meta name="viewport" content="user-scalable=no"/>

<meta name="viewport" content="initial-scale=1, maximum-scale=1">/

然而这个问题看似完美解决,但也带来了一个缺陷,就是必须完全禁止缩放来达到目的,但中移动端站点的可用性和可访问性来看,缩放是缩放是相当关键的一环。

2.2  width=device-width Meta 标签    

    除了双击缩放的预定外, iPhone 诞生时就有的另一个约定是, 在渲染桌面站点是时候,使用 980 像素的视口宽度,而非设备本身的宽度

当然,这个问题我们还可以用 <meta> 标签进行配置

<meta name="viewport" content="width=device-width"/>

这个代码就是告诉浏览器色将视口大小设为设备本身的尺寸。

因为双击缩放主要是来改善桌面站点在移动端浏览的体验,为随着响应式的普及,很多站点都已经对移动端做过适配和优化了,这就不需要双击缩放了, 既然站点内包含了 width=device-width 这个 <meta> 标签,也就意味着这个网站是响应式的网站,那么移动端浏览器就可以自动禁止掉双击缩放行为并且去掉 300ms 的点击延迟。

这个方案相对方案1 的好处在于,它没有完全禁止缩放,只是禁用了默认的双击缩放行为,但用户仍然可以通过双指缩放来缩放页面。

2.3 指针事件

指针事件最初是微软提出的。指针事件是一个新的 web  事件系列,对所有输入类型,包括 鼠标(mouse)、触摸(touch)、触控(stylus)等,进行统一处理。

也就是说浏览器不用再为不同的输入设备设计不同的事件,前端工程师也不用写不同的事件响应。而是通过统一的指针事件就可以开发不同的事件处理。一个名为 touch-action 的新 CSS 属性。

根据规范, touch-action 属性决定 “ 是否触摸操作会触发用户代理的默认行为。这包括但不限于双指缩放等行为”。

从实际应用的角度来看, touch-action 解决了用户在点击了目标元素之后,是否能够进行双指缩放后者双击缩放。因此,这也相当于完美地解决了 300 毫秒点击延迟的问题。

touch-action 默认值为 auto,将其设置 none 即可移除目标元素的 300 毫秒延迟。

3. 当前如何避免延迟

尽管浏览器开发商针对 300 毫秒延迟的问题提出了一些解决方案,当目前并没有简单通用的方案。不过好多的开发者考虑过这一问题,并带来了一些基于 JavaScript 的跨平台解决方案。这些方案可以归为两类 —— 指针事件的 polyfill 和 快速点击(fast click)。

3.1 指针事件的 polyfill

    现在除了 IE,大部分浏览器还不支持指针事件,有一些 JS 库,可以让我们使用指针事件: 比如

    - Google 的 Polymer

    - 微软的 HandJS

    - @RIch-Harris 的 Points

由于只有 IE 浏览器中可以使用 touch-action 属性,其他浏览器会被忽略,唯一能够检测开发者是否声明了 touch-action: none 的方法是使用 JavaScript 去请求解析所有的样式表。 HandJS 也是这么做的,当时不管从性能或者其他一些复杂方面,这都会遇到问题。

Polymer 则是通过判断标签上的 touch-action 属性, 而非 CSS 代码。

<a href="http://" touch-action="none"></a>

3.2 FastClick

    FastClick 是 FT Labs 专门为解决移动端浏览器 300 毫秒点击延迟问题所开发的一个轻量级库。简单来说,FastClick 在检测到 touched 事件的时候,会通过 DOM 自定义事件立即出发一个模拟 click 事件,并把浏览器在 300 毫秒之后真正触发的 click 事件阻止掉。

FastClick 的使用方法,在 window.load 事件之后, 在 <body> 上调用 FastClick.attach()

window.addEventListener("load", ()=>{

    FastClick.attach(document.body);

}, false )

并且当 FastClick 检测到当前页面使用了基于 <meta> 标签或者 touch-action 属性的解决方案时,会默默退出。

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

推荐阅读更多精彩内容