更兼容、更流畅的触控

您和您的用户希望移动网络应用能够顺畅地做出反应并滚动到 互动。开发它们应该很容易,但遗憾的是,移动网络 在滚动过程中,浏览器会对触摸事件做出反应 TouchEvent 规范中的详细说明。如 因此,具体方法可大致分为 4 类。这个 这种情况暴露了提供滚动流畅度和 开发者控制机制

四种不同的触摸事件处理模式?

这两种浏览器的行为差异分为四种模式。

  1. 正常的同步事件处理

    滚动期间会发送 Touchmove 事件,且每个滚动更新都会阻塞,直到 touchmove 处理完成为止。这是最易于理解且功能最强大,但会降低滚动性能,因为这意味着滚动过程中的每个帧都必须在主线程上阻塞。

    浏览器:Android 浏览器(Android 4.0.4、4.3)、Mobile Safari(滚动 div 时)

  2. 异步 touchmove 处理

    Touchmove 事件会在滚动期间发送,但滚动可以异步继续(滚动开始后,系统会忽略 touchmove 事件)。这可能会导致“双重处理”事件,例如,在网站通过 touchmove 执行某项操作并对事件调用 preventDefault 之后继续滚动,告诉浏览器不要处理该事件。

    浏览器:移动版 Safari(滚动文档时)、Firefox

  3. 滚动时禁止触摸移动

    Touchmove 事件在滚动开始后不会发送,并且在 touchend 事件之后才会恢复。在此模型中,很难区分静止的轻触和滚动。

    浏览器:Samsung 浏览器(发送 mousemove 事件)

  4. 滚动开始时触摸取消

    您无法同时兼顾滚动流畅性和开发者控制这两个方面,此模型明确了流畅滚动和事件处理之间的权衡,类似于指针事件规范的语义。某些可能需要跟踪手指的体验(例如下拉刷新)是不可能实现的。

    浏览器:Chrome 桌面版 M32 及更高版本、Chrome Android 版

为什么要改变?

Android 版 Chrome 浏览器目前使用的是 Chrome 浏览器的旧模式:滚动时取消触摸 启动,这可以提高滚动性能,但会导致开发者感到困惑。 特别是,一些开发者不了解触摸取消事件或如何 而这也导致一些网站无法正常运作更重要的是, 一整类界面滚动效果和行为,例如“下拉刷新”隐藏栏突发点难以实现或无法实现 。

您无需添加专门硬编码的功能来支持这些效果, Chrome 旨在专注于添加平台原语, 直接实现这些效果请参阅理性 Web 平台 以便对这一哲学进行概括说明。

Chrome 的新模型:节流异步 Touchmove 模型

Chrome 将引入新行为 设计目的在于提高与其他浏览器编写的代码的兼容性, 以及启用依赖于获取 touchmove 的其他场景 事件。此功能默认处于启用状态,您可以将其设为 使用以下标志 chrome://flags\#touch-scrolling-mode

新行为是:

  • 第一个触摸移动事件会同步发送,以允许执行滚动操作。 已取消
  • 主动滚动期间
    • touchmove 事件异步发送
    • throttled 为每 200 毫秒 1 个事件,或者当 CSS 延迟为 15px 时 超出
    • Event.cancelablefalse
  • 否则,在活动滚动时, touchmove 事件会像往常一样同步触发 因达到滚动限制而终止或无法运行
  • 用户抬起手指时始终会发生触摸结束事件

您可在 Chrome(Android 版)中试用此演示版,并切换 chrome://flags\#touch-scrolling-mode 标志,以查看差异。

请与我们分享您的想法

异步 Touchmove 模型有可能改进跨浏览器 兼容性,并启用一类新的触摸手势效果。我们感兴趣 倾听开发者的想法,看到自己创造的创意 。