语义化标签不可替代div,必须用等定义结构;跳过链接须为首个可聚焦元素并指向;ARIA是补丁而非替代,禁用冗余role;动态内容需手动管理焦点。

语义化标签必须替代 div 做结构划分
HTML5 的 、、、,等于强制所有人从 logo、主导航、横幅广告逐个 tab 过去。
关键细节:
- 跳过链接必须是页面第一个可聚焦元素(DOM 顺序第一),且默认隐藏(
),获得焦点时才显示 - 目标锚点必须是
或其他语义化主容器,不能是 - 若页面含多个 (如 SPA 多视图),需动态更新跳过链接的
值ARIA 属性不能乱加,尤其 role 和 aria-* 的组合
很多开发者看到“无障碍”就堆
、、,结果反而干扰阅读顺序或重复播报。ARIA 是补丁,不是语义替代品。高频错误:
立即学习“前端免费学习笔记(深入)”;
- 给已有语义的标签再加
:如——aria-labelledby本身已映射为 navigation role,冗余声明可能被某些旧读屏忽略或覆盖 -
用在包含焦点元素的容器上(如弹窗遮罩层里塞了–
),会导致键盘焦点进入“黑洞” -
区域未设/跳至主内容,或频繁更新导致播报打断用户操作 - 用
position: absolute; left: -999px;覆盖可见文本时,没同步更新 DOM 文本(例如按钮文字变了但 aria-label 没改),造成信息不一致
焦点管理在动态内容中极易失效
单页应用、模态框、手风琴菜单、Tab 切换组件——这些地方一旦 JS 插入/移除 DOM,浏览器不会自动重置焦点位置。用户按 Tab 键可能直接跳到地址栏,或卡在不可见元素上。
必须手动干预的场景:
- 模态框打开后,立即将焦点捕获到第一个可聚焦子元素(如
或确认按钮),并用或+href锁定背景内容- 关闭模态框后,焦点必须回到触发它的按钮(需提前缓存
role="region")- Tab 切换时,新激活面板需包含至少一个可聚焦元素,且该元素应获得焦点(而非只靠 CSS
aria-label)- 使用
aria-hidden="true"替代简单role,避免焦点落在视口外最常被忽略的是:当用
隐藏内容时,它仍保留在焦点流中;应改用属性或aria-hidden="true"+组合清理。 - 关闭模态框后,焦点必须回到触发它的按钮(需提前缓存
- 给已有语义的标签再加










