语义(Semantics)
本页介绍如何在新版 Web (JS) 运行时中启用语义,让你的 Rive 图形可被屏幕阅读器访问。要了 解什么是语义以及如何将其添加到图形中,请参阅编辑器文档中的语义。
概述
在 Rive 编辑器中,你可以为图形的某些元素添加语义含义——例如 button、checkbox、tab、image、list、dialog 等角色,以及相关的标签、值、状态和动作。这些设置因角色而异。
在运行时,Web (JS) 运行时会从正在运行的状态机中读取这些语义,并在你的 <canvas> 旁边构建一个不可见的 DOM 树,随着状态机推进保持同步。
由于 <canvas> 对辅助技术(AT)是不透明的,这个 DOM 叠加层正是使你的图形可被发现的关键。每个语义节点都成为一个真实的 DOM 元素,具有匹配的 ARIA 角色、属性和键盘处理程序,并定位在 Rive 图形中对应节点的上方。
语义是选择启用的。默认模式为 SemanticMode.Disabled,因此在启用语义之前不会创建任何语义 DOM。作为实验性 API,semanticsMode 和 semanticsOptions 可能会在不进行主版本升级的情况下更改行为。
必须在编辑器中定义语义才会产生效果。如果元素没有语义,则不会暴露给屏幕阅读器——无论你设置什么模式。请参阅功能支持,了解当前哪些运行时支持语义。
语义模式
语义由 SemanticMode 枚举控制,你从 Rive 包中导入该枚举,并在实例化 Rive 时作为参数传递:
| 模式 | 说明 |
|---|---|
SemanticMode.Disabled | 默认。 禁用语义。不会创建语义树或无障碍 DOM。 |
SemanticMode.Enabled | 语义已激活。无障碍 DOM 在加载后创建,并随着状态机推进保持更新。 |
用法
导入 SemanticMode,并在实例化 Rive 时将其作为 semanticsMode 传递。
import { Rive, SemanticMode } from "@rive-app/webgl2";
const rive = new Rive({
canvas: document.getElementById("rive-canvas"),
src: "login.riv",
stateMachines: "State Machine 1",
autoplay: true,
autoBind: true,
semanticsMode: SemanticMode.Enabled,
});
加载后启用语义
如果你想以编程方式控制何时启用语义,可以在构造 Rive 时使用默认的 SemanticMode.Disabled,并在用户选择启用时调用 enableSemantics() 方法。
const rive = new Rive({
canvas: document.getElementById("rive-canvas"),
src: "login.riv",
stateMachines: "State Machine 1",
semanticsMode: SemanticMode.Disabled,
autoplay: true,
autoBind: true,
});
accessibilityToggle.addEventListener("change", (event) => {
if (event.target.checked) {
rive.enableSemantics();
}
});
标注图形
语义叠加层的容器元素是一个 role="region" 地标。在实例化 Rive 时使用 semanticsOptions.riveCanvasLabel 参数为其设置一个 aria-label,描述图形是什么,以便屏幕阅读器用户知道他们正在进入什么。
const rive = new Rive({
canvas: document.getElementById("rive-canvas"),
src: "login.riv",
stateMachines: "State Machine 1",
autoplay: true,
autoBind: true,
semanticsMode: SemanticMode.Enabled,
semanticsOptions: {
riveCanvasLabel: "Login Experience",
},
});
| 选项 | 类型 | 说明 |
|---|---|---|
riveCanvasLabel | string | 应用于叠加层容器的 aria-label。默认为 "Rive animation"。 |