embed和object标签天然破坏可访问性,因其为dom黑盒,at无法读取或聚焦;应改用video、audio、iframe等原生标签并严格配置title、aria-label及track等可访问性属性。

第三方 HTML 插件(如旧版 <embed></embed>、<object></object> 或非标准 iframe 封装)几乎必然导致可访问性降级——不是“可能”,而是“默认失效”。它们绕过语义化结构、屏蔽屏幕阅读器焦点流、不响应键盘导航,且无法被 aria 属性有效修复。
为什么 embed/object 标签天然破坏可访问性
这些标签在 DOM 中是“黑盒”:浏览器不解析其内部内容(哪怕你写了 fallback 文本),AT(辅助技术)无法读取、无法聚焦、无法触发 onload 或 onerror 事件。更糟的是,2026 年所有主流浏览器已彻底移除 NPAPI 支持,<embed src="flash.swf"></embed> 这类写法只会静默留白,连错误提示都没有。
-
<embed></embed>没有闭合标签、不接受子元素,所谓“fallback 文本”根本不会渲染 -
<object></object>虽支持子内容,但若插件加载失败,多数屏幕阅读器仍跳过整个节点(尤其当type声明了不可用 MIME 类型时) - 第三方封装的 iframe(如某些 PDF 查看器)常禁用
title属性或未设aria-label,导致 AT 仅报“iframe”而不说明用途
音视频类插件必须替换为
这是唯一能兼顾可访问性与兼容性的路径。原生标签自带 keyboard 导航(空格播放/方向键调节)、字幕轨道(<track></track>)、语义化角色(role="application" 可选),且所有现代 AT 都深度支持。
- 用
poster属性提供首帧视觉替代,比纯文字 fallback 更有效 - 必须提供
<track kind="captions"></track>—— 不是“可选”,是 WCAG 2.1 A 级强制要求 - 避免用 JS 动态注入
<source></source>:服务端直出才能保证爬虫和早期 AT 正确解析 - 检测兼容性用
HTMLMediaElement.prototype.canPlayType(),而非 UA 字符串匹配
PDF/SVG 类内容优先用
比起已失效的 <embed></embed> 或不可控的 <object></object>,<iframe></iframe> 是当前最稳妥的选择,但必须显式声明可访问性元信息。
-
<iframe src="doc.pdf" title="用户协议(PDF格式)" aria-label="PDF 版用户协议,支持下载和打印"></iframe>——title是必需属性,aria-label补充交互意图 - 禁止省略
title:无title的 iframe 在 VoiceOver/NVDA 中直接被跳过 - 如果 PDF 来自第三方域名,确保响应头含
Access-Control-Allow-Origin,否则 AT 可能因跨域限制无法读取文档结构 - SVG 不要用
<img src="chart.svg">—— 会丢失所有内部<text></text>和<title></title>;改用内联 SVG 或带aria-labelledby的<iframe></iframe>
遗留 Flash/QuickTime 插件只能迁移,没有降级
不存在“优雅降级”方案。Ruffle 模拟器虽能运行部分 Flash 内容,但它本身是 WASM 加载的 JS 库,对低配设备和旧 AT 支持极差;Canvas/WebGL 重写则需完整重构逻辑。任何试图保留插件外壳、只加 aria 的做法,都会在实际测试中失败。
- 把 Flash 动画转成 CSS 动画 + SVG 图形,用
@keyframes控制,保留prefers-reduced-motion媒体查询 - QuickTime 视频必须转码为 MP4/H.264,用
<video></video>替代;不要依赖QTIFrame这类已废弃封装 - 如果业务强依赖某款插件(如工业设备控制界面),唯一合规路径是提供独立的 WebAssembly 前端,而非修补 HTML 标签
真正难的不是换标签,而是确认第三方 SDK 是否允许你控制其输出 HTML 结构——很多广告或分析脚本会直接 document.write() 插入 <embed></embed>,这时必须拦截并重写,而不是在它外面包一层 aria-live。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











