正确设置 lang 属性必须为 lang="zh-CN"、lang="zh-TW" 或 lang="zh-HK" 且直接写在 <html> 标签上;<main> 必须是 <body> 的直接子元素且唯一;<nav> 需明确导航意图并用 aria-label 区分;面包屑用 <ol> 且当前页加 aria-current="page";标题层级必须连续递进;按钮必须用语义化 <button> 而非 div 模拟。

lang 属性写错或缺失会导致屏幕阅读器乱码
不写 lang,或写成 lang="ch"、lang="cn"、lang="zh",NVDA 或 VoiceOver 就无法准确识别中文。结果不是读成日语腔调,就是分词错误、断句混乱,用户根本听不懂。
正确写法只有三种:lang="zh-CN"(简体)、lang="zh-TW"(繁体)、lang="zh-HK"(港澳)。必须直接写在 <html> 标签上,不能只靠 <meta> 补救。
- 多语言页面中局部切换语言,用嵌套
lang,比如引文:<p lang="en">... - React/Vue 动态渲染时,别靠 JS 拼接
lang值——SSR 或首屏 HTML 必须带对 -
lang缺失是 axe 等工具报“严重”错误的第一项,修复优先级最高
main 和 nav 的嵌套与边界容易被忽略
<main> 必须是 <body> 的**直接子元素**,且全页只能出现一次。如果包在 <div> 或 <section> 里,NVDA 会跳过它,或者当成普通区块处理——主内容直接“消失”。
<nav> 不是“所有链接的集合”。只有明确承担导航意图的链接组才该放进 <nav>:主导航、面包屑、页内锚点列表可以;但文章末尾的“相关阅读”、登录入口、广告链接都不行。
立即学习“前端免费学习笔记(深入)”;
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- 多个导航区必须加
aria-label区分,例如:<nav aria-label="主导航">、<nav aria-label="页内目录"> - 面包屑要用
<ol>而非<ul>,当前页项加aria-current="page" -
<main>内部再出现<main>,校验工具直接标红,不可妥协
标题层级断裂会让屏幕阅读器“掉层”
用户按 H 键跳转时,依赖的是连续、递进的 <h1>→<h2>→<h3> 结构。一旦 <h2> 后直接跟 <h4>,中间缺了 <h3>,他们就会误判章节结束,实际内容还在继续——这不是提示不准,是结构塌方。
常见断裂场景包括:CSS 用 display: none 隐藏了某个 <h3> 却没删 DOM;组件库默认用 <h2> 当卡片标题,嵌套在 <h2> 主区域下,变成 H2→H2;JS 动态插入标题但没校验层级。
- 每个
<section>应以<h2>或更高级别标题开头(HTML5 允许重置层级,但前提是显式提供) - 隐藏标题时,改用
aria-hidden="true"+ 视觉隐藏类(如visually-hidden),而非display: none -
<h1>全页唯一,且应出现在<main>内部,避免放在<header>里导致结构漂移
button 和 link 的 role 与 type 容易被滥用
用 <div> 或 <span> 模拟按钮,再手动加 role="button" 和 tabindex="0",等于放弃浏览器原生能力。不仅键盘交互(Enter/Space)要自己实现,焦点管理、状态反馈(aria-pressed)也得补全——极易遗漏。
<button> 默认 type="submit",表单内点击会触发表单提交。多数场景应显式写 type="button";而 <a href="#"> 是典型反模式——它触发页面跳转(哪怕只是 #),且无 href 值时会被屏幕阅读器读作“未定义链接”。
- 纯 JS 交互按钮必须用
<button type="button">,不要用<a href="javascript:void(0)"> - 需要跳转的链接必须有真实、有效的
href,#或javascript:均不可取 - 图片按钮需配
alt,禁用空alt=""——除非是纯装饰,否则必须描述功能,如alt="搜索"
真正难的不是记住所有规则,而是把语义当第一直觉:看到导航就本能写 <nav>,看到主内容就立刻放 <main>,而不是先画个 <div class="main-wrapper"> 再回头补。一旦习惯倒置,后面每一步都在填坑。


















