CalcGuide · 技术博客主页 / 一页纸学习计划
🟠

语义化 HTML5 与表单:从 landmark 到无障碍表单

分类:前端与客户端 · 路径:docs/topics/html-semantics-and-forms/README.md

#html#semantics#forms#a11y#aria

学会用语义化 HTML5 的 landmark / section / 表单 / ARIA,把任何页面做出屏幕阅读器和搜索引擎都看得懂的结构

父主题

HTML 与 CSS 响应式布局:从语义化到现代布局与无障碍

子主题(0)

语义化 HTML5 与表单:从 landmark 到无障碍表单

0. 元信息

1. 学习路线

HTML5 文档结构(<!DOCTYPE>、<html lang>、meta、head、body)
  → landmark 五大区(header / nav / main / aside / footer)
  → 内容分区(article、section、figure、details、address、time、mark)
  → 表单元素(<form>、<label>、<fieldset>、<legend>、<input>、<select>、<textarea>、<datalist>、<output>)
  → 原生校验(required、pattern、min/max、type=email/url/tel/number、:invalid/:valid、Constraint Validation API)
  → ARIA 补缝(aria-label、aria-labelledby、aria-describedby、aria-live、aria-current、role)
  → 焦点与跳转(tabindex、skip links、focus management)

按”骨架 → 内容 → 表单 → ARIA”的顺序学。每一步用一个 demo 验证,不堆链接不背书。

2. 阶段周数分配(1 周,每天 1.5~2 小时)

阶段建议周数每天时长概述
1. 文档骨架0.51.5hdoctype / html lang / meta viewport / title / link / color-scheme
2. landmark0.51.5hheader / nav / main / aside / footer 与多 main 写法
3. 内容分区0.51.5harticle / section / figure / details / address / time
4. 表单元素0.51.5hform / label / fieldset / legend / input / datalist / output
5. 原生校验0.51.5hrequired / pattern / min-max / type / :invalid / :user-invalid
6. ARIA 补缝0.51.5haria-label / aria-labelledby / aria-describedby / aria-current
7. 焦点与跳转0.51.5htabindex / skip link / roving tabindex / 焦点回退
8. 表单可访问0.51.5haria-live 提交反馈 / 错误汇总 / output
9. 综合 demo1.01.5~2h完整 contact 页面 + axe 0 critical

总计 5 小时 × 7 天 ≈ 35 小时。1 周内可完成;如时间紧,至少 7 天写完 §4 全部任务。

3. 九阶段表

阶段核心知识实践产出学会标准
1. 文档骨架<!DOCTYPE html><html lang><meta charset><meta viewport><title><link><style><meta name="color-scheme">最小可访问 HTML5 模板能解释 viewport 的 width=device-width, initial-scale=1
2. landmarkheader / nav / main / aside / footer,多个 main / nav 的 aria 写法一份 1 页博客骨架axe 报”page-has-heading-one”与 landmark 计数为 1 main
3. 内容分区article / section + heading、figure + figcaptiondetails + summaryaddresstime一篇带目录与可折叠 FAQ 的博客能解释”article vs section”的差别
4. 表单元素<form action method><label for><fieldset><legend><input list><datalist><output>注册页(用户名 / 邮箱 / 密码 / 确认)不看答案能写出”显示/隐藏密码”切换
5. 原生校验requiredpatternminlengthmaxlengthtype:invalid:user-invalid:focus-visible注册页带错误样式能解释 :invalid:user-invalid 的区别
6. ARIA 补缝aria-labelaria-labelledbyaria-describedbyaria-invalidaria-requiredaria-current="page"导航高亮当前页 + 表单错误关联能解释何时 ARIA 该加、何时不该
7. 焦点与跳转tabindex(0 / -1)、skip link、roving tabindex、焦点回退可用键盘通行的 navbar能用 Tab 走完一遍表单不出错
8. 表单可访问aria-live="polite" 表单提交反馈、错误汇总、<output>提交后展示成功或失败总结NVDA / VoiceOver 报”提交成功”
9. 综合 demo把 1~8 拼成”联系页”——带表单校验、ARIA、键盘路径、打印友好完整 contact 页面 + axe 0 criticalLighthouse a11y ≥ 95

陷阱集中在三个:把 landmark 当样式挂钩、用 <div> 代替 <button>、给 <label> 写但不绑。

4. 第一周(每天 1.5~2 小时)

Day 1 约定:编辑器 = VS Code + 官方 HTML 扩展 + axe DevTools 扩展;浏览器 = Chrome + Firefox;本计划全程静态 HTML,不引入框架。所有截图、axe 报告与 DevTools 设备模拟记录到 notes/week1/dayN/,便于复盘与综合项目引用。

任务当天交付自检
Day 1用语义化标签写 hello page(含 <header><nav><main><article><aside><footer>),装 axe DevTools 并扫一次截图 + axe 报告(HTML/JSON)axe 报”page-has-heading-one”且 landmark 计数=1 main
Day 2表单 + 校验:注册页(用户名 / 邮箱 / 密码 / 确认),用 <label for><fieldset>patternrequired:invalid4 类边界(空 / 错 / 短 / 长)的截图提交前 4 类输入分别触对应错误样式;label 点击聚焦正确控件
Day 3landmark 多 main 练习:写 2 个 <main>(一主一子区),给次级加 aria-label;用 NVDA / VoiceOver 跳区屏幕阅读器跳区文字记录主区被读为”main”;次区被读为”main, X”
Day 4内容分区:写一篇带 <article><section><figure><figcaption><details><summary><time> 的博客截图 + Markdown 源Heading rank 连续;details 键盘可展开
Day 5原生校验 + <datalist> + <output>:做一个带输入建议与结果展示的计算器截图 + 笔记:user-invalid 在字段离开后才显示;output 内容随 input 变化
Day 6ARIA 补缝:导航 aria-current="page" 高亮;表单错误用 aria-describedby 关联段落;用 aria-live="polite" 段落提交反馈截图 + axe 报告axe 0 critical;VoiceOver 朗读错误信息
Day 7项目:最小 contact 页面。步骤 A:手机版 360×640 跑通;步骤 B:补桌面 1440×900 与打印预览;步骤 C:axe 0 critical3 张截图 + axe 报告 + 简短 READMEaxe 0 critical;Lighthouse a11y ≥ 95;打印样式保留主内容

Day 7 步骤 A 只求”移动能看”;步骤 B 每次只加一个断点;步骤 C 必须手测键盘路径(Tab + Enter 走完整个表单)。

5. 阶段通用验收

  1. 不看答案重写该阶段的最小 demo(用最少元素完成同样语义);
  2. 解释”landmark vs div”、“label for vs aria-label”、“required vs aria-required”的取舍;
  3. 截图 3 种宽度(360 / 768 / 1440)+ 打印预览 + axe 报告;
  4. 键盘路径手测一次:Tab 顺序正确、Enter 提交、Esc 关弹窗、Shift+Tab 退到 skip link;
  5. 屏幕阅读器(VoiceOver 或 NVDA)至少跳区一次 + 朗读错误一次;
  6. 列出至少 3 类边界(空字段 / 超长 / 仅鼠标 / 关闭 JS 后的 native 校验);
  7. 能修改现有页面(加 landmark、换 ARIA、加 skip link)而不是只能照抄。

6. 最终验收

7. 综合项目

首选:设计并实现一套个人作品集 landing + 联系页(同品牌两套页),每页覆盖桌面 / 平板 / 手机 / 打印 4 态,落地”语义化结构 + 无障碍表单 + 键盘路径”。

必做:

备选:重构一套遗留的”全 div 拼装”营销页为语义化结构 + 无障碍表单,附”原 vs 新”对比截图与 axe 报告。

notes/ 与 README 存放规范

所有截图、axe 报告、HTML Validator 输出、Lighthouse JSON 统一存放在项目根目录的 notes/ 子目录或 README 的对应章节;提交时一并带上,避免散落在聊天或临时文件里。综合项目的 notes/ 至少包含:

任何综合项目都必须包含:

  1. 需求与受众;
  2. 完整源码(HTML + 必要 CSS,可含少量 JS 用于 menu / 弹窗);
  3. 语义化结构图(landmarks + sections);
  4. 表单字段清单(label / name / type / required / autocomplete / validation);
  5. 边界测试:空 / 长 / 短 / 错 / 仅键盘 / 仅屏幕阅读器 6 类各 1 例;
  6. axe + Lighthouse + W3C Validator 报告(HTML / JSON 原文);
  7. README:项目介绍、运行步骤、目录结构、复盘;
  8. 复盘记录:用时、难点、收获、下一步。

本主题贡献(Loop 6-D · html-css-responsive / html-semantics-and-forms)

本主题给所有前端子主题铺”语义正确 + 表单可填 + 屏幕阅读器可读”的工程底座,让每一段 HTML 都能被 axe-core 收、键盘走得通、屏幕阅读器跳区、表单错误能被 aria-live 朗读。

3 项核心职责

4 项交付物

  1. Semantic HTML 模板页:含完整 landmark 树(<header> / <nav> / <main> / <article> / <aside> / <footer>)+ heading 级别清单,axe 0 critical。
  2. 表单组件库:login / register / search / contact 4 类表单,每类带 label / autocomplete / validation / aria-describedby / aria-live 错误段,外加键盘路径逐项记录。
  3. aria- 决策表*:每条 semantic 缺口 → 选择哪个 aria-* → 验证命令(axe + 屏幕阅读器手测),明确”何时用 ARIA、何时优先改语义”。
  4. 边界测试 6 类:空 / 长 / 短 / 错 / 仅键盘 / 仅屏幕阅读器,每类 1 例截图 + axe + W3C Validator 报告(HTML / JSON 原文)。

3 个验收指标

8. 推荐开源资料

阶段角色资料链接用法
1~8权威参考MDN HTML elements referencehttps://developer.mozilla.org/en-US/docs/Web/HTML/Element查元素语义、attribute 与 content model
4~8权威参考MDN Forms guideshttps://developer.mozilla.org/en-US/docs/Learn/Forms表单主线
6~8权威参考MDN ARIAhttps://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIAARIA 速查
1~8规范WHATWG HTML Living Standardhttps://html.spec.whatwg.org/multipage/HTML 唯一权威
6~8规范WAI-ARIA 1.2https://www.w3.org/TR/wai-aria-1.2/ARIA 规范
6~8验收基准WCAG 2.2https://www.w3.org/TR/WCAG22/无障碍验收
1~8入门web.dev — Learn HTMLhttps://web.dev/learn/html/Google 出品,结构清晰
6~8入门web.dev — Accessibilityhttps://web.dev/accessibility/Google 实践
6~8速查The A11y Projecthttps://www.a11yproject.com/a11y checklist
6~8控件范式WAI ARIA Authoring Practices Guidehttps://www.w3.org/WAI/ARIA/apg/自定义控件写法
6~8自动化axe-core ruleshttps://github.com/dequelabs/axe-core/tree/develop/docaxe 规则清单
7~8工具axe DevTools 浏览器扩展https://www.deque.com/axe/devtools/浏览器内 a11y 扫描
7~8验证W3C HTML Validatorhttps://validator.w3.org/标红 HTML 错误
8历史HTML5 Doctorhttp://html5doctor.com/元素语义史

许可证提示:MDN 内容采用 CC BY-SA 2.5;WCAG / WAI-ARIA 规范文本由 W3C 公开;axe-core 是 MPL-2.0;web.dev 文章为 CC BY 4.0。复制代码或长段引用前先看 LICENSE;默认做法是读思路后自己重写,而不是复制粘贴

默认使用顺序:MDN / WHATWG 规范查文档 → web.dev / A11y Project 走主线 → 自己写 demo → 跑 axe DevTools + W3C Validator → 看 axe-core rules 排错 → WCAG 2.2 对照验收 → 必要时再查 ARIA Authoring Practices 写自定义控件。

9. 学习资料汇聚(v0.3 自包含)

9.1 背景与动机

HTML 在 1991 年只用来描述超文本——标题、段落、链接。1999 年 HTML 4.01 是上一代”完整”标准。2014 年 HTML5 标准发布,<header><nav><main><article><section> 等 landmark 出现,浏览器与屏幕阅读器从”按 div 猜”变成”按标签定位”。2023 年 WAI-ARIA 1.2 让任何自定义控件也能向辅助技术暴露语义。

形式化的语义带来三件事:1) 屏幕阅读器能跳区(Skip to main content);2) 搜索引擎能识别主内容;3) 表单能原生校验并被屏幕阅读器读出来。

9.2 概念地图

flowchart LR
  Doc[文档 doctype/html/head/body] --> Lang[html lang]
  Doc --> Meta[meta: viewport / color-scheme]
  Doc --> Title[title]
  Doc --> Link[link: stylesheet / preload]

  Body --> Landmark[landmark: header/nav/main/aside/footer]
  Body --> Section[article/section + heading]
  Section --> Figure[figure + figcaption]
  Section --> Details[details + summary]
  Section --> Time[time datetime]

  Body --> Form[form]
  Form --> Label[label for / aria-labelledby]
  Form --> Fieldset[fieldset + legend]
  Form --> Input[input + type + pattern]
  Form --> Datalist[datalist]
  Form --> Output[output]
  Form --> Validation[Constraint Validation API]

  Body --> A11y[ARIA: roles / aria-* / aria-live]
  A11y --> Focus[tabindex / skip link / roving tabindex]

9.3 基础知识讲解

9.3.1 论文 / 规范

资料影响建议读法
W3C HTML Living Standard — Semantics当前 HTML 唯一权威查元素语义、attribute 与 content model
WAI-ARIA 1.2ARIA 角色与属性决定”何时加 role vs 直接换 native 元素”
WCAG 2.2 — Success Criterion 1.3.1 / 4.1.2landmark 与 label 强制要求验收必查
HTML5: A vocabulary and associated APIs (W3C, 2014)HTML5 历史规范留作溯源

9.3.2 经典书籍

作者用法
HTML5: The Missing ManualMatthew MacDonald入门主线
Web Content Accessibility Guidelines 配套书various配套 WCAG 2.2
Inclusive ComponentsHeydon Pickering控件 a11y 进阶

9.3.3 优秀博客 / 文档

资料用法
MDN HTML elements reference默认查文档
MDN Forms guides表单主线
MDN ARIAARIA 速查
web.dev — Learn HTMLGoogle 出品
The A11y Projecta11y 速查
axe-core rules自动化规则清单
WAI — ARIA Authoring Practices自定义控件写法
HTML5 Doctor元素语义历史

9.3.4 核心人物

人物主要影响建议追踪的材料
Tim Berners-LeeHTML / Web 起源1989 提案
Ian HicksonHTML5 主编(2004~2011)WHATWG 早期
Anne van KesterenWHATWG 编辑HTML Living Standard
Steve FaulknerHTML 与 ARIA 实践博客与 Twitter
Léonie WatsonAT 视角的 a11yTetralogical 博客
Heydon Pickering包容性组件Inclusive Components

9.3.5 开发方法

方法具体动作何时用
Native first先用原生元素(<button><select>),不够再加 ARIA一开始
Label-or-aria-label表单控件必须有可访问名表单必查
Skip-to-content first landmark跳转链接作为第一个可聚焦元素长页面
Live region 谨慎aria-live="polite" 通知,避免 assertive表单提交反馈
Heading-rank continuity不跳级结构清晰

9.3.6 必读资源子集(≥5 条)

  1. MDN HTML elements reference
  2. MDN Forms: Structuring web forms
  3. WAI-ARIA 1.2 Spec
  4. web.dev — Learn HTML / Accessibility
  5. The A11y Project — Checklist
  6. WAI ARIA Authoring Practices Guide
  7. axe-core rules

9.4 经典问题与经典案例

#问题为什么重要最简答案
1<div onClick> 代替 <button>丢键盘与屏幕阅读器<button type="button">;如要 styled-as-div,CSS reset button 样式
2<label>用户名</label> 不绑label 与 input 无关联,点 label 不聚焦<label for="username"> + input id 同步
3多 main / 多 nav 冲突landmark 重复报错嵌套时给次级 nav 加 aria-label 区分
4placeholder 代替 label失去焦点后输入无标签label 永远在;placeholder 仅作提示
5错误用 alert() 通报屏幕阅读器抢焦点aria-live 区域展示提交反馈
6<fieldset> 内多个独立 <legend>字段分组语义混乱一个 fieldset 一个 legend
7autocomplete=“off” 关掉自动填充用户体验变差改为 autocomplete="email" 等标准 token
8<select> 内塞自定义 UI原生 select 不能样式化所有浏览器简单用 native;如必须自定义,用 Listbox pattern + ARIA + 键盘
9必填字段无 requiredaria-required屏幕阅读器不读”必填”HTML required + aria-required="true" 兼容旧 AT
10焦点被抢走用 JS .focus() 不当仅在用户行为(提交)后聚焦;保持文档顺序
11tabindex="1" 显式排序干扰 natural tab ordertabindex="0" 纳入顺序;负数挪走
12隐藏元素仍可聚焦display:none 后 Tab 还进inertvisibility:hidden + tabindex="-1"

9.5 学习难点

概念难点

难点为什么卡突破路径
article vs section vs div难定”何时升级”有独立可分发内容 = article;按主题分组 = section;纯装饰 = div
landmark 嵌套怕报”multiple main”nav 嵌套时给子 nav 加 aria-label;aside 内的 nav 用次级
当用 native vs 当用 ARIA写错都被 axe 报永远 prefer native;ARIA 只在 native 不够时

思维难点

难点为什么卡突破路径
表单 UX 与 a11y 拉扯为了好看改控件用 CSS 把原生控件画漂亮;不替换语义
错误信息写法不知何时 poparia-describedby 指向错误段落;切下一段 aria-live

工程难点

难点为什么卡突破路径
表单反垃圾不挡真人honeypot / 时间戳副作用时间戳 + 简单 <input type="text" hidden tabindex="-1"> + 服务端校验
多页表单状态刷新丢失默认 <form> 提交即可;如要 SPA,用 <output> + history API
表单 i18nlabel / error 文案分散抽成对象 + aria-label="t('email')"

9.6 技术标准与接口

9.6.1 Entity

名称版本发布组织状态许可证
HTML Living Standard持续WHATWGLiving StandardCC BY 4.0 / public-domain source
WAI-ARIA1.2W3C WAIRecommendation公开
WCAG2.2W3CRecommendation公开
Constraint Validation APIHTML Living StandardWHATWG稳定同上

9.6.2 Scope

9.6.3 Structure

9.6.4 Ecosystem

9.6.5 Depth Tiers

层级能力HTML 子主题可观察标准
L0知道存在知道有 landmark、表单、ARIA
L1看得懂示例能读懂 MDN 表单示例
L2能正确调用能写语义化结构 + 无障碍表单
L3能解释与排错能解释何时用 ARIA;能修 axe 报错
L4能设计与扩展能设计自定义组件 + 键盘 + 屏幕阅读器三条路径

本子主题目标:L3

9.6.6 Source

10. 常见误区

11. 所有知识点分类(统一规则)

本子主题归属:前端与客户端 主 + 无障碍(工程技术) 辅。

直接依赖(0)

查看知识图谱