移动端知识

移动端知识

理解click的300ms的延迟响应

Click事件在移动手机开发中有300ms的延迟,因为在手机早期,浏览器系统有放大和缩放功能,用户在屏幕上点击两次之后,系统会触发放大或者缩放功能,因此系统做了一个处理,当触摸一次后,在300ms这段时间内有没有触摸第二次,如果触摸了第二次的话,说明是触发放大或缩放功能,否则的话是click事件。
因此当click时候,所有用户必须等待于300ms后才会触发click事件。所以当在移动端使用click事件的时候,会感觉到有300ms的迟钝。

如何解决移动端Click事件300ms延迟的问题?

禁止用户缩放

通过完全禁用缩放来达到去掉点击延迟的目的

<meta name="viewport" content="user-scalable=no">
<meta name="viewport" content="initial-scale=1,maximum-scale=1">

优点:高效,简洁
缺点:通常情况下,我们还是希望页面能通过双指缩放来进行缩放操作,比如放大一张图片,放大一段很小的文字。

判断是否设置了上述meta标签,来处理缩放功能

双击缩放主要是用来改善桌面站点在移动端浏览体验的,而随着响应式设计的普及,很多站点都已经对移动端坐过适配和优化了,这个时候就不需要双击缩放了,如果能够识别出一个网站是响应式的网站,那么移动端浏览器就可以自动禁掉默认的双击缩放行为并且去掉300ms的点击延迟。

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

使用zepto.js的tap事件

tap事件可以理解为在移动端的click事件,而zepto.js因为几乎完全复制jQuery的api,因此常常被用在h5的开发上用来取代jquery

缺陷: 点击穿透:如果一个绝对定位或者固定定位元素处于页面最顶层,对这个元素绑定一个点击事件,那么你点击这个点对应的下面凡是有点击事件或者a标签都会被触发执行.

FastClick.js

FastClick的实现原理是在检测到touchend事件的时候,会通过DOM自定义事件立即出发模拟一个click事件,并把浏览器在300ms之后的click事件阻止掉。

  • npm install fastclick -S
  • //引入
    import fastClick from ‘fastclick’
    //初始化FastClick实例。在页面的DOM文档加载完成后
    fastClick.attach(document.body)

使用fastClick使得ios唤启软键盘,触点不是很灵敏
解决方法:重写fastClick 设置焦点targetElement.focus();

import FastClick from 'fastclick'

FastClick.attach(document.body)
FastClick.prototype.focus = function(targetElement) {
  var length;
  if (deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time' && targetElement.type !== 'month' && targetElement.type !== 'email') {
    length = targetElement.value.length;
    targetElement.focus();
    targetElement.setSelectionRange(length, length);
  } else {
    targetElement.focus();
  }
};

em/rem/meta

em:相对于父元素,相对于当前元素的font-size。
rem:相对于根元素,跟整个body的font-size有关系。
meta:指定浏览器的适口,适口就是可以看见的区域。
layout viewport :默认适口
visual viewport:可视区域
ideal viewport:理想化的适口

vm / vh 与 rem

rem:
需要动态设置根尺寸font-size。
用户无法设置更大字体(因为有一个动态指定字体的过程,所以用户很难再去处理这个字体)。
vw / vh:
自动缩放/不影响字体
兼容性差

上一篇:opencv中对图片的二值化操作并提取特定颜色区域


下一篇:记录下hbuilder vue项目打包APP 在IOS上点击延迟的问题