Front-End-Checklist 无障碍规则实战:彻底解决 Autoplay Media 自动播放媒体问题
【免费下载链接】Front-End-Checklist🗂 The essential checklist for modern web development, for humans and AI agents项目地址: https://gitcode.com/gh_mirrors/fr/Front-End-Checklist
本文基于开源项目 Front-End-Checklist 中的autoplay-media规则(对应 技能定义 与其完整实现参考 references/rule.md),系统讲解如何杜绝页面自动播放音频/视频对视障用户、认知障碍用户及低带宽场景造成的伤害。读完本文,你将掌握 WCAG 1.4.2 与 2.2.2 的合规要点、可复制的 HTML/React 修复代码,以及一套自动加人工的双层验证流程。
规则是什么
autoplay-media是 Front-End-Checklist 无障碍(accessibility)分类下的一条高优先级、入门难度、预计耗时 10 分钟的检查规则。其核心要求可以概括为一句断言:
Audio and video content does not autoplay, or provides immediate controls to pause or stop playback.(音频和视频内容不得自动播放,或必须提供立即可用的暂停/停止控制。)
在仓库中,该规则有三份互相印证的载体:
- 面向 Agent/LLM 的技能定义:skills/autoplay-media/SKILL.md —— 提供
check(检查)、fix(修复)、explain(解释)、code review(代码评审)四个标准动作; - 完整的规则参考文档:skills/autoplay-media/references/rule.md —— 包含代码示例、WCAG 对照、验证清单;
- 规则源文件:packages/content/rules/en/accessibility/autoplay-media.mdx —— 站点的结构化数据源,同时被 README.md 中的总清单引用,并可通过
pnpm generate:skills重新生成技能。
为什么必须禁止自动播放
自动播放媒体带来的不是"体验小瑕疵",而是三重真实伤害:
- 淹没屏幕阅读器语音:自动播放的音频与屏幕阅读器朗读的内容同时输出,视障用户会完全无法听清页面内容,等于页面对其不可用;
- 惊吓与眩晕:突然响起的音视频会惊吓认知障碍、前庭障碍用户,甚至引发不适反应;
- 浪费带宽:在流量受限或弱网环境下,无声浪费用户流量会直接推高跳出率。
原规则用一句话点明立场:"Always require user interaction to start audio."—— 音频的启动必须以用户交互为前提,这是底线。
快速参考清单
在开始写代码前,先记住四条铁律(同样收录于 SKILL.md 与 MDX 的tldr字段):
- 永远不要自动播放音频——它会干扰屏幕阅读器;
- 如果视频必须自动播放,确保默认静音(muted);
- 提供立即可达的暂停/停止控制;
- 自动播放应在 5 秒后停止,或提供停止机制。
HTML 层:三种写法的对错示范
规则参考文档给出了最直观的 HTML 对比示例,这是任何框架方案的基础:
<!-- ❌ 错误:带音频自动播放 --> <video autoplay src="video.mp4"></video> <!-- ✅ 可接受:静音自动播放(背景视频) --> <video autoplay muted loop playsinline src="hero-bg.mp4"></video> <!-- ✅ 最佳实践:不自动播放,交给用户控制 --> <video controls src="video.mp4"> <track kind="captions" src="captions.vtt" srclang="en" label="English"> </video>三个要点:
- 第一个示例是典型违规——
autoplay配合有声内容,是屏幕阅读器用户最痛恨的模式; - 第二个示例展示了背景视频的通行做法:
muted消音、loop循环、playsinline保证移动端内联播放。静音是自动播放得以成立的先决条件; - 第三个示例是首选方案:不写
autoplay,通过原生controls让用户自己决定是否播放,并顺手用<track kind="captions">补充字幕(这正是同属媒体分类的 video-captions 规则所要求的)。
React 实战:可访问视频播放器组件
规则参考文档提供了一个完整的 React 播放器组件(基于useState+useRef),它演示了"用户控制优先"的核心交互模式。以下为补全类型标注与完整 JSX 的可运行版本:
function VideoPlayer({ src, poster }) { const [isPlaying, setIsPlaying] = useState(false) const [isMuted, setIsMuted] = useState(true) const videoRef = useRef<HTMLVideoElement>(null) const togglePlay = () => { if (videoRef.current) { if (isPlaying) { videoRef.current.pause() } else { videoRef.current.play() } setIsPlaying(!isPlaying) } } return ( <div className="video-container"> <video ref={videoRef} src={src} poster={poster} muted={isMuted} playsInline /> <div className="controls"> <button onClick={togglePlay} aria-label={isPlaying ? 'Pause video' : 'Play video'} > {isPlaying ? <PauseIcon /> : <PlayIcon />} </button> <button onClick={() => setIsMuted(!isMuted)} aria-label={isMuted ? 'Unmute video' : 'Mute video'} > {isMuted ? <MutedIcon /> : <VolumeIcon />} </button> </div> </div> ) }这个组件暗含三条无障碍设计原则,值得逐条拆解:
- 默认不自动播放:初始状态
isPlaying = false,视频静默等待用户操作; - 原生按钮 + aria-label:播放/暂停与静音/取消静音都是真正的
<button>(而非 div 加点击事件),天然支持键盘与屏幕阅读器;动态变化的aria-label(如'Pause video'↔'Play video')保证辅助技术始终能读出当前动作; - 语义状态切换:通过
muted属性单向控制,避免直接操作volume造成播放策略上的不确定性。
React 实战:背景视频 + 显眼的停止按钮
对于必须自动播放的场景(如 Hero 区背景视频),规则给出了带"暂停背景视频"按钮的完整方案。要点是:自动播放可以被容忍,但用户必须能立即且显眼地叫停它。
function HeroWithVideo() { const [isPlaying, setIsPlaying] = useState(true) const videoRef = useRef<HTMLVideoElement>(null) const toggleVideo = () => { if (videoRef.current) { if (isPlaying) { videoRef.current.pause() } else { videoRef.current.play() } setIsPlaying(!isPlaying) } } return ( <section className="hero"> <video ref={videoRef} autoPlay muted loop playsInline className="hero-video" > <source src="hero.mp4" type="video/mp4" /> </video> {/* 显眼的暂停控制 */} <button onClick={toggleVideo} className="video-control" aria-label={isPlaying ? 'Pause background video' : 'Play background video'} > {isPlaying ? 'Pause' : 'Play'} Background </button> <div className="hero-content"> <h1>Welcome</h1> </div> </section> ) }工程要点:
autoPlay必须与muted搭配使用——这也解释了为什么多数现代浏览器只对静音媒体放行自动播放;loop+playsInline保证背景视频在桌面与移动端表现一致;- 控制按钮必须显眼(
video-control样式类),而不是藏在某个菜单里;SKILL.md 特别强调:对含多个媒体元素的页面,考虑增加一个全局暂停按钮,一键停掉整页所有媒体。
对照 WCAG:两条必须满足的成功准则
规则参考文档给出了与本规则直接相关的两条 WCAG 准则,这也是审计与验收的合规依据:
| 准则 | 要求 |
|---|---|
| 1.4.2 Audio Control | 自动播放超过 3 秒的音频必须提供暂停/停止/静音控制 |
| 2.2.2 Pause, Stop, Hide | 移动、闪烁、滚动的内容必须提供暂停、停止或隐藏的机制 |
将这两条与"快速参考清单"中的"5 秒"结合理解:WCAG 1.4.2 给出的合规窗口是3 秒,而项目建议的自动播放上限是5 秒——换言之,即便被允许短暂自动播放,也必须尽快交给用户控制,二者并不矛盾:3 秒是硬性合规线,5 秒是项目内的从严实践上限。
例外情况:什么时候不必一票否决
规则文档专门列出 Exceptions(例外),提醒审计者在真实渲染环境中做判断,而非机械地扫静态代码:
- 先看渲染后的实际体验:交互时机、浏览器行为、辅助技术的实际输出往往决定严重程度,静态代码中的"疑似违规"不一定是阻断项;
- 按影响排序:并非每个次要的无障碍问题权重相同,应优先处理最直接阻碍"感知、操作、理解"的那一个;
- 不为合规而堆 ARIA:如果更简单的原生语义实现(如原生
<button>、原生controls)能彻底消除问题,就不要添加冗余标记或 ARIA。
这一点与项目的一贯方法论一致——规则源文件(packages/content/rules/en/accessibility/autoplay-media.mdx)中反复强调"verify the rendered experience, not only the source code"。
验证:自动化 + 人工双通道
自动化检查
使用浏览器无障碍工具(axe DevTools、Lighthouse 或等价工具),针对有代表性的渲染状态运行检查。注意关键词是"渲染状态"——autoplay这类行为的触发条件依赖真实运行环境,静态分析无法覆盖。
人工检查清单
SKILL.md 与规则文档共用的 Manual Checks:
- 加载页面,确认没有意外播放的音频;
- 如果视频自动播放,确认它是静音的;
- 检查暂停控件是否可通过键盘访问,并且位于 Tab 顺序靠前的位置("within the first few tab stops");
- 验证屏幕阅读器能否播报并与控件交互。
在项目中的落地方式:作为技能使用
本规则在仓库中被打包成一个可安装的技能(Skill)。项目 README.md 说明了用法:
- 想获得可复用的审计工作流或聚焦的规则级指引,可安装 Front-End Checklist skills:
npx skills add frontendchecklist/skills # 只装某一条规则对应的技能,例如: npx skills add frontendchecklist/skills --skill https - 全局审计入口是 skills/frontend-checklist-global/SKILL.md;
autoplay-media则属于规则级技能的代表,其 SKILL.md 头部元数据声明了适用时机:"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Avoid autoplaying media."(审查渲染后的 HTML、交互组件或设计系统模式中与自动播放媒体相关的内容时使用),并给出了检查优先级——先看原生语义,再检查键盘行为、焦点流、可访问名称与屏幕阅读器输出。
技能与规则源文件由脚本同步生成(pnpm generate:skills),因此 SKILL.md 中的 Quick Reference、Check、Fix、Explain、Code Review 五个部分与规则源文件的tldr、prompts字段一一对应,保证 Agent 拿到的指引永远与站点规则保持一致。
相关规则联动
autoplay-media在媒体无障碍(accessibility/media)子类中与以下规则常被一起审查(见规则源文件的relatedRules字段):
- video-captions:视频必须提供同步字幕(WCAG 2.1 SC 1.2.2/1.2.4),通过
<track kind="captions">+.vtt文件实现; - audio-descriptions:纯音频内容需要文本替代;
- video-accessibility:视频元素的整体可访问性。
在实际审查中,建议把四条规则作为"媒体审计包"一次性执行:先解决自动播放问题(本规则),再补字幕、音频描述与整体语义。
小结
Autoplay media 从来不是一个"锦上添花"的体验问题,而是直接决定视障用户能否使用页面的合规红线。遵循本规则的三步走:默认不自动播放 → 必须自动播放则静音 + 立即可达的暂停控制 → 用 axe/Lighthouse 加人工键盘与读屏验证,即可同时满足 WCAG 1.4.2 / 2.2.2 与良好的用户体验。完整代码示例与验证细节可随时查阅 skills/autoplay-media/references/rule.md 与规则源文件 packages/content/rules/en/accessibility/autoplay-media.mdx。
【免费下载链接】Front-End-Checklist🗂 The essential checklist for modern web development, for humans and AI agents项目地址: https://gitcode.com/gh_mirrors/fr/Front-End-Checklist
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考