一、前言

移动端浏览器提供一个特殊的功能:双击(double tap)缩放。

二、移动端延迟300ms的原因

为什么要用触摸事件?触摸事件是移动端浏览器特有的html5事件。

因为移动端的click有很大延迟(大约300ms),300ms延迟来自判断双击和长按,因为只有默认等待时间结束以确定没有后续动作发生时,才会触发click事件。而触摸事件的延迟则是非常短的,使用触摸事件的能够提高页面响应速度,带来更好的用户体验。

重点:由于移动端会有双击缩放的这个操作,因此浏览器在click之后要等待300ms,看用户有没有下一次点击,也就是这次操作是不是双击。

三、浏览器开发商的解决方案

1、方案一:禁用缩放

当HTML文档头部包含如下meta标签时:

表明这个页面是不可缩放的,那双击缩放的功能就没有意义了,此时浏览器可以禁用默认的双击缩放行为并且去掉300ms的点击延迟。

缺点:就是必须通过完全禁用缩放来达到去掉点击延迟的目的,然而完全禁用缩放并不是我们的初衷,我们只是想禁掉默认的双击缩放行为,这样就不用等待300ms来判断当前操作是否是双击。但是通常情况下,我们还是希望页面能通过双指缩放来进行缩放操作,比如放大一张图片,放大一段很小的文字。

2、方案二:更改默认的视口窗口

为了让桌面站点能在移动端浏览器正常显示,移动端浏览器默认的视口宽度!=设备浏览器视窗宽度,而是视口宽度要比设备宽度大,通常是980px。

我们可以通过以下标签来设置视口宽度为设备宽度。

对移动端坐过适配和优化了,这个时候就不需要双击缩放了。如果能够识别出一个网站是响应式的网站,那么移动端浏览器就可以自动禁掉默认的双击缩放行为并且去掉300ms的点击延迟。如果设置了上述meta标签,那浏览器就可以认为该网站已经对移动端做过了适配和优化,就无需双击缩放操作了。

这个方案相比方案一的好处在于,它没有完全禁用缩放,而只是禁用了浏览器默认的双击缩放行为,但用户仍然可以通过双指缩放操作来缩放页面。

方案三:css 的 touch-action

除了IE之外的大部分浏览器都不支持这个新的CSS属性。touch-action这个CSS属性。这个属性指定了相应元素上能够触发的用户代理(也就是浏览器)的默认行为。如果将该属性值设置为touch-action: none,那么表示在该元素上的操作不会触发用户代理的任何默认行为,就无需进行300ms的延迟判断。

四、代码解决方案

1、方案一:指针事件polyfill

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

(2)微软的HandJS

关心的不是指针事件,而是与300ms延迟相关的CSS属性touch-action。由于除了IE之外的大部分浏览器都不支持这个新的CSS属性,所以这些指针事件的polyfill必须通过某种方式去模拟支持这个属性。一种方案是JS去请求解析所有的样式表,另一种方案是将touch-action作为html标签的属性。

2、方案二:FastClick

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

五、点击穿透问题

说完移动端点击300ms延迟的问题,还不得不提一下移动端点击穿透的问题。既然click点击有300ms的延迟,那对于触摸屏,我们直接监听touchstart事件不就好了吗?

使用touchstart去代替click事件有两个不好的地方。

第一:touchstart是手指触摸屏幕就触发,有时候用户只是想滑动屏幕,却触发了touchstart事件,这不是我们想要的结果;

第二:使用touchstart事件在某些场景下可能会出现点击穿透的现象。

1、什么是点击穿透?

假如页面上有两个元素A和B。B元素在A元素之上。我们在B元素的touchstart事件上注册了一个回调函数,该回调函数的作用是隐藏B元素。我们发现,当我们点击B元素,B元素被隐藏了,随后,A元素触发了click事件。

这是因为在移动端浏览器,事件执行的顺序是touchstart > touchend > click。而click事件有300ms的延迟,当touchstart事件把B元素隐藏之后,隔了300ms,浏览器触发了click事件,但是此时B元素不见了,所以该事件被派发到了A元素身上。如果A元素是一个链接,那此时页面就会意外地跳转。

2、点击穿透现象3种情况

(1)点击穿透问题:点击蒙层(mask)上的关闭按钮,蒙层消失后发现触发了按钮下面元素的click事件。

(2)跨页面点击穿透问题:如果按钮下面恰好是一个有href属性的a标签,那么页面就会发生跳转因为 a标签跳转默认是click事件触发 ,所以原理和上面的完全相同

(3)点击穿透问题:这次没有mask了,直接点击页内按钮跳转至新页,然后发现新页面中对应位置元素的click事件被触发了。

3、解决方案

2种思路:

(1)不要混用touch和click。既然touch之后300ms会触发click,只用touch或者只用click就自然不会存在问题了。

(2)用掉(或者说是消费掉)touch之后的click。依旧用tap,只是在可能发生点击穿透的情形做额外的处理,拿个东西来挡住、或者tap后延迟350毫秒再隐藏mask、pointer-events、在下面元素的事件处理器里做检测(配合全局flag)

详细方案:

(1)只用touch

最简单的解决方案,完美解决点击穿透问题。

把页面内所有click全部换成touch事件 touchstart 、’touchend’、’tap’, 需要特别注意 a标签,a标签的href也是click,需要去掉换成js控制的跳转,或者直接改成span + tap控制跳转。

(2)只用click

下下策 ,因为会带来300ms延迟,页面内任何一个自定义交互都将增加300毫秒延迟,想想都慢。不用touch就不会存在touch之后300ms触发click的问题。

(3)拿个东西挡住

比较笨的方法, 千万不要用。

(4)tap后延迟350ms再隐藏mask

改动最小,缺点是隐藏mask变慢了,350ms还是能感觉到慢的。

(5)pointer-events

比较麻烦且有缺陷, 不建议使用。mask隐藏后,给按钮下面元素添上 pointer-events: none; 样式,让click穿过去,350ms后去掉这个样式,恢复响应。缺陷是mask消失后的的350ms内,用户可以看到按钮下面的元素点着没反应,如果用户手速很快的话一定会发现。

(6)在下面元素的事件处理器里做检测(配合全局flag)

比较麻烦, 不建议使用。全局flag记录按钮点击的位置(坐标点),在下面元素的事件处理器里判断event的坐标点,如果相同则是那个可恶的click,拒绝响应。

(7)fastclick

好用的解决方案,不介意多加载几KB的话, 不建议使用 ,因为有人遇到了bug,

首先引入fastclick库,再把页面内所有touch事件都换成click,其实稍微有点麻烦,建议引入这几KB就为了解决点透问题不值得,不如用第一种方法呢。

移动端300ms延迟_移动端延迟300ms的原因以及解决方案相关推荐

  1. js移动端调试控制台_移动端js调试工具:eruda

    通常写前端页面都在Chrome浏览器的开发模式下进行调试,但是写放在移动端的H5页面时,有时候会遇到在Chrome上调试没有问题,但是在手机的浏览器上有问题的情况:或者有些功能只能在特定的容器中才能其 ...

  2. ui设计移动端字体适配_移动端UI设计规范全方位汇总(附演示PPT下载)

    很多新人在开始做移动端UI设计的时候,往往对界面的一些尺寸规范不是十分清楚,对做UI设计的基础概念也没有清晰的认识,很多时候都是凭借自己的感觉和经验去绘制界面,心里并没有一个清晰的概念,导致做出来的页 ...

  3. 什么是端到端训练测试_为什么端到端测试对您的团队很重要

    什么是端到端训练测试 by Phong Huynh 由Phong Huynh 为什么端到端测试对您的团队很重要 (Why End-to-End Testing is Important for You ...

  4. 移动端web设计尺寸_移动端页面设计规范尺寸大起底

    移动端尺寸繁多,包括IOS和安卓,尺寸多达十余种,所以移动页面尺寸的适配一直是前端和设计的头疼.今天来总结一下当前市场上的一些移动端尺寸,方便设计师和前端去考虑适配.但是最好还是针对自己的产品做调查, ...

  5. bootstrap怎么在移动端横向布局_移动端筛选中的「不限」到底该怎么用

    移动端筛选再常见不过了-- 我们在租房时,对于户型.朝向都要要求时会用到多项筛选:我们在找工作时,对薪资和工作经验也会做多项筛选的限制 下图所示的就是比较常见的移动端多项筛选样式: ­­­­ 那么在工 ...

  6. 移动端web设计尺寸_移动端H5页面的设计稿尺寸大小规范

    当我们在做手机端H5网页设计稿时(当然包含微信端的H5网页设计),如果没有做过类似的移动端的设计,UI设计师和前端工程师肯定会纠结的.如果是app设计师,就不会那么纠结啦. 那么多手机屏幕尺寸,设计稿 ...

  7. ui设计移动端字体适配_移动端UI界面设计:APP字体排版设计的七个原则

    再来谈移动端APP字体排版设计,也许有人会说,这个还有什么好说的呢?但是真正能够运用好APP字体设计的人还真的不多.不信,我们往下看看这个7个移动端字体设计原则吧! 1. 留足空间 与普遍观点恰好相反 ...

  8. ui设计移动端字体适配_移动端字体ui设计 移动端界面设计规范

    做字体设计和图标设计,应该攻读什么专业? UI设计需要学习几个月能找工作? 您好:关于需要学习几个月才能找到一份工作,我的理解和建议如下: 1?由于UI只是设计者手中的一个工具,它是表达内部设计思想的 ...

  9. 移动端web设计尺寸_移动端H5页面的设计稿尺寸(上)

    由于HTML5和微信内置浏览器的火爆,移动端H5网页越发流行.在设计制作移动端网页的时候,你是否疑惑,这种网站设计稿应该做成的多少屏宽,是否应该跟手机的分辨率一致,还是应该按照iPhone的分辨率来设 ...

  10. tcgames使用有延迟_刺激战场延迟卡顿怎么办

    玩吃鸡应该大部分都用过模拟器和tcgames吧,一个是在电脑上下载游戏键鼠玩,一个是把手机投屏在电脑上键鼠玩;一个匹配模拟器玩家一个匹配手机玩家.模拟器就不多说了,只要你的电脑配置足够好,自己设置一下 ...

最新文章

  1. vue2.0笔记《二》组件
  2. Ubuntu下添加定时任务执行php文件
  3. 配置树莓派linux的内核和编译并将镜像拷贝至树莓派
  4. 低功耗远距离lora模块:SX1262与SX1278、SX1276射频无线收发器芯片对比分析以及选型指南
  5. EMA算法的C#实现
  6. 【MySQL】MySQL STRAIGHT JOIN 使用案例以及简介
  7. 第三:Pytest框架之命令行参数(一)
  8. redis zset转set 反序列化失败_关于Redis中的五种数据结构,要知其然知其所以然...
  9. python自学行吗-零基础如何学习Python?看Python视频就可以吗?
  10. 有Excel、Tableau、PowerBI都能做数据分析,为什么还要用Python
  11. mysql中表示金钱的类型
  12. No package ‘dconf‘ found
  13. 堆载预压弹性变形怎样计算公式_真空预压排水固结法原理特点与优缺点
  14. 线性变换与矩阵的一一映射
  15. 泛微为芯片行业搭建数字化平台:研发、生产、销售、文档一体管理
  16. dw新建一个html网页,Dreamweaver创建网页的基本方法
  17. 在线制作网站sitemap并提交
  18. 广告词 android,o泡果奶软件-o泡果奶广告词apk预约 v1.0_5577安卓网
  19. txt文档批量合并解决数据处理问题
  20. 商标被抢注的坑,自媒体人如何主动避开?

热门文章

  1. 《数据结构课程设计》实验预习
  2. 卢松松:寄生式创业更容易成功
  3. [维修笔记]关于红米2A手机无限重启的维修
  4. 软件License设计思路与实现方案
  5. 南京南汽技工学校计算机专业是啥,计算机中心附近技术类学校
  6. 506 Relative Ranks 相对排名
  7. 计算机更换固态硬盘方法,换SSD不重装系统的方法
  8. 有吧友需要PDF的下载站点,好吧,我这边汇总一下
  9. UVM_1:UVM介绍
  10. 关于int.prase的一些解析