HTML手势操作不可访问,必须用键盘可操作的语义流程替代;滑动组件需提供显式按钮并同步aria-current与焦点;长按操作须有固定按钮或选中态+批量控制,且DOM顺序、焦点流、ARIA状态须闭环。

HTML手势操作(如拖拽、滑动、长按)本身不可访问,不能靠加 aria-roledescription 或 draggable="true" 修复;必须用键盘可操作的等效语义流程替代,核心是「不模拟手势,而提供等效交互意图」。
为什么原生手势无法被辅助技术识别
浏览器对 touchstart、dragstart、gesturestart 等事件不做语义映射:屏幕阅读器既读不出“正在滑动”,也听不到位置变化;dataTransfer 对象对 AT 完全不透明;draggable="true" 绕过焦点流,Tab 进不去,Space/Enter 触发不了。iOS VoiceOver 和 Android TalkBack 都不会把滑动手势当作导航或操作指令来解析。
滑动切换类组件(如轮播图、标签页)的合规替代方案
不能依赖 touchmove + transform 实现切换,而应提供显式、可聚焦的控制按钮,并确保 DOM 顺序与视觉逻辑一致:
- 每个“上一页/下一页”按钮必须是
<button>,带aria-label(如"上一张图片"),且有tabindex="0" - 当前激活项需设
aria-current="true",并同步更新tabindex="0"到对应内容容器(如<section>),保证Tab可直达 - 禁用自动轮播;若必须启用,提供
<button>控制暂停/播放,且暂停后焦点自动落到当前项 - 避免用
display: none隐藏非当前页——它会让屏幕阅读器跳过整个区域;改用visibility: hidden+aria-hidden="true"+tabindex="-1"
长按触发操作(如编辑、删除)的键盘等效路径
长按不是标准输入方式,WCAG 不认可其作为唯一交互入口;必须提供明确、可发现的替代控件:
立即学习“前端免费学习笔记(深入)”;
- 将“长按删除”替换为每项右侧固定一个
<button aria-label="删除第3项"></button>,尺寸 ≥48×48px,禁用时设aria-disabled="true"并移除tabindex="0" - 若空间受限(如列表项紧凑),改用「选中态+批量操作」:点击进入
aria-selected="true",再通过顶部工具栏统一执行动作 - 禁止用
ontouchstart+setTimeout模拟长按并弹出菜单——该菜单大概率无焦点、不可键盘操作、无role,AT 完全感知不到 - 所有操作按钮必须出现在 DOM 顺序中紧邻其所作用的内容之后,否则 VoiceOver 滑动时会丢失上下文
最容易被忽略的是:手势替代方案不是“加个按钮就行”,而是整套 DOM 结构、焦点流、状态同步和 ARIA 属性必须闭环。比如轮播图里按钮点了没反应,大概率是没在 JS 中调用 el.focus() 到新内容区,或忘了清掉上一项的 aria-current。这些断点一出现,整个可访问性链就失效了。



















