移动端滑动手势冲突:overflow: auto导致外层横向滑动失效

在做移动端交互时,有一种场景非常常见:

外层容器负责左右拖动,内层容器负责上下滚动。

例如:

看起来这个需求并不复杂。但是我在实际开发时遇到了一个问题:

内层元素内容过多,加上 overflow: auto 之后,外层的横向拖动突然变得不正常。

例如:

经过排查发现将 overflow: auto; 改成 overflow: hidden; 外层横向拖动又恢复了。

经过吉米尼老师的提醒,发现一个CSS属性:touch-action

css 复制代码
touch-action: pan-y;

表示:

告诉浏览器,这个区域的纵向平移可以由浏览器处理。

而其他没有交给浏览器处理的手势,可以由 JavaScript 自己实现。

MDN 对 touch-action 的描述也是这个思路:浏览器会根据 touch-action 确定哪些触摸手势由浏览器处理,应用程序则可以处理剩余的手势。

那现在还有一个问题:

浏览器到底应该如何处理用户的触摸手势?

这时候就需要:

css 复制代码
touch-action: pan-y;

完整写法:

css 复制代码
.scroll {
  height: 100%;
  overflow-x: hidden;
  overflow-y: auto;

  touch-action: pan-y;
}

这实际上是在明确表达:

这个区域允许浏览器处理纵向平移。

而横向拖动则由 Pointer Events 自己处理。


总结:

overflow 负责定义"内容在哪个方向可以滚动",touch-action 负责定义"浏览器可以处理哪些触摸手势",JavaScript 则负责实现剩下的自定义手势。把三者的职责分清楚,移动端的手势冲突自然就容易解决了。

相关推荐
半个落月2 小时前
LangSmith 全链路观测(下):用 Dataset 与 LLM Judge 量化评估 RA
javascript·langchain
半个落月3 小时前
LangSmith 全链路观测(上):用 LangGraph 与 Milvus 构建可追踪的 RAG 客服
javascript·langchain
Java后端的Ai之路3 小时前
06-React-Props
前端·react.js·前端框架
半个落月3 小时前
LangChain.js Agent 中间件实战:生命周期、动态工具与文件权限
javascript·langchain
Flynt4 小时前
开源"间谍卫星"说数据全是真的,我把它的免key数据源挨个试了一遍
前端·开源·数据可视化
Csvn4 小时前
渲染管线
前端
程序员大阳4 小时前
副队长CSS教程(33)–圆角与透明
前端·css·透明·圆角
志尊宝5 小时前
Vue3 零基础每日笔记(082):文件上传实战——el-upload 校验、自定义上传、头像预览
前端·javascript·vue.js·笔记·#javascript·#vue.js
鬼手点金5 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
柳杉5 小时前
借助 Codex 和可视化工作流,从调研到完整实现,3D 大屏竟然可以这么简单
前端·ai编程·数据可视化