# 可访问性功能完整指南 ## 概述 本文档详细介绍了Prompt Optimizer UI组件库中的可访问性功能。我们的组件完全符合WCAG 2.1 AA/AAA标准,为所有用户(包括残障用户)提供平等的使用体验。 ## 核心特性 ### 🎯 WCAG 2.1 合规性 - **A级**: 基础可访问性要求 - **AA级**: 推荐的可访问性标准 - **AAA级**: 最高级别的可访问性支持 ### ⌨️ 键盘导航 - Tab键循环导航 - Enter键激活元素 - Escape键关闭模态框 - 方向键导航列表和菜单 - Home/End键快速定位 ### 🔊 屏幕阅读器支持 - 完整的ARIA标签体系 - 实时区域状态通知 - 语义化HTML结构 - 上下文敏感的描述 ### 👀 视觉辅助 - 高对比度模式 - 可调节字体大小 - 聚焦指示器 - 减少动画选项 ## 详细功能介绍 ### 1. useAccessibility Composable 这是我们可访问性功能的核心,提供完整的可访问性支持: ```typescript import { useAccessibility } from '@prompt-optimizer/ui' const { keyboard, // 键盘导航 aria, // ARIA标签管理 announce, // 屏幕阅读器通知 features, // 可访问性特性检测 enableFocusTrap, // 启用焦点陷阱 disableFocusTrap // 禁用焦点陷阱 } = useAccessibility('MyComponent') ``` #### 键盘导航支持 ```vue {{ item.name }} ``` #### ARIA标签管理 ```vue 保存 {{ statusMessage }} ``` ### 2. 焦点管理系统 #### useFocusManager Composable 专业的焦点管理,支持焦点陷阱和自动恢复: ```vue 模态框标题 确认 取消 ``` ### 3. 屏幕阅读器支持组件 #### ScreenReaderSupport 组件 专门为屏幕阅读器用户提供增强支持: ```vue 应用标题 应用内容... ``` ### 4. 可访问性测试工具 #### useAccessibilityTesting Composable 自动化的可访问性合规性检查: ```vue ``` ## 可访问性最佳实践 ### 1. 语义化HTML ```vue 文章标题 发布时间: 2024年1月1日 章节标题 章节内容... 文章标题 文章内容 ``` ### 2. ARIA标签使用 ```vue {{ isSaving ? '保存中...' : '保存' }} 保存当前编辑的文档到本地存储 保存 ``` ### 3. 键盘导航支持 ```vue {{ tab.title }} {{ tabs[activeTab]?.content }} ``` ### 4. 实时状态通知 ```vue {{ errors.name }} {{ isSubmitting ? '提交中...' : '提交' }} {{ statusMessage }} {{ errorMessage }} ``` ## 样式和视觉辅助 ### 1. 聚焦指示器 ```scss // 高可见性的聚焦指示器 .focus-visible { outline: 3px solid #005fcc; outline-offset: 2px; border-radius: 3px; } // 键盘聚焦样式 *:focus-visible { @extend .focus-visible; } // 移除鼠标点击时的聚焦样式 *:focus:not(:focus-visible) { outline: none; } ``` ### 2. 高对比度支持 ```scss // 高对比度模式样式 @media (prefers-contrast: high) { :root { --text-color: #000000; --background-color: #ffffff; --border-color: #000000; --focus-color: #0000ff; } .button { border: 2px solid var(--border-color); background: var(--background-color); color: var(--text-color); } .button:focus { outline: 3px solid var(--focus-color); } } ``` ### 3. 减少动画选项 ```scss // 尊重用户的动画偏好 @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } } // 为需要动画的用户提供平滑体验 @media (prefers-reduced-motion: no-preference) { .animated-element { transition: all 0.3s ease; } } ``` ## 测试指南 ### 1. 键盘导航测试 ```typescript // E2E测试示例 describe('键盘导航测试', () => { it('应该支持Tab键导航', async () => { const page = await browser.newPage() await page.goto('http://localhost:3000') // 模拟Tab键导航 await page.keyboard.press('Tab') const activeElement = await page.evaluate(() => document.activeElement?.tagName) expect(activeElement).toBe('BUTTON') // 模拟Enter键激活 await page.keyboard.press('Enter') // 验证操作结果 }) it('应该支持方向键导航', async () => { await page.focus('[role="tablist"] [role="tab"]:first-child') await page.keyboard.press('ArrowRight') const activeTab = await page.evaluate(() => document.activeElement?.getAttribute('aria-selected') ) expect(activeTab).toBe('true') }) }) ``` ### 2. 屏幕阅读器测试 ```typescript describe('屏幕阅读器支持测试', () => { it('应该包含正确的ARIA标签', async () => { const button = await page.$('button') const ariaLabel = await button?.getAttribute('aria-label') const role = await button?.getAttribute('role') expect(ariaLabel).toBeTruthy() expect(role).toBe('button') }) it('应该更新实时区域', async () => { await page.click('[data-testid="save-button"]') const liveRegion = await page.$('[role="status"]') const content = await liveRegion?.textContent() expect(content).toContain('已保存') }) }) ``` ## 常见问题解决 ### Q: 如何处理动态内容的可访问性? A: 使用实时区域和适当的ARIA标签: ```vue 加载数据 正在加载数据... {{ item.name }} ``` ### Q: 如何处理复杂表单的可访问性? A: 使用字段集、标签关联和错误处理: ```vue 基本信息 姓名(必填) 请输入您的真实姓名 {{ errors.name }} ``` ### Q: 如何确保第三方组件的可访问性? A: 包装第三方组件并添加可访问性支持: ```vue {{ chartDescription }} 查看图表数据表格 类别 数值 {{ item.category }} {{ item.value }} ``` --- *本文档将持续更新,确保涵盖最新的可访问性最佳实践和功能特性。*
应用内容...
发布时间: 2024年1月1日
章节内容...