<strong>和<em>被屏幕阅读器特殊处理因其携带语义强度:前者提升重要性,后者强调语气,均触发语调/停顿变化;而<b>和<i>仅为视觉样式,AT默认忽略。

为什么 和 会被屏幕阅读器特殊处理
因为它们携带明确的语义强度,不是纯样式标签。 表示内容重要性提升, 表示语气强调——这两者都会触发屏幕阅读器改变语调、语速或停顿。比如 NVDA 读 前端开发 时会加重音并略作停顿;读 真的 时会提高音调,模拟口语强调。
而 和 不触发这些行为,它们只是“加粗”“斜体”的视觉指令,AT(辅助技术)默认忽略其语义。实测中,JAWS 对 的朗读与普通文本完全一致。
-
<strong></strong>和<em></em>是 HTML5 唯一被规范明确定义为「语义强调」的内联标签 - 嵌套顺序必须是
<strong><em>重点词</em></strong>,不能反着写;否则语义逻辑错乱,部分 AT 会跳过内层 <code><em></em> - 连续多个
<strong></strong>并不会叠加强调效果,反而可能让 AT 感知为结构混乱
和 在可访问性层面的区别不止是“删不删”
<del></del> 被屏幕阅读器识别为「已删除但保留在文档中」,通常读作「已删除:xxx」;而 <s></s> 被解释为「内容已失效/不再相关」,多数 AT 直接跳过或仅提示「已废弃」,不读内容本身。
这直接影响信息传达:电商页面标原价时,用 <s>$199</s>,视障用户可能根本听不到这个价格;但换成 <del>$199</del>,就能完整获取价格对比信息。
立即学习“前端免费学习笔记(深入)”;
- 搜索引擎也会对
<s></s>内容降权,但对<del></del>中性对待 -
<del></del>支持cite和datetime属性,可用于说明删除原因和时间,AT 可读取 -
<s></s>不推荐用于价格对比、拼写修正等需传达变更意图的场景
必须配对 才能形成可访问的价格变动逻辑
单独用 <ins>$149</ins> 不足以表达“降价”,因为屏幕阅读器只读「新插入:$149」,缺失上下文。只有和 <code><del>$199</del> 配合,才能构成完整的语义链:<code><del>$199</del> <ins>$149</ins> → AT 朗读为「已删除:199,新插入:149」,用户自然理解这是降价。
注意:<u></u> 不能替代 <ins></ins>。Chrome 85+ 默认禁用 <u></u> 的下划线渲染,且它无任何语义,AT 完全无视。
-
<ins></ins>支持datetime属性,建议补上生效时间,如<ins datetime="2026-07-01">$149</ins> - 避免把
<ins></ins>用在纯装饰性下划线(如导航项 hover 效果),那该用 CSStext-decoration - 若后端动态生成价格变动 HTML,务必确保
<del></del>和<ins></ins>成对出现,否则可访问性测试工具(如 axe)会报「语义缺失」
嵌套超过两层的格式化标签会让 AT 解析失败
W3C 明确建议格式化标签嵌套深度 ≤2 层,例如 <strong><em>重点词</em></strong>。一旦出现 <code><strong><em><u>重点词</u></em></strong> 这类三层结构,NVDA 和 VoiceOver 都可能出现跳读、漏读或直接忽略中间层语义。
这不是渲染问题,而是 DOM 解析层级混乱导致 AT 无法正确映射语义树。实测中,三层嵌套会使 <u></u> 的下划线样式正常,但整个片段被当作普通文本朗读,<strong></strong> 和 <em></em> 的强调效果全部丢失。
- 优先用 CSS 实现复合样式(如加粗+斜体+下划线),保留 HTML 标签语义纯净
-
<b></b>和<i></i>虽然允许嵌套,但因无语义,嵌套再多也不会增强 AT 表达 - 如果真需多层强调(如法律条款中的重点+例外+新增),应拆分为段落级结构,用
<section></section>+<h3></h3>+<strong></strong>组合,而非内联标签堆叠



















