相信你们搜css touch-action很容易搜到一批文章,但感受本身仍是须要写下本身这这个过程当中的一些探索经历。css
之因此写,是由于单独去学知识点或者单独看一篇文章其实很简单的,难的是在本身实践中,由于一个问题找一个方案,而后又引发另一个问题,而这个不断发现问题的过程很是低效,须要各类尝试和理解。html
在其官方的说明中:是否,以及以何种方式,给定的区域,能够由用户经过触摸屏操做(例如,经过平移或缩放内置的浏览器功能)ios
但我最初并非由于这个来使用它的,后续会补充一篇使用这个特性作出来的效果。我用这个属性是由于本身在使用antd-mobile的走马灯时候,在控制台代码警告,内容是这样的:程序员
[Intervention] Unable to preventDefault inside passive event listener due to target being treated as passive. See…
复制代码
看到这样的报错,做为程序员,职业病确定是要查看缘由的,虽然不影响正常使用。通过查阅,其简单的描述就是这样的:Passive event listeners,作了移动端的优化。看完一脸懵逼。其实就是是否阻止默认事件200ms延迟而后再执行滚动行为,而以前的fastclick就是经过去掉这部分来避免点击延迟的。web
For instance, in Chrome for Android 80% of the touch events that block
scrolling never actually prevent it. 10% of these events add more than
100ms of delay to the start of scrolling, and a catastrophic delay of
at least 500ms occurs in 1% of scrolls.
复制代码
想知道更多,能够参考这篇,写的比较详细了: 移动Web滚动性能优化: Passive event listenerssegmentfault
能搜到的方案是两种,一种是经过css方式,一种是经过js的方式。 css方式:比较简单浏览器
touch-action:none
复制代码
js方式:在touch的事件监听方法上绑定第三个参数{ passive: false }性能优化
elem.addEventListener(
'touchstart',
fn,
{ passive: false }
);
复制代码
而后固然是开心的用第一种方案把这行css写到全局中,结果就带来了灾难。 什么问题呢?就是ios基本均可以的,可是安卓中的页面滚动都没了。这是为何呢?这个就要看下touch-action的更官方的触摸说明了。bash
默认状况下,平移(滚动)和捏手势由浏览器独占处理。当浏览器开始处理触摸手势时,使用的应用程序Pointer_events将收到一个pointercancel事件。 经过明确指定浏览器应该处理哪些手势,应用程序能够为其他手势提供本身的行为,pointermove并pointerup为其他的手势提供监听器。应用程序使用Touch_events。 经过调用禁用浏览器处理手势preventDefault(),但也应该使用触摸动做来确保浏览器在调用任何事件侦听器以前知道应用程序的意图。当手势开始时,浏览器将触摸元素及其全部祖先的触摸动做值与实现手势的触摸动做值(换句话说,第一个包含滚动元素)相交。 这意味着在实践中,触摸动做一般只应用于具备一些自定义行为的单个元素,而不须要在该元素的任何后代上明确指定触摸动做。手势开始后,触摸动做值的更改将不会对当前手势的行为产生任何影响。antd
文档参考来源:touch-action
这段话阐明的就是触摸事件整个的进行过程,既然它能够经过css来约定滚动的行为,那么就意味着你写了touch-action:none,就会致使原来的页面滚动失效了。这就是安卓上没法页面滚动的缘由。
为何ios没有受影响呢,我以为多是ios默认支持touch事件的缘由吧。若是你知道底层的缘由或者详细的文档说明,能够告诉我哦。
先临时把对应的touch:none,全局的写法去掉了,用了js的部分去完成或者只在控制须要的元素内进行指定这行代码。由此也总结了几个问题或者教训吧。
经过touch-action能够作什么效果呢?
说明:若是你想更好的使用滚动相关的体验,仍是入手框架吧,否则坑太多,iscroll,better-scroll(通常滚动组件依赖的库).me-scroll(我的推荐)都是不错的选择