前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >touch-action导致安卓页面无法滚动

touch-action导致安卓页面无法滚动

作者头像
RobinsonZhang
发布于 2018-11-12 09:05:51
发布于 2018-11-12 09:05:51
4.3K00
代码可运行
举报
运行总次数:0
代码可运行

前言

相信大家搜css touch-action很容易搜到一批文章,但感觉自己还是需要写下自己这这个过程中的一些探索经历。

之所以写,是因为单独去学知识点或者单独看一篇文章其实很简单的,难的是在自己实践中,因为一个问题找一个方案,然后又引起另外一个问题,而这个不断发现问题的过程非常低效,需要各种尝试和理解。

使用css touch-action的原因

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Intervention] Unable to preventDefault inside passive event listener due to target being treated as passive. See…

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 listeners

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

能搜到的方案是两种,一种是通过css方式,一种是通过js的方式。 css方式:比较简单

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
touch-action:none 

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
elem.addEventListener(
  'touchstart',
  fn,
  { passive: false }
);

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

然后当然是开心的用第一种方案把这行css写到全局中,结果就带来了灾难。 什么问题呢?就是ios基本都可以的,但是安卓中的页面滚动都没了。这是为什么呢?这个就要看下touch-action的更官方的触摸说明了。

默认情况下,平移(滚动)和捏手势由浏览器独占处理。当浏览器开始处理触摸手势时,使用的应用程序Pointer_events将收到一个pointercancel事件。 通过明确指定浏览器应该处理哪些手势,应用程序可以为其余手势提供自己的行为,pointermove并pointerup为其余的手势提供监听器。应用程序使用Touch_events。 通过调用禁用浏览器处理手势preventDefault(),但也应该使用触摸动作来确保浏览器在调用任何事件侦听器之前知道应用程序的意图。当手势开始时,浏览器将触摸元素及其所有祖先的触摸动作值与实现手势的触摸动作值(换句话说,第一个包含滚动元素)相交。 这意味着在实践中,触摸动作通常只应用于具有一些自定义行为的单个元素,而不需要在该元素的任何后代上明确指定触摸动作。手势开始后,触摸动作值的更改将不会对当前手势的行为产生任何影响。

文档参考来源:touch-action

说人话

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

为什么ios没有受影响呢,我觉得可能是ios默认支持touch事件的原因吧。如果你知道底层的原因或者详细的文档说明,可以告诉我哦。

怎么解决呢

先临时把对应的touch:none,全局的写法去掉了,用了js的部分去完成或者只在控制需要的元素内进行指定这行代码。由此也总结了几个问题或者教训吧。 – 在写全局样式的要注意影响范围 – 在每次提交代码的时候尽可能针对不确定的部分增加备注,风险埋点,因为这次刚好是因为用户有反馈这个问题,我想到了是加了这行代码的原因,但如果是其他时候或者过了很久,其实很难定位到是因为这行代码的原因。我遇到这个问题的时候,第一感觉还是是否是脚本错误了,是否是兼容问题。如果是这样排查的话,就会浪费比较多的时间。甚至中间还找群友讨论,他们建议是否更换为绝对定位的方案,那样就真走偏了。 – 问题拿到后的冷静分析,拿到这个问题不要过于着急,还是要分析下产生问题的原因,尤其是机型,因为我们之前做测试都是模拟器和苹果的ios,而这次报问题的都是安卓的机型,而且是小米56,坚果,华为等。联想到这些安卓机型,那么定位到可能是 :代码兼容部分的版本过低,这些不支持;代码某部分是对ios和安卓有区分解释的,和系统有关,版本无关。

更多延伸与拓展

通过touch-action可以做什么效果呢? – 禁止默认的滚动touch-action:none – 可以控制用户行为的处理细节,比如只接受x或者y方向的变化,来影响行为,确定行为边界 – 优化用户多次点击造成界面所放 – 更多等待你的发掘

更多

说明:如果你想更好的使用滚动相关的体验,还是入手框架吧,不然坑太多,iscroll,better-scroll(一般滚动组件依赖的库).me-scroll(个人推荐)都是不错的选择 – 安利一篇还不错的采坑文章: 深入研究-webkit-overflow-scrolling

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【详解】Cygwin配置sshd服务
在Windows环境下使用Cygwin可以提供一个类似Linux的环境,这对于很多习惯于Linux操作系统的开发者来说非常方便。其中,配置sshd服务可以让用户通过SSH协议远程访问Cygwin环境,极大地提高了灵活性和便利性。本文将详细介绍如何在Cygwin中配置sshd服务。
大盘鸡拌面
2025/05/14
890
右键添加管理员取得所有权右键菜单
新建记事本 复制如下内容并另存为。具体代码为: Windows Registry Editor Version 5.00 [-HKEY_CLASSES_ROOT\*\shell\runas] [HKEY_CLASSES_ROOT\*\shell\runas] @="获取超级管理员权限" "Icon"="C:\\Windows\\System32\\imageres.dll,-78" "NoWorkingDirectory"="" [HKEY_CLASSES_ROOT\*\shell\runas\
空木白博客
2019/02/10
1.5K0
解决:您需要来自xxx的权限才能对此文件夹进行更改(电脑系统取得管理员权限)
5. 修改文本格式为可执行程序,即改文件名 管理员.txt 为:a.reg 。不管它提示什么都选择“是”。
微风-- 轻许--
2020/05/18
5.1K1
解决:您需要来自xxx的权限才能对此文件夹进行更改(电脑系统取得管理员权限)
OpenSSH9.8p1编译rpm包
实际升级openssh过程中只需要这3个文件即可,不需要使用debuginfo文件
何宇
2024/08/19
1.1K2
文件系统特殊命令一览表
描述:显示目录文件结构(list contents of directories in a tree-like format.); 如果是没有安装tree的根据您的发行版本命令进行下载即可;
全栈工程师修炼指南
2022/09/29
3.9K0
文件系统特殊命令一览表
windows git 使用的一些问题和解决方案
没这个习惯都把私钥叫id_rsa这个名字, 通常也不会放在 ~/.ssh目录下 , 但是他默认就在那儿=>C盘,我非要放D盘怎么弄?
chuchur
2022/10/25
8860
预装恶意软件-火绒安全软件个人版针对恶意修改系统文件权限行为防护的漏洞
  众所周知,系统为了防止胡乱对系统文件进行改动预装恶意软件,对不同的组或用户名对系统文件的权限进行了限制。
宜轩
2022/12/29
6320
关于Windows权限问题的解决方法
如果在删除某一个文件或文件夹时提示“没有权限”,这个情况很可能是你之前下载了什么流氓软件或是重装了系统。
全栈开发日记
2022/05/13
8590
用BypassESU为Server2008R2/2012R2续命
用BypassESU-Blue-v2为Server2012R2续命的前提条件:安装KB5017220、KB5018922和≥KB5029368的任一堆栈更新后重启机器
Windows技术交流
2024/08/12
2.2K0
是Administrator内置管理员,却没有目录访问权限,这样解决
首先,确保关闭UAC,这东西能通过注册表直接控制,有时候从图形界面上你看它明明是关闭的,但实际注册表层面开启它了,误导你找不到原因。
Windows技术交流
2023/09/06
1K0
为Win10右键菜单中添加 “获取超级管理员权限” 的选项
  在操作某些Windows系统文件/文件夹时,会提示“文件访问被拒绝,你需要权限才能执行此操作/你需要提供管理员权限才能移动此文件”,
黑泽君
2018/10/11
13.3K1
为Win10右键菜单中添加 “获取超级管理员权限” 的选项
OpenCloudOS Server 7通过pip3安装ansible和pywinrm访问Windows机器
yum install libffi-devel -y 这一步必不可少,否则ansible --version 会报ERROR: No module named '_ctypes'
Windows技术交流
2024/06/28
4940
cacls.exe「建议收藏」
xpsql.cpp: 错误 5 来自 CreateProcess(第 737 行)怎么解决、
全栈程序员站长
2022/11/16
5520
Windows如何去掉"系统、隐藏、只读"属性
powershell命令:Set-ItemProperty只能设置以下属性: Archive、Hidden、Normal、ReadOnly 或 System。
Windows技术交流
2024/03/06
8110
windows批处理命令大全「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/171938.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/23
2.4K0
OpenSSH 升级操作
yum -y install xinetd yum -y install telnet-server
Li_XiaoJin
2023/03/25
6.8K0
win7、win10、win11,安装系统跳过创建用户,直接启用 Administrator
1、按 Shift+F10 打开 cmd执行这2句命令启用Administrator
Windows技术交流
2024/04/01
3K0
Win11彻底关闭Defender(包括禁用、删除Defender服务和文件夹)
一般是不建议禁止defender自动更新或者彻底关闭Defender的,但如果你有其他替代的安全方案了,觉得defender有干扰业务隐患,想干掉,那这篇文档非常适用。耗费了不少心血在server2016-2022和win10、win11上对比实践。
Windows技术交流
2023/05/26
22.2K0
微软有趣的小命令/小工具
在线下载小工具:https://support.modelamerican.com/downloads/Utilities/Windows/ResKit/
Windows技术交流
2023/05/16
7550
基于Packer打包Windows镜像的避坑指南
2023年我第一次用腾讯云Packer的时候,当时还是1.8.6版本,那时第一次用,并没有吃透Packer,比如:
Windows技术交流
2024/12/04
2870
推荐阅读
相关推荐
【详解】Cygwin配置sshd服务
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 前言
  • 使用css touch-action的原因
  • 然后知道原因不够,解决方案是什么?
  • 使用touch-action之后,问题来了
    • 说人话
    • 怎么解决呢
  • 更多延伸与拓展
  • 更多
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档