fe-a11y
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseFE Accessibility Audit
前端可访问性审计
$ARGUMENTS按照WCAG 2.1 AA标准检查通过传递的文件的可访问性。
$ARGUMENTS검사 절차
检查流程
- 대상 파일 읽기: 컴포넌트 코드를 분석한다
- 체크리스트 기반 검사: 8개 카테고리에 대해 검사한다
- 리포트 생성: 위반 사항과 수정 코드를 제시한다
- 读取目标文件:分析组件代码
- 基于清单检查:针对8个分类进行检查
- 生成报告:列出违规事项并提供修改代码
검사 체크리스트
检查清单
1. 시맨틱 HTML
1. 语义化HTML
- /
<div>남용 대신 적절한 시맨틱 태그 사용<span>- ,
<nav>,<main>,<aside>,<header>,<footer>,<section><article> - (클릭 가능 요소),
<button>(네비게이션)<a> - /
<ul>(목록),<ol>(표형 데이터)<table>
- 헤딩 계층 순서 (→
h1→h2, 건너뛰기 금지)h3 - ,
<img>에 대체 텍스트<svg>
tsx
// Bad
<div onClick={handleClick}>Submit</div>
// Good
<button onClick={handleClick}>Submit</button>- 避免滥用/
<div>,使用合适的语义化标签<span>- ,
<nav>,<main>,<aside>,<header>,<footer>,<section><article> - (可点击元素),
<button>(导航)<a> - /
<ul>(列表),<ol>(表格型数据)<table>
- 标题层级顺序(→
h1→h2,禁止跳过层级)h3 - ,
<img>需添加替代文本<svg>
tsx
// Bad
<div onClick={handleClick}>Submit</div>
// Good
<button onClick={handleClick}>Submit</button>2. ARIA 속성
2. ARIA属性
- 인터랙티브 커스텀 위젯에 적절한 role + ARIA 속성
- ,
aria-label— 시각적 레이블이 없는 요소aria-labelledby - — 추가 설명이 필요한 요소
aria-describedby - ,
aria-expanded— 드롭다운/모달aria-haspopup - — 동적 콘텐츠 업데이트 알림
aria-live - — 장식용 요소
aria-hidden="true"
tsx
// 토스트 알림
<div role="alert" aria-live="polite">
{message}
</div>
// 아이콘 버튼
<button aria-label="Close dialog">
<XIcon aria-hidden="true" />
</button>- 为交互式自定义小部件添加合适的role + ARIA属性
- ,
aria-label— 无视觉标签的元素aria-labelledby - — 需要额外说明的元素
aria-describedby - ,
aria-expanded— 下拉菜单/模态框aria-haspopup - — 动态内容更新通知
aria-live - — 装饰性元素
aria-hidden="true"
tsx
// 提示通知
<div role="alert" aria-live="polite">
{message}
</div>
// 图标按钮
<button aria-label="Close dialog">
<XIcon aria-hidden="true" />
</button>3. 키보드 네비게이션
3. 键盘导航
- 모든 인터랙티브 요소가 Tab으로 접근 가능
- 커스텀 위젯에 키보드 핸들러 (,
Enter,Space, 화살표키)Escape - 포커스 트랩 — 모달/다이얼로그 내 포커스 순환
- Skip navigation 링크 (메인 콘텐츠로 바로 이동)
- 논리적인 탭 순서 (양수값 사용 금지)
tabIndex
tsx
// 모달 포커스 트랩 (shadcn/ui Dialog는 자동 지원)
<Dialog>
<DialogContent>
{/* Tab 키가 이 안에서만 순환 */}
</DialogContent>
</Dialog>- 所有交互式元素可通过Tab键访问
- 为自定义小部件添加键盘事件处理器(,
Enter,Space, 方向键)Escape - 焦点陷阱 — 模态框/对话框内的焦点循环
- 跳过导航链接(直接跳转到主内容)
- 合理的Tab顺序(禁止使用正数值)
tabIndex
tsx
// 模态框焦点陷阱(shadcn/ui Dialog自动支持)
<Dialog>
<DialogContent>
{/* Tab键仅在此区域内循环 */}
</DialogContent>
</Dialog>4. 색상 & 대비
4. 颜色与对比度
- 텍스트 대비율 최소 4.5:1 (일반), 3:1 (큰 텍스트 18px+)
- 색상만으로 정보를 전달하지 않음 (아이콘, 텍스트 병행)
- 다크 모드에서도 대비율 충족
- 포커스 표시 (outline) 제거 금지 — 사용
focus-visible
tsx
// Bad — 색상만으로 상태 표현
<span className={isError ? "text-red-500" : "text-green-500"}>
{status}
</span>
// Good — 아이콘 + 텍스트 병행
<span className={isError ? "text-red-500" : "text-green-500"}>
{isError ? <AlertIcon aria-hidden="true" /> : <CheckIcon aria-hidden="true" />}
{isError ? "Error: " : "Success: "}{status}
</span>- 文本对比度最低为4.5:1(常规文本),3:1(大文本18px+)
- 不单独使用颜色传递信息(需搭配图标、文本)
- 深色模式下也需满足对比度要求
- 禁止移除焦点标识(outline)—— 使用
focus-visible
tsx
// Bad — 仅用颜色表示状态
<span className={isError ? "text-red-500" : "text-green-500"}>
{status}
</span>
// Good — 图标+文本搭配
<span className={isError ? "text-red-500" : "text-green-500"}>
{isError ? <AlertIcon aria-hidden="true" /> : <CheckIcon aria-hidden="true" />}
{isError ? "错误: " : "成功: "}{status}
</span>5. 폼 접근성
5. 表单可访问性
- +
<label>로 입력 필드와 연결htmlFor - 에러 메시지를 로 연결
aria-describedby - 필수 필드에 또는
aria-required="true"required - 자동완성: 속성 적절히 설정
autoComplete - 유효성 검사 결과를 스크린리더에 전달
tsx
// shadcn/ui Form은 자동으로 접근성 처리
<FormField
control={form.control}
name="email"
render={({ field }) => (
<FormItem>
<FormLabel>Email</FormLabel>
<FormControl>
<Input {...field} autoComplete="email" />
</FormControl>
<FormDescription>We'll never share your email.</FormDescription>
<FormMessage /> {/* aria-describedby 자동 연결 */}
</FormItem>
)}
/>- 使用+
<label>关联输入字段htmlFor - 通过关联错误提示信息
aria-describedby - 必填字段添加或
aria-required="true"required - 自动完成:合理设置属性
autoComplete - 向屏幕阅读器传递验证结果
tsx
// shadcn/ui Form自动处理可访问性
<FormField
control={form.control}
name="email"
render={({ field }) => (
<FormItem>
<FormLabel>邮箱</FormLabel>
<FormControl>
<Input {...field} autoComplete="email" />
</FormControl>
<FormDescription>我们绝不会分享您的邮箱。</FormDescription>
<FormMessage /> {/* 自动关联aria-describedby */}
</FormItem>
)}
/>6. 이미지 & 미디어
6. 图片与媒体
- 정보를 전달하는 이미지: 의미 있는 텍스트
alt - 장식용 이미지: 또는
alt=""aria-hidden="true" - 복잡한 이미지 (차트, 그래프): 상세 설명 제공
- Next.js 컴포넌트에
<Image>필수alt
tsx
// 정보 전달 이미지
<Image src="/chart.png" alt="2024년 매출 추이: 1분기 100억, 2분기 150억" />
// 장식용 이미지
<Image src="/bg-pattern.png" alt="" aria-hidden="true" />- 传递信息的图片:使用有意义的文本
alt - 装饰性图片:设置或
alt=""aria-hidden="true" - 复杂图片(图表、图形):提供详细说明
- Next.js 组件必须添加
<Image>属性alt
tsx
// 传递信息的图片
<Image src="/chart.png" alt="2024年营收趋势:第一季度100亿,第二季度150亿" />
// 装饰性图片
<Image src="/bg-pattern.png" alt="" aria-hidden="true" />7. 동적 콘텐츠
7. 动态内容
- 로딩 상태: , 로딩 안내 텍스트
aria-busy="true" - 페이지 전환: 포커스를 새 콘텐츠로 이동
- 무한 스크롤: 대안 네비게이션 제공 (페이지네이션)
- 토스트/알림: 또는
role="alert"aria-live="polite"
- 加载状态:使用及加载提示文本
aria-busy="true" - 页面切换:将焦点移至新内容
- 无限滚动:提供替代导航方式(分页)
- 提示/通知:使用或
role="alert"aria-live="polite"
8. shadcn/ui 접근성 패턴
8. shadcn/ui可访问性模式
shadcn/ui는 Radix UI 기반으로 대부분의 접근성이 내장되어 있지만, 확인해야 할 사항:
- :
Dialog+DialogTitle필수DialogDescription - : 트리거 버튼에 명확한 레이블
DropdownMenu - :
Toast영역 설정aria-live - : 키보드 포커스로 표시 가능
Tooltip - : 화살표 키 네비게이션 동작 확인
Tabs - : 포커스 트랩 + ESC로 닫기
Sheet
shadcn/ui基于Radix UI构建,大部分可访问性功能已内置,但仍需检查以下事项:
- :必须包含
Dialog+DialogTitleDialogDescription - :触发按钮需设置清晰标签
DropdownMenu - :设置
Toast区域aria-live - :可通过键盘焦点显示
Tooltip - :确认方向键导航功能正常
Tabs - :焦点陷阱 + 按ESC关闭
Sheet
리포트 형식
报告格式
markdown
undefinedmarkdown
undefinedAccessibility Audit: [파일명]
可访问性审计:[文件名]
요약
摘要
- WCAG 2.1 AA 준수율: [N]%
- 위반: N개 (Critical: N, Major: N, Minor: N)
- WCAG 2.1 AA合规率:[N]%
- 违规:N项(严重:N,主要:N,次要:N)
Critical (WCAG A 위반)
严重(违反WCAG A级标准)
[A1] 이슈 제목
[A1] 问题标题
- 기준: WCAG [번호] [이름]
- 위치:
파일:라인 - 문제: 설명
- 수정안: 코드
- 标准:WCAG [编号] [名称]
- 位置:
文件:行号 - 问题:说明
- 修改方案:代码
Major (WCAG AA 위반)
主要(违反WCAG AA级标准)
...
...
Minor (개선 권장)
次要(建议改进)
...
...
통과 항목
通过项
- ...
undefined- ...
undefined실행 규칙
执行规则
- 인자가 없으면 사용자에게 검사 대상을 질문한다
- shadcn/ui 컴포넌트 사용 여부를 확인하고, 내장 접근성 기능을 고려한다
- 수정안에는 항상 구체적인 코드를 포함한다
- 자동 테스트로 잡을 수 없는 수동 검증 항목도 안내한다
- 若无参数,询问用户检查目标
- 确认是否使用shadcn/ui组件,并考虑其内置可访问性功能
- 修改方案中必须包含具体代码
- 同时说明自动测试无法检测到的手动验证项