请详解移动端点透,为什么会发生点透?描述发生的场景及解决方案
点透场景:层A覆盖在层B上面,常见的有对话框等,层A用touchstart或者tap(zepto)事件点击进行隐藏或者移开,由于click晚于touchstart,超过300ms,当层A隐藏后,click到的是下面的层B,此时层B的click事件会触发,或者其上的a连接会跳转,input,select会掉起键盘
点透出现的原因:点透问题出现的原因是因为移动端click事件300ms延迟问题,当点击上层元素时,先触发touchstart事件,然后300ms后会触发click事件,而此时上层元素已经消失,所以下面的元素会触发click事件,这就是点透
点透解决方案:1,使用一个透明遮罩,屏蔽所有事件,然后400ms(对于IOS来说是个理想值)后自动屏蔽
2,touchstart换成touchend,因为触发touchend需要200ms所以可以把触发时间这个原理问题解决掉
3,zepto最新版已经修复了这个问题,或者使用fastclick等通用库
4,直接使用click,不考虑延迟
5,下层避开click事件,如a链接改为span等标签,使用js跳转页面
移动端为什么会有一像素问题?如何解决?
因为手机屏幕分辨率的差异,高清屏幕上的1px实际上由2*2个像素来渲染,有的屏幕甚至用到了3*3个像素点,所以在实际代码中,设置1px的边框,会渲染成2px
解决方案:
1,先使用伪类元素实现边框效果,然后通过媒体查询来操控 transfrom:scale来适配不同的分辨率
2,直接使用border-image来代替border
3,使用rem
移动端的常见问题
点击背景 :在移动端中,点击可点击元素时,安卓下会出现淡蓝色背景,ios下会出现灰色背景,可以通过-webkt-tap-hightlight-color属性的设置,取消点击时出现的背景效果
【鼠标事件】
由于移动设备没有鼠标,所以与电脑端有一些不同之处
1、不支持dblclick双击事件。在移动设备中双击浏览器窗口会放大画面
2、单击元素会触发mousemove事件
3、两个手指放在屏幕上且页面随手指移动而滚动时会触发mousewheel和scroll事件
【圆角】:IOS下,input域只显示底边框时,会出现两个底部底边圆角效果,设置border-radius:0即可
【禁止选中】:有时不希望用户在网站上选择文本,或许是出于版权的原因,如电子书网站。通常使用js来实现
另一个方案就是,将-webkit-user-select设为none
【禁止文字缩放】 部分手机上,切换横竖屏时,会缩放字体。使用如下设置,可以禁止文字缩放
*{
-webkit-text-size-adjust:100%;
}