html语义标签(如、-、等)比手动添加role属性更可靠,因其自带隐式role、tabindex和键盘导航支持,能确保屏幕阅读器准确构建导航“地图”并保持上下文连贯。

HTML文档结构直接决定屏幕阅读器能否正确构建导航“地图”——不是“能不能读”,而是“读得清不清、跳得准不准、上下文连不连贯”。
为什么
很多开发者加了role="navigation"却发现VoiceOver或NVDA仍无法用快捷键(如NVDA+U)跳转到该区域。根本原因在于:语义标签自带隐式role、tabindex和键盘导航支持,而手动加role只是“告诉读屏器这是什么”,没解决“怎么被聚焦、怎么被识别为独立区域”的问题。
-
<nav></nav>元素默认可被区域跳转命令捕获,且内部链接天然保持DOM顺序,无需额外设tabindex <div role="navigation">必须显式加<code>tabindex="0"才能被聚焦,否则在部分读屏模式下会被完全忽略- iOS Safari + VoiceOver对
role属性支持较弱,但对<nav></nav>原生标签兼容性稳定 - 如果用JS动态插入
<nav></nav>,确保插入后DOM结构完整——删掉又重建会导致语音导航路径中断 - 每个页面必须有且仅有一个
h1,它是语音导航的起点锚点 -
h2应对应逻辑大节(如“产品功能”“用户反馈”),不能只为样式服务 - 避免用
font-size或rem调整“看起来像标题”,这不影响语义层级,读屏器照样跳过 - 响应式中用JS隐藏/显示
h2时,别用display: none——改用aria-hidden="true"+visibility: hidden,否则DOM结构断裂 -
<main></main>必须全局唯一,且包裹所有核心内容,不能只包一部分 -
<article></article>用于可独立分发的内容(如博客、新闻条目),读屏器会为其添加“文章开始/结束”播报 -
<section></section>需配aria-labelledby指向其标题ID,否则读屏器无法识别该区块用途 - 别用
<div class="main">替代<code><main></main>——即使加role="main",某些旧版读屏器仍不识别footer和aside的隐藏陷阱
<footer></footer>和<aside></aside>是读屏器“区域跳转”的关键锚点,但它们容易被CSS或JS误伤。-
<footer></footer>若被position: absolute或transform移出常规流,部分读屏器可能跳过——保持其自然DOM位置最稳妥 -
<aside></aside>用于辅助内容(如侧边推荐、相关链接),但若用display: none控制显隐,整个区域会从焦点流消失;应改用visibility: hidden+aria-hidden="true" - 移动端汉堡菜单收起后,
<nav></nav>还在DOM里但不可见?必须同步设aria-hidden="true",否则读屏器仍会尝试朗读隐藏链接 - 不要把
<footer></footer>写在<main></main>内部——它应是页面级landmark,与<header></header>、<nav></nav>同级
真正难的不是加对几个标签,而是让整个DOM结构在JS交互、CSS响应式、动态内容更新中始终保持语义连贯——任何一次
innerHTML = ""替换、removeChild()删除、或display: none隐藏,都可能切断语音导航的链条。 -
h1–h6层级断裂会让盲人用户彻底迷路
屏幕阅读器用户依赖h1→h2→h3的嵌套逻辑快速定位内容区块。跳过层级(比如h1后直接h4)、用div模拟标题、或仅靠CSS放大字体来“假装是标题”,都会让快捷键(如NVDA+2)失效。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
main、article、section这些标签不是摆设
<main></main>不只是视觉居中容器,它是读屏器“跳到主要内容”的唯一快捷入口(快捷键如NVDA+Insert+M)。没它,用户得从<header></header>开始逐个听,直到找到正文——对长页面就是灾难。










