网页应用无障碍功能指南
对于Vega网页应用,我们建议您遵循WCAG(最低AA)和WAI-ARIA的指导方针。WCAG涵盖了无障碍功能的所有方面。
无障碍功能的目标是提供一款支持以下类型残障用户的电视应用:
- 视觉 - 从色盲到完全失明
- 行动能力 - 从灵活性受限到难以执行手势
- 讲话 - 从重音语音到非口头语音(如果使用语音输入)
- 认知 - 包括学习障碍、复杂指令接受困难
- 听力 - 从部分听力损失到完全听力损失
WebView可以是HTML、ReactJS或Angular应用。一个可访问的WebView包括3个层:
- 网页应用: 开发者有责任编写和实现可访问的代码
- Vega WebView包装器: 这由Vega团队提供
- 操作系统: 所有必需的无障碍功能支持和API均在操作系统级别提供
Vega WebView包装器
要使您的HTML/Angular/React应用成为Vega网页应用,请使用Vega WebView包装器将其包装。
重点应该放在您的应用内部:为此,重要的是要达到以下几点。
- 初始焦点必须进入应用容器
- 将电视遥控器事件(方向键、选择)显示为键盘事件
- 在设备上使用辅助技术测试应用
网页应用
这是以使您的应用易于访问为重点的层面。在VueJS、ReactJS、React Native、适用于Vega的React Native和AngularJS等框架中,使用类似JSX或HTML的模板进行编写。
可供探索的资源
无障碍功能指南
使用以下指南实现无障碍功能。
语义HTML结构
- 使用有意义的HTML标签。例如,使用语义HTML标签,如
<header>、<footer>和<nav>。对于按钮,使用<button>元素代替<div>或<span>。对于链接,请使用<a>代替非语义元素。这些语义标签可由平台和辅助技术(例如VoiceView、屏幕放大镜和TextBanner)识别。如果使用得当,大多数无障碍功能都会自动得到处理。 - 使用分层标题结构: 从
<h1>到<h6>,在应用中保持有序的标头。这有助于屏幕阅读器和其他辅助技术了解内容层次结构,从而改善整体导航体验。
无障碍富互联网应用 (ARIA) 标签
- 在某些情况下,您可能需要使用非语义元素,例如在构建自定义组件(如磁贴、卡片或轮播)时。在这些情况下,使用ARIA属性将目的和行为传达给辅助技术。
- 简而言之,ARIA属性有助于提供三种关键类型的信息:
- 元素是什么。示例:role="button"
- 它能做什么。示例:aria-pressed或aria-expanded
- 其他上下文或标签。示例:aria-label或aria-describedby
- 有关您可以使用的ARIA标签、属性和方法的列表,请参阅ARIA创作实践指南。
- ARIA用法示例:
<section aria-labelledby="features-title">
<h2 id="features-title">无障碍功能</h2>
<p>此部分介绍如何使您的内容易于访问。</p>
</section>
alt或图像和图标描述
VoiceView无法理解图像或图形。因此,请提供alt或有意义的描述。例如,对于设置图标,使用诸如“设置”之类的描述,而不是“设置图标的图像”或“图标”。 VoiceView将添加“图像...”或“链接图像...”。添加“图像”或“图标”之类的文本没有意义。
<img src="" alt="设置">
- 装饰图像: 对于没有用户价值的纯粹装饰性图像,可跳过alt标签。
- 重复文本: 如果图像已经包含alt标签或aria-label中附近的文本,请勿重复该文本。
焦点管理
- 元素的焦点应清晰可见。遵循WACG指南。
- 如果您使用语义HTML标签(button和a),则默认情况下您将看到焦点环,或者您可以根据应用的设计进行自定义,VoiceView将能够识别并大声读出。
- 对于初始焦点,可使用React/Angular
autoFocus属性。 - 如果您使用的是非语义标签,则编写自定义JavaScript代码来应用焦点,并编写自定义样式onFocus。
- 仅在以下情况下使用
tabindex:- 您正在使不可设定焦点的元素成为可设定焦点的元素。
- 仔细自定义焦点顺序。这适用于模态或自定义组件。html
可设定焦点的div,使用tabindex// 这是为了让一个元素可设定焦点
- 字母间距: 保持一致,避免间距过小或过大。
- 避免使用全大写字母: 特别是对于长句子,因为它更难阅读。
- 行高: 根据WCAG,至少使用
1.5(或150%)来提高可读性。 - 保持一致的排版。
程序化公告
对于正在构建没有标签或需要以编程方式公告信息的软件的开发者,有一些选项可用。这对于使用画布绘制图表、示意图、交互式导航或3D世界元素的网页应用特别有用。
选项1: 使用专门用于公告的div并更新应用于公告的文本。
<!-- index.html -->
<div id="announcer" aria-live="assertive" aria-atomic="true"></div>
<script>
const announcerDiv = document.getElementById("announcer");
// 模拟更新
setTimeout(() => {
announcerDiv.textContent = "新公告!";
}, 5000);
</script>
选项2: 使用postMessage向Vega WebView容器发送消息,然后使用onMessage处理此消息。在onMessage中,调用AccessibilityInfo.announceForAccessibility();。这需要更多的设置,但最终的运行方式与SpeechSynthesis的运行方式类似。
SpeechSynthesis。在一定程度上可以使用postMessage和onMessage来创建实现。目前无法使用AccessibilityInfo模仿某些行为。在此示例中,使用类型-值消息传递模式与JSON API或套接字数据行业标准非常相似。这样,当发送或接收消息时,可以更轻松地序列化和反序列化不同的数据类型。顶部的脚本是网页应用,而底部是Vega网页应用代码。
<!-- index.html -->
<script>
const message = JSON.Stringify({
type: "announcement",
value: "新公告!"
});
// 使用postMessage向Vega网页应用发送数据。
window.ReactNativeWebView.postMessage(message);
</script>
// App.tsx
import { AccessibilityInfo } from "@amzn/react-native-kepler";
export const App = () => {
// 如果类型为“公告”,则实现以返回值
const getAnnouncement = (message: string) => {};
return (
<WebView
source={{ uri: 'https://amazon.com' }}
// 使用onMessage从postMessage接收数据
onMessage={(event: WebViewMessageEvent) => {
const announcement = getAnnouncement(event.nativeEvent.data);
// 公告
AccessibilityInfo.announceForAccessibility(announcement);
}}
</WebView>
);
};
排版和颜色
- 字体大小必须符合可读性标准。
- 对于普通文本,使用≥ 4.5:1的颜色对比度比率,对于大型文本,使用≥ 3:1。依据WCAG请查看https://webaim.org/resources/contrastchecker/(仅提供英文版)
- 视觉焦点应具有不应与背景融合的颜色
- 字体系列应该易于理解,避免使用过于草书或过淡的字体
- 行高要使内容易于阅读
等等。
VoiceView
使用VoiceView进行测试,以避免多余的公告,保持正确的阅读顺序,并启用实时更新 (aria-live)。如有常见问题,请查看常见问题解答。
测试播放、Alexa和其他音频行为。
要隐藏无障碍功能API中的非交互式内容,请使用aria-hidden="true"。有关详细信息,请查看MDN文档。此内容可能是:
- 纯粹的装饰性内容,例如图标或图像
- 重复的内容,例如重复的文本
- 屏幕外或折叠的内容,例如菜单
Vega WebView中的无障碍功能
- 电视遥控器(方向键、返回、选择)
- VoiceView(屏幕阅读器)
- 放大镜(屏幕缩放)
- 隐藏式字幕/字幕

在WebView中启用无障碍功能元素
启用VoiceView
- 导航到无障碍功能设置
- 开启VoiceView

隐藏VoiceView的元素
要隐藏VoiceView元素,可使用以下代码。
aria-hidden="true"
缺少默认可访问名称时如何通知VoiceView注意某个元素
使用以下代码让VoiceView知晓元素。
<button aria-label="关闭对话框">X</button>
公告动态值
HTML、ReactJS、Angular使用aria-live。有关更多详细信息,请参阅ARIA: aria-live属性。使用以下代码公告动态值。
<div aria-live="polite" id="status"> <!— 将公告此处插入的文本 --></div>
测试案例
以下是建议的最小测试案例。您可以将它们用于应用的无障碍功能测试。
VoiceView
启用和禁用VoiceView
- 导航到无障碍功能设置
- 开启/关闭VoiceView
使用支持VoiceView的应用
- 启用VoiceView
- 使用遥控器浏览应用
- 验证每个用户界面元素的语音提示
验证新的屏幕以语音讲述的文本
在新屏幕上,以语音讲述标题、描述、用法提示、方向文本和当前聚焦项目。
- 导航到不同的应用部分(例如,主页、设置、内容)
- 确认VoiceView输出
验证导航和以语音讲述的元素
确保用户可以(使用按钮上的方向键/选择/快速选择操作)导航到所有可操作的元素,以语音完整讲述聚焦元素,并在普通模式下以语音讲述与该元素相关的静态文本。
暂停后验证以语音讲述的聚焦元素
停顿片刻后(约0.5秒),您应该会听到以语音讲述的用法提示、方向文本、描述方和静态文本。
验证图像和图标是否包含描述性文本
如果图像提供指令,则还必须以alt-text描述所有指令,VoiceView才能讲述。
在审阅模式下验证VoiceView
开启VoiceView时,按住菜单2秒钟。用户应该能够导航(在方向键上向左/向右)浏览所有文本和控件,但粒度会发生变化(方向键上向上/向下)。用户需要能够在审阅模式下阅读不可操作的文本和项目。
验证无障碍功能手势
例如,双击激活项目,或者也可长按来激活。
放大(屏幕缩放)
启用和禁用放大
- 转到无障碍功能
- 启用放大镜
- 验证它是否可以放大/缩小
跨用户界面的缩放功能
- 尝试缩放文本、按钮、图像
- 确认缩放比例和可见性正确无误
缩放后可保持可读性,不会剪裁内容
- 在所有屏幕上放大/缩小
- 验证布局是否保留且滚动功能正常
第一次缩放1.5倍
- 转到设置
- 确保缩放已关闭
- 激活缩放
- 观察缩放和应用行为
首次访问后,缩放设置会根据用户的首选项保留
- 转到设置
- 确保缩放已关闭
- 激活缩放
- 观察缩放和应用行为
- 关闭应用
- 重新打开应用或再次打开设备电源
- 验证缩放级别是否保留,与以前相同
验证放大镜是否在焦点上
确保用户可以(使用方向键/选择)导航到可操作的控件,并且放大镜会跟随焦点。
验证用户是否可以浏览(使用菜单+方向键进行平移)所有文本和控件。
字幕/隐藏式字幕
启用和禁用字幕
- 播放视频
- 在播放器/设置中切换字幕
- 确认可见性
验证用户是否可为隐藏式字幕设置样式
在全局设置下,在本地播放器中使用CC设置。
- 更改字幕设置
- 相应地验证用户界面更新
字幕在各会话之间保留(如果适用)
- 启用
- 退出应用
- 重新打开
- 检查设置是否仍然存在
字幕精度及与音频同步
- 播放内容
- 确认字幕同步且准确
验证用户获得准确的隐藏式字幕
字幕应限制延迟并跟随内容。
字体/文本大小
增大和减小文本大小
- 访问字体设置
- 调整大小
- 验证用户界面中的文本比例是否正确
应用中保留字体更改
- 更改字体大小
- 导航到不同的屏幕
- 确认一致性
使用大字体时不会出现布局中断
- 设置最大字体大小
- 确认没有用户界面剪裁或重叠
焦点/视觉指示器
每个可操作的元素都有一个可见的焦点环
- 使用遥控器浏览所有用户界面
- 检查每个元素上的焦点环
一致的焦点顺序(导航流程符合逻辑)
- 使用遥控器导航
- 确认焦点顺序清晰直观(从上到下、从左到右)
可选: 焦点变化时的音频反馈
- 启用音频提示
- 导航
- 确认焦点变化时有声音指示
用户操作后焦点不会丢失,例如关闭模态时
- 打开和关闭模态或对话框
- 焦点返回到预期的元素
导航
可以使用遥控器导航
- 使用方向键、返回、选择按钮
- 验证是否无需触摸输入即可访问所有区域
键盘导航支持(如果支持)
- 使用外接键盘或无障碍输入设备进行测试
- 验证所有互动区域
没有卡滞区域(可以离开所有区域)
- 尝试进入/退出模态、菜单和轮播
- 确认不会发生卡死
延迟
验证无障碍功能元数据是否作为标准有效负载包的一部分加载
验证用户是否被告知内容正在屏幕上加载(视觉和听觉)
验证连接超时的情况下用户未被屏蔽
如果用户处于离线状态,这也适用。
通过设计实现无障碍功能
验证图像和图标是否使用描述性文本标记
如果图像提供指令,则必须用alt-text描述所有内容,VoiceView才能讲述。
验证状态是否通过多种方式传达
其中一些传达方式可能是文本、颜色和声音。
验证所有图标都有文本描述
即使是常用图标也需要文本描述。
故障排除
启用VoiceView之后未在应用中以语音讲述任何项目
检查无障碍功能标记。
用户界面元素读取为按钮
这是因为用户界面元素没有无障碍功能标签或描述,但它们的无障碍功能角色设置为按钮。
用户界面元素与视觉显示的元素不同
这可能是因为该应用未正确设置辅助功能的聚焦元素。
多次讲述标题或用户界面元素
这可能是由于重复的A11Y公告造成。移除所有重复的A11Y公告。
视频播放期间有持续朗读现象
这可能是对标签的错误使用,因此焦点位于内容细节上,而不是视频播放器组件上,后者内部没有文本。当应用在视频播放期间未在视觉上聚焦于屏幕时,不得聚焦于元素/节点。
音频降低不起作用
如果VoiceView在视频播放期间开始讲述,VoiceView语音将获得优先权,视频播放音频应该会消失。
相关主题
Last updated: 2025年10月7日

