跳到主要内容

文本与按键输入(Text and Key Input)

文本输入是 Web (JS) 运行时在 v2.44.0 中的新能力,我们仍在积极打磨,使其在各设备上尽可能接近原生文本编辑体验。在此首个版本中,部分移动端编辑功能(例如复制、剪切、自动更正和自动大写)对最终用户可能尚不可用。详情见屏幕键盘。

概述​

Web (JS) 运行时向 Rive 图形传递两类键盘输入:

  • 按键输入(Key input) - 按键按下与释放,投递给图形中的键盘监听器。例如用 Enter 按下按钮,或用 Escape 关闭菜单。
  • 文本输入(Text input) - 通过键入、粘贴或输入法编辑器(IME)组合得到的字符,插入到图形中的文本输入。

二者都建立在焦点之上:当正在播放的状态机包含焦点节点时,运行时会在键盘导航之外一并接入按键与文本输入。输入先到聚焦节点,再沿祖先冒泡,直到某个节点处理它。

输入要到达图形,必须同时满足两点:

  • 图形中有节点拥有焦点。 键盘监听器和文本输入仅在焦点节点拥有焦点时接收输入。运行时不会在 document 或 window 上监听按键。
  • 浏览器焦点在图形内。 仅当浏览器焦点在 <canvas>、语义叠加层,或下文所述用于捕获文本的输入上时,运行时才会处理键盘事件。

按键输入​

当某个节点拥有焦点时按下按键,运行时会把该键连同已按住的修饰键(Shift、Ctrl、Alt、Cmd)一并发给图形。按键释放与自动重复的按下信号也会发送。

  • 浏览器默认行为 - 图形处理了某个按键时,运行时会对事件调用 preventDefault(),避免浏览器也响应它。图形未处理的按键保留正常浏览器行为。
  • IME 组合 - IME 组合过程中按下的键属于 IME,不会发给图形。组合文本在 IME 提交时插入。
  • Tab 与方向键 - 聚焦节点上的键盘监听器优先于焦点遍历。若图形处理了 Tab,焦点不会移动,键盘用户也就无法用 Tab 离开图形。见键盘陷阱。

文本输入​

Rive 图形中的文本输入接受键入、粘贴、IME 组合和屏幕键盘,但部分原生编辑功能尚不可用,尤其是在移动端。当前限制见屏幕键盘。

为了接收文本,运行时会在画布旁添加一个隐藏的 <input>,从浏览器接收文本并传给图形。

当文本输入拥有焦点时:

  • 键入 - 键入的字符和 IME 组合会插入到文本输入中。
  • 粘贴 - 用实体键盘粘贴会插入纯文本;移动端粘贴可能因浏览器而异。多行文本输入会保留换行,单行会去掉换行。
  • 复制 - 在实体键盘上,Ctrl + C(macOS 上为 Cmd + C)会复制所选文本。被遮蔽的文本输入(例如密码框)不复制任何内容。
  • 编辑键 - Space、方向键、Backspace、Delete、Home、End 和 Enter 不会滚动页面或提交外围表单。与 Ctrl、Alt 或 Cmd 一起按下的编辑键保留浏览器行为,除非图形处理了它们。

隐藏输入​

只要运行时接入了键盘输入,就会存在隐藏输入——即使图形没有文本输入;调用 cleanup() 或 removeRiveListeners() 时会移除它。它是:

  • 作为画布兄弟节点插入的 <input type="text">。
  • 不在页面的 Tab 顺序中(tabindex="-1"),且被辅助技术忽略(aria-hidden="true"),除非启用了语义。
  • 不可见,绝对定位在画布上方,并带有 pointer-events: none,因此无法通过指针发现。
  • 始终为空。到达隐藏输入的文本会立即发给状态机并清空,因此文本、插入符和选区都在 Rive 图形中,输入的 value 为空。

屏幕键盘​

在触控设备上,用户点按图形中的文本输入时会打开屏幕键盘。运行时在点按仍在处理时聚焦隐藏输入,这正是移动浏览器显示键盘所要求的。

若文本输入在没有点按的情况下获得焦点(例如来自状态动作),移动浏览器可能不会打开屏幕键盘。

因为隐藏输入始终为空,移动浏览器不会为 Rive 文本输入提供复制、剪切等常见文本编辑工具。屏幕键盘为原生文本字段提供的其他便利也可能缺失。

带语义的文本输入​

启用语义时,隐藏输入会在无障碍树中代替聚焦的文本字段,并采用其标签、提示和状态。仅当聚焦节点的语义角色是文本字段,或该节点没有语义时,才会发生这种情况。

与页面集成​

表单、DOM 查询与 CSS​

隐藏输入是页面中真实的 <input>,因此任何泛化针对 input 元素的东西都会看到它:针对 input 的 CSS 规则、document.querySelectorAll("input"),或遍历外围 <form> 字段的代码。请把这些代码限定到你自己的输入。每个 Rive 实例只有一个隐藏输入,即使图形有多个文本输入,且其 value 始终为空。

定位​

隐藏输入绝对定位在画布上方,移动浏览器在屏幕键盘打开时会把它滚入视口。与语义叠加层一样,给包裹画布的元素设置 position: relative,让隐藏输入和画布相对同一祖先解析位置。

键盘陷阱​

若图形中的焦点节点用按键输入监听器处理了 Tab,或图形的焦点节点被设为循环/在边缘停下,键盘用户需要其他方式离开图形,例如用 Escape 按键输入监听器清除焦点。应用也可以用 rive.clearFocus() 清除焦点。一旦焦点被清除,下一次 Tab 就会离开画布。

看完还有疑问?进群交流下!
与众多 Rive 创作者、开发者一起交流探讨与答疑解惑。
加入交流群