touch-action踩坑(touch&go)

boyanx6天前技术教程2

使用css touch-action的原因

在其官方的说明中:是否,以及以何种方式,给定的区域,可以由用户通过触摸屏操作(例如,通过平移或缩放内置的浏览器功能)

但我最初并不是因为这个来使用它的,后续会补充一篇使用这个特性做出来的效果。我用这个属性是因为自己在使用antd-mobile的走马灯时候,在控制台代码警告,内容是这样的:

[Intervention] Unable to preventDefault inside passive event listener due to target being treated as passive. See…

看到这样的报错,作为程序员,职业病肯定是要查看原因的,虽然不影响正常使用。经过查阅,其简单的描述就是这样的:Passive event listeners,做了移动端的优化。看完一脸懵逼。其实就是是否阻止默认事件200ms延迟然后再执行滚动行为,而之前的fastclick就是通过去掉这部分来避免点击延迟的。

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.

然后知道原因不够,解决方案是什么?

能搜到的方案是两种,一种是通过css方式,一种是通过js的方式。

css方式:比较简单

touch-action:none

js方式:在touch的事件监听方法上绑定第三个参数{ passive: false }

elem.addEventListener(
 'touchstart',
 fn,
 { passive: false }
);

使用touch-action之后,问题来了

然后当然是开心的用第一种方案把这行css写到全局中,结果就带来了灾难。

什么问题呢?就是ios基本都可以的,但是安卓中的页面滚动都没了。这是为什么呢?这个就要看下touch-action的更官方的触摸说明了。

> 默认情况下,平移(滚动)和捏手势由浏览器独占处理。当浏览器开始处理触摸手势时,使用的应用程序Pointer_events将收到一个pointercancel事件。

> 通过明确指定浏览器应该处理哪些手势,应用程序可以为其余手势提供自己的行为,pointermove并pointerup为其余的手势提供监听器。应用程序使用Touch_events。

> 通过调用禁用浏览器处理手势preventDefault(),但也应该使用触摸动作来确保浏览器在调用任何事件侦听器之前知道应用程序的意图。当手势开始时,浏览器将触摸元素及其所有祖先的触摸动作值与实现手势的触摸动作值(换句话说,第一个包含滚动元素)相交。

> 这意味着在实践中,触摸动作通常只应用于具有一些自定义行为的单个元素,而不需要在该元素的任何后代上明确指定触摸动作。手势开始后,触摸动作值的更改将不会对当前手势的行为产生任何影响。

简单点说,就是这段话阐明的就是触摸事件整个的进行过程,既然它可以通过css来约定滚动的行为,那么就意味着你写了touch-action:none,就会导致原来的页面滚动失效了。这就是安卓上无法页面滚动的原因。

为什么ios没有受影响呢,我觉得可能是ios默认支持touch事件的原因吧。

怎么解决呢

先临时把对应的touch:none,全局的写法去掉了,用了js的部分去完成或者只在控制需要的元素内进行指定这行代码。由此也总结了几个问题或者教训吧。

  • 在写全局样式的要注意影响范围
  • 在每次提交代码的时候尽可能针对不确定的部分增加备注,风险埋点。
  • 问题拿到后的冷静分析,拿到这个问题不要过于着急,还是要分析下产生问题的原因,尤其是机型。

更多延伸与拓展

通过touch-action可以做什么效果呢?

  • 禁止默认的滚动touch-action:none
  • 可以控制用户行为的处理细节,比如只接受x或者y方向的变化,来影响行为,确定行为边界
  • 优化用户多次点击造成界面所放

如果你想更好的使用滚动相关的体验,还是入手框架吧,不然坑太多,iscroll,better-scroll(一般滚动组件依赖的库).me-scroll(个人推荐)都是不错的选择。

标签: iscroll.js

相关文章

【附源码】牺牲两天摸鱼时间,我做了款大屏

项目背景 最近时间比较闲,摸鱼的时间越来越多了,人一闲下来就会想做点什么。说干就干,立马行动。 在刷了半小时 pdd 之后我买了张 ui 图,并根据这个 ui 做了一个大屏。 最终...

JavaScript 强制回流问题及优化方案

JavaScript 代码在运行过程中可能会强制触发浏览器的回流(Reflow),导致主线程被阻塞。回流(Reflow) 是浏览器重新计算页面元素布局的过程(如位置、大小等),属于高开销操作。频繁或同...

"前端开发者不可错过的技能:SSE流式传输助力实时数据更新!"

背景由于大模型通常是需要实时推理的,Web 应用调用大模型时,它的标准模式是浏览器提交数据,服务端完成推理,然后将结果以 JSON 数据格式通过标准的 HTTP 协议返回给前端。但是这么做有一个问题,...

用js实现web端录屏(js录制视频)

随着互联网技术飞速发展,网页录屏技术已趋于成熟。例如可将录屏技术运用到在线考试中,实现远程监考、屏幕共享以及录屏等;而在我们开发人员研发过程中,对于部分偶发事件,异常监控系统仅仅只能告知程序出错,而不...

不再需要 Javascript 做的五件事(js不需要编译)

作者:黄子毅有些功能用 Javascript 实现吃力不讨好,我们要综合使用技术工具,而不是只依赖 JS。这篇文章就从五个例子出发,告诉我们哪些功能不一定非要用Javascript做。关注 JS 太久...

用JavaScript开发移动原生应用,Facebook正式开源React Native!

在经过前一天Messenger应用平台、Parse物联网开发者工具等惊喜的轰炸,Facebook于今天凌晨在F8开发者大会上正式开源了React Native。不过目前,只有iOS版,Android版...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。