# 创建无障碍网页 ![无障碍知识全览](../../../../translated_images/zh-CN/webdev101-a11y.8ef3025c858d897a.webp) > 草图笔记由 [Tomomi Imura](https://twitter.com/girlie_mac) 制作 ```mermaid journey title 你的无障碍学习之旅 section 基础 了解用户: 5: 你 测试工具: 4: 你 POUR 原则: 5: 你 section 技能提升 语义化 HTML: 4: 你 视觉设计: 5: 你 ARIA 技术: 4: 你 section 精通实践 键盘导航: 5: 你 表单无障碍: 4: 你 真实环境测试: 5: 你 ``` ## 课前测验 [课前测验](https://ff-quizzes.netlify.app/web/) > 网络的力量在于它的普遍性。无论是否有残疾,人人都能访问是其核心要素。 > > \- Sir Timothy Berners-Lee,W3C 董事兼万维网发明者 这里有个可能会让你惊讶的事实:当你构建无障碍网站时,你不仅是在帮助残障人士——你实际上是在让网络对所有人更好用! 你有没有注意到街角的轮椅斜坡?它们最初是为轮椅设计的,但现在同样方便推婴儿车的人、搬运员推货车、带滚轮行李的旅行者和骑自行车的人。这正是无障碍网页设计的原理——帮助某一群体的解决方案最终会惠及所有人。相当酷,对吧? 在这节课中,我们将探讨如何创建真正适合所有人的网站,无论他们如何浏览网络。你将学习已经内置于网页标准中的实用技巧,动手使用测试工具,并了解无障碍如何让你的网站对所有用户都更易用。 课程结束时,你将有信心让无障碍成为开发工作流程中的自然一环。准备好探索那些用心设计如何为数十亿用户打开网络的大门了吗?开始吧! ```mermaid mindmap root((网页无障碍)) Users Screen readers Keyboard navigation Voice control Magnification Technologies HTML semantics ARIA attributes CSS focus indicators Keyboard events Benefits Wider audience Better SEO Legal compliance Universal design Testing Automated tools Manual testing User feedback Real assistive tech ``` > 你也可以在 [Microsoft Learn](https://docs.microsoft.com/learn/modules/web-development-101/accessibility/?WT.mc_id=academic-77807-sagibbon) 在线学习这堂课! ## 了解辅助技术 在开始编码之前,让我们先花点时间了解不同能力的人们是如何体验网络的。这不仅仅是理论——理解这些真实的导航模式会让你成为更出色的开发者! 辅助技术是非常了不起的工具,它们帮助残障人士以你可能想不到的方式与网站交互。一旦你掌握了这些技术的运作方式,创建无障碍网页体验就会变得更加直观。这就像学会用别人的视角来看你的代码。 ### 屏幕阅读器 [屏幕阅读器](https://en.wikipedia.org/wiki/Screen_reader) 是复杂的技术,它们将数字文本转换成语音或盲文输出。虽然主要用于视障人士,但它们对有阅读障碍等学习障碍的用户也非常有帮助。 我喜欢把屏幕阅读器想象成一个非常聪明的讲解者在为你朗读书籍。它以合乎逻辑的顺序朗读内容,宣布交互元素如“按钮”或“链接”,并提供键盘快捷键以跳转页面。然而,屏幕阅读器只有在我们构建的网站具有正确结构和有意义的内容时,才能发挥作用。这就需要你作为开发者参与进来了! **各平台流行的屏幕阅读器:** - **Windows**: [NVDA](https://www.nvaccess.org/about-nvda/)(免费且最受欢迎),[JAWS](https://webaim.org/articles/jaws/),[Narrator](https://support.microsoft.com/windows/complete-guide-to-narrator-e4397a0d-ef4f-b386-d8ae-c172f109bdb1/?WT.mc_id=academic-77807-sagibbon)(内置) - **macOS/iOS**: [VoiceOver](https://support.apple.com/guide/voiceover/welcome/10)(内置且性能强大) - **Android**: [TalkBack](https://support.google.com/accessibility/android/answer/6283677)(内置) - **Linux**: [Orca](https://wiki.gnome.org/Projects/Orca)(免费开源) **屏幕阅读器浏览网页内容的方式:** 屏幕阅读器为有经验的用户提供多种高效的导航方式: - **顺序阅读**:从上到下读取内容,就像看书一样 - **地标导航**:在页面章节间跳转(头部,导航,主内容,页脚) - **标题导航**:跳转标题,以了解页面结构 - **链接列表**:生成所有链接的列表,快速访问 - **表单控件**:直接在输入框和按钮间导航 > 💡 **让人惊讶的是**:68% 的屏幕阅读器用户主要通过标题导航 ([WebAIM 调查](https://webaim.org/projects/screenreadersurvey9/#finding))。这意味着你的标题结构就像用户的导航图——当你弄对了,它们能帮助用户更快地找到内容! ### 构建你的测试工作流程 好消息是——有效的无障碍测试不必让人望而生畏!你需要结合自动化工具(它们非常擅长捕捉明显的问题)和一些手动测试。以下是我发现的一个体系化方法,能最大限度地发现问题且不会占用你太多时间: **必备的手动测试工作流程:** ```mermaid flowchart TD A[🚀 开始测试] --> B{⌨️ 键盘导航} B --> C[通过 Tab 键浏览所有交互元素] C --> D{🎧 屏幕阅读器测试} D --> E[使用 NVDA/VoiceOver 测试] E --> F{🔍 放大测试} F --> G[放大至 200% 并测试功能] G --> H{🎨 颜色/对比度检查} H --> I[验证所有文本满足对比度要求] I --> J{👁️ 聚焦管理} J --> K[确保聚焦指示器可见] K --> L[✅ 测试完成] style A fill:#e3f2fd style L fill:#e8f5e8 style B fill:#fff3e0 style D fill:#f3e5f5 style F fill:#e0f2f1 style H fill:#fce4ec style J fill:#e8eaf6 ``` **逐步测试检查表:** 1. **键盘导航**:仅使用 Tab、Shift+Tab、Enter、空格键和方向键操作 2. **屏幕阅读器测试**:启动 NVDA、VoiceOver 或 Narrator,闭眼操作导航 3. **缩放测试**:分别测验 200% 和 400% 缩放级别 4. **颜色对比检查**:检查所有文本和 UI 组件 5. **焦点指示测试**:确保所有交互元素都有可见焦点样式 ✅ **从 Lighthouse 开始**:打开浏览器开发者工具,运行 Lighthouse 无障碍审计,再用结果指导手动测试重点。 ### 缩放和放大工具 你知道吗,当文本太小而你在手机上捏合放大,或者在强光下眯眼看笔记本时?很多用户每天都依赖放大工具让内容可读。这包括视力低下者、老年人,以及任何曾尝试在户外阅读网页的人。 现代缩放技术不仅是放大而已。了解这些工具的工作原理有助于你设计出响应式页面,无论放大多少倍都保持功能性和美观。 **现代浏览器的缩放能力:** - **页面缩放**:成比例缩放所有内容(文本、图片、布局)——这是首选方法 - **仅文本缩放**:只放大字体大小,保持原有布局 - **捏合缩放**:移动端手势支持临时放大 - **浏览器支持**:所有现代浏览器支持最多 500% 缩放且不影响功能 **专用放大软件:** - **Windows**: [放大镜](https://support.microsoft.com/windows/use-magnifier-to-make-things-on-the-screen-easier-to-see-414948ba-8b1c-d3bd-8615-0e5e32204198)(内置),[ZoomText](https://www.freedomscientific.com/training/zoomtext/getting-started/) - **macOS/iOS**: [Zoom](https://www.apple.com/accessibility/mac/vision/)(内置,带高级功能) > ⚠️ **设计要点**:WCAG 要求内容在放大到 200% 时仍保持功能。此时应尽量避免横向滚动,所有交互元素都应保持可访问。 ✅ **测试响应式设计**:将浏览器缩放至 200% 和 400%。你的布局是否优雅适应?是否能使用全部功能且无需过度滚动? ## 现代无障碍测试工具 了解了人们如何用辅助技术浏览网页后,我们来看看帮助你构建和测试无障碍网站的工具。 简单来说:自动化工具擅长发现明显问题(比如缺少替代文本),而手动测试帮助你确保网站在真实使用中感觉良好。二者结合,让你有信心网站惠及所有人。 ### 颜色对比测试 好消息是:颜色对比是最常见的无障碍问题之一,但也是最容易修正的。良好的对比度惠及所有人——从视障用户到在海滩上看手机的人。 **WCAG 对比度要求:** | 文本类型 | WCAG AA(最低要求) | WCAG AAA(增强要求) | |-----------|--------------------|---------------------| | **普通文本**(小于18pt) | 4.5:1 对比度 | 7:1 对比度 | | **大号文本**(18pt及以上或14pt加粗) | 3:1 对比度 | 4.5:1 对比度 | | **UI 组件**(按钮,表单边框) | 3:1 对比度 | 3:1 对比度 | **必备测试工具:** - [Colour Contrast Analyser](https://www.tpgi.com/color-contrast-checker/) - 桌面应用带取色器 - [WebAIM Contrast Checker](https://webaim.org/resources/contrastchecker/) - 网站工具即时反馈 - [Stark](https://www.getstark.co/) - 针对 Figma, Sketch, Adobe XD 的设计插件 - [Accessible Colors](https://accessible-colors.com/) - 查找可访问的配色方案 ✅ **打造更好的色彩方案**:从品牌颜色出发,使用对比度工具创建无障碍变体。将它们作为设计系统的无障碍色彩标记记录下来。 ### 全面无障碍审计 最有效的无障碍测试是结合多种方法。没有单一工具能发现所有问题,因此建立多元测试流程能确保覆盖全面。 **基于浏览器的测试(集成在开发者工具中):** - **Chrome/Edge**:Lighthouse 无障碍审计 + 无障碍面板 - **Firefox**:带详细树视图的无障碍检查器 - **Safari**:Web Inspector 审计标签页 + VoiceOver 模拟 **专业测试插件:** - [axe DevTools](https://www.deque.com/axe/devtools/) - 行业内标准的自动测试工具 - [WAVE](https://wave.webaim.org/extension/) - 可视反馈与错误高亮 - [Accessibility Insights](https://accessibilityinsights.io/) - 微软的综合测试套件 **命令行和 CI/CD 集成:** - [axe-core](https://github.com/dequelabs/axe-core) - 用于自动测试的 JS 库 - [Pa11y](https://pa11y.org/) - 命令行无障碍测试工具 - [Lighthouse CI](https://github.com/GoogleChrome/lighthouse-ci) - 自动无障碍评分 > 🎯 **测试目标**:力争 Lighthouse 无障碍得分至少 95 分。记住,自动工具只能发现约 30-40% 的无障碍问题——手动测试依然不可少! ### 🧠 **测试技能自测:准备找问题了吗?** **来看看你对无障碍测试的感觉:** - 目前你觉得哪个测试方式最容易上手? - 你能想象只用键盘导航一天吗? - 你曾在线上遇到过哪些无障碍障碍? ```mermaid pie title "不同方法捕捉到的无障碍问题" "自动化工具" : 35 "人工测试" : 40 "用户反馈" : 25 ``` > **增强信心**:专业无障碍测试员正是使用上述组合方法。你正在学习行业标准的实践! ## 从根基开始构建无障碍 无障碍成功的关键是从一开始就将它构建进你的基础。虽然可能会想“我以后再加无障碍”,但这就像房子建好后再加坡道。可能吗?可以。但容易吗?不太。 把无障碍想象成房屋规划——在初期建筑设计时包含轮椅通道,要远比事后改造轻松很多。 ### POUR 原则:你的无障碍基石 《网页内容无障碍指南》(WCAG) 建立在四个基本原则之上,简称 POUR。别担心,这些并非枯燥的学术概念,而是实用指南,帮助你制作适合所有人的内容。 掌握了 POUR,做无障碍相关决策会更加顺畅。这就像有一个心理清单指导你的设计选择。我们来逐条拆解: ```mermaid flowchart LR A[🔍 可感知的
用户能感知到吗?] --> B[🎮 可操作的
用户能使用吗?] B --> C[📖 可理解的
用户能理解吗?] C --> D[💪 稳定的
它能在任何地方工作吗?] A1[替代文本
字幕
对比度] --> A B1[键盘访问
无癫痫发作
时间限制] --> B C1[清晰的语言
可预测的
错误帮助] --> C D1[有效代码
兼容
面向未来] --> D style A fill:#e1f5fe style B fill:#e8f5e8 style C fill:#fff3e0 style D fill:#f3e5f5 ``` **🔍 可感知(Perceivable)**:信息必须以用户能通过其感官感知的方式呈现 - 为非文本内容(图片、视频、音频)提供文本替代 - 确保所有文本和 UI 组件有足够的颜色对比度 - 为多媒体内容提供字幕和文字稿 - 设计内容在放大至 200% 时仍保持功能 - 使用多重感官属性(不仅仅是颜色)传达信息 **🎮 可操作(Operable)**:所有界面组件必须可通过可用输入方式操作 - 使所有功能可通过键盘导航访问 - 给用户充足时间阅读和交互 - 避免引发癫痫或前庭障碍的内容 - 通过清晰结构和地标帮助用户高效导航 - 确保交互元素有足够触控面积(至少44像素) **📖 可理解(Understandable)**:信息和界面操作必须清晰且易懂 - 使用适合目标用户的清晰简洁语言 - 保证内容出现和操作方式可预测、一致 - 为用户输入提供清晰的指引和错误提示 - 帮助用户理解并纠正表单错误 - 通过合理的阅读顺序和信息层级组织内容 **💪 稳健(Robust)**:内容必须在不同技术和辅助设备中可靠工作 - **使用有效且语义化的 HTML 作为基础** - **确保兼容当前和未来的辅助技术** - **遵循网页标准和最佳实践的标记规范** - **在不同浏览器、设备和辅助工具上进行测试** - **构建内容结构,以便在不支持高级功能时可优雅降级** ### 🎯 **POUR 原则检查:让它深入人心** **对基础的快速反思:** - 你能想到哪些网站功能未能满足每个 POUR 原则吗? - 作为开发者,哪个原则对你来说最自然? - 这些原则如何改善所有人的设计,而不仅仅是残障用户? ```mermaid quadrantChart title POUR 原则影响矩阵 x-axis 低投入 --> 高投入 y-axis 低影响 --> 高影响 quadrant-1 快速胜利 quadrant-2 重大项目 quadrant-3 后续考虑 quadrant-4 战略重点 Alt Text: [0.2, 0.9] Color Contrast: [0.3, 0.8] Semantic HTML: [0.4, 0.9] Keyboard Nav: [0.6, 0.8] ARIA Complex: [0.8, 0.7] Screen Reader Testing: [0.7, 0.6] ``` > **记住**:从高影响、低难度的改进开始。语义化 HTML 和 alt 文本能以最低的努力带来最大的无障碍提升! ## 创建无障碍的视觉设计 良好的视觉设计和无障碍是相辅相成的。当你以无障碍为设计出发点时,你常常会发现这些限制会带来更简洁、更优雅的解决方案,惠及所有用户。 让我们探讨如何创建对所有人都友好的视觉设计,无论他们的视觉能力如何,也无论他们在何种条件下浏览内容。 ### 颜色和视觉无障碍策略 颜色是强有力的沟通手段,但不应成为传达重要信息的唯一方式。超越颜色的设计创造了更强健、更包容的体验,适用性更广。 **考虑色觉差异进行设计:** 约有 8% 的男性和 0.5% 的女性存在某种形式的色觉差异(通常称为“色盲”)。最常见的类型有: - **红绿色盲(Deuteranopia)**:难以区分红色和绿色 - **红色弱视(Protanopia)**:红色看起来更加暗淡 - **蓝黄色盲(Tritanopia)**:难以区分蓝色和黄色(罕见) **包容性色彩策略:** ```css /* ❌ Bad: Using only color to indicate status */ .error { color: red; } .success { color: green; } /* ✅ Good: Color plus icons and context */ .error { color: #d32f2f; border-left: 4px solid #d32f2f; } .error::before { content: "⚠️"; margin-right: 8px; } .success { color: #2e7d32; border-left: 4px solid #2e7d32; } .success::before { content: "✅"; margin-right: 8px; } ``` **超越基础对比度要求:** - 使用色盲模拟器测试你的配色 - 结合使用图案、纹理或形状与颜色编码 - 确保交互状态无需色彩也能区分 - 考虑设计在高对比度模式下的表现 ✅ **测试你的颜色无障碍性**:使用诸如 [Coblis](https://www.color-blindness.com/coblis-color-blindness-simulator/) 之类的工具查看不同色觉用户如何看到你的网站。 ### 焦点指示器和交互设计 焦点指示器是数字世界中的光标——它向键盘用户显示他们在页面上的位置。设计良好的焦点指示器通过使交互清晰且可预测来提升所有用户的体验。 **现代焦点指示器最佳实践:** ```css /* Enhanced focus styles that work across browsers */ button:focus-visible { outline: 2px solid #0066cc; outline-offset: 2px; box-shadow: 0 0 0 4px rgba(0, 102, 204, 0.25); } /* Remove focus outline for mouse users, preserve for keyboard users */ button:focus:not(:focus-visible) { outline: none; } /* Focus-within for complex components */ .card:focus-within { box-shadow: 0 0 0 3px rgba(74, 144, 164, 0.5); border-color: #4A90A4; } /* Ensure focus indicators meet contrast requirements */ .custom-focus:focus-visible { outline: 3px solid #ffffff; outline-offset: 2px; box-shadow: 0 0 0 6px #000000; } ``` **焦点指示器要求:** - **可见性**:必须与周围元素保持至少 3:1 的对比度 - **宽度**:元素周围必须至少有 2px 的厚度 - **持续性**:焦点移动到别处之前需要一直可见 - **区分性**:必须与其他 UI 状态有明显视觉差异 > 💡 **设计建议**:优秀的焦点指示器通常结合使用轮廓、盒阴影和颜色变化,以确保在不同背景和场景下都能清晰可见。 ✅ **审查焦点指示器**:用 Tab 键遍历你的网站,记录哪些元素有清晰的焦点指示器。有没有难以看清或完全缺失的? ### 语义 HTML:无障碍的基础 语义 HTML 就像为你的网页提供一套 GPS 系统。当你为 HTML 元素赋予正确的语义时,基本上为屏幕阅读器、键盘和其他辅助工具提供了详细的导航路线图,帮助用户高效浏览。 我特别喜欢这个比喻:语义 HTML 的区别就像一个有明确类别和指示牌的图书馆,与一个书籍乱扔的仓库。两者虽然都有书,但你更愿意在哪个地方找书?没错! ```mermaid flowchart TD A[🏠 HTML 文档] --> B[📰 头部] A --> C[🧭 导航] A --> D[📄 主要内容] A --> E[📋 页脚] B --> B1[h1:网站名称
标志与品牌] C --> C1[ul:导航
主要链接] D --> D1[article:内容
section:子部分] D --> D2[aside:侧边栏
相关内容] E --> E1[nav:页脚链接
版权信息] D1 --> D1a[h1:页面标题
h2:主要部分
h3:子部分] style A fill:#e3f2fd style B fill:#e8f5e8 style C fill:#fff3e0 style D fill:#f3e5f5 style E fill:#e0f2f1 ``` **构建无障碍页面结构的基本模块:** ```html

Your Site Name

Article Title

Published on

First Section

Content that relates to this section...

Second Section

More related content...

``` **语义 HTML 如何改变无障碍体验:** | 语义元素 | 作用 | 屏幕阅读器优势 | |------------------|---------|----------------------| | `
` | 页面或区域的页眉 | “横幅地标” - 快速导航至顶部 | | `