pile·
프론트엔드·vercel-blogVercel Blog·

Next.js 사이트 접근성 개선 — ARIA 패턴, 모션 설정, 색각 이상 대응까지

Vercel 팀이 Next.js Conf 등록 사이트의 접근성을 개선한 과정을 정리했다. 방문자의 최대 20%가 보조 기술(스크린 리더 등)을 사용한다는 전제 아래, 타겟 크기부터 ARIA 패턴, 색각 이상 대응까지 6가지 구체적인 구현을 다룬다.

핵심 포인트
  • Fitts' 법칙 적용: 푸터 메뉴 타겟 36px→60px(패딩 12px), 운동 장애 사용자 오조작 감소
  • ARIA: 테마 선택기를 button에서 radio input + label 조합으로 교체, 스크린 리더가 컨트롤 역할 이해
  • prefers-reduced-motion: 루프 애니메이션 5초 후 정지, transform/layout 비활성화(opacity는 유지)
  • 색깔만으로 정보 전달 금지: Vordle 게임에서 색각 이상 사용자 피드백 후 아이콘 추가
  • role=alert + aria-atomic: 에러 발생 시 스크린 리더가 전체 메시지를 즉시 읽어줌
상세 정리
  • 타겟 크기 문제: 푸터 메뉴가 36px로 너무 작아 로그아웃 중 메뉴 닫힘 사고 발생. 패딩 12px 추가로 60px 달성. Fitts' 법칙(타겟 클수록 클릭 시간 단축)을 실제 버그 해결에 적용.
  • ARIA 라디오 패턴: 티켓 테마 선택기를 단순 button이 아닌 W3 ARIA 명세의 radio button input + label 조합으로 구현. 스크린 리더가 선택 가능한 옵션 중 하나임을 이해하게 됨.
  • 구체적인 alt text: "Ticket theme #1" 같은 무의미한 alt 대신 "빛이 프리즘에서 세 방향으로 굴절되는 흑백 테마" 처럼 시각적 내용을 담아 비시각 사용자도 옵션 차이 파악 가능.
  • 폼 에러 메시징: 에러 컨테이너를 DOM에 항상 존재시키고 role=alert + aria-atomic=true 부여. 에러 발생 시 스크린 리더가 전체 메시지를 즉시 읽어줌.
  • prefers-reduced-motion: CSS 미디어 쿼리로 감지. 프리즘 밝기 낮추고, 루프 애니메이션 5초 후 정지, transform/layout 애니메이션 비활성화. opacity 전환은 정보 전달 목적이라 유지.
  • Vordle(워드 게임) 색각 이상 문제: 추측 정확도를 색상만으로 전달하다 색각 이상 사용자 접근 불가 사례 발생. 사용자 피드백 후 아이콘을 추가해 색상+형태 두 채널로 전달. 색깔만으로 정보 전달 금지 원칙의 실증 사례.
  • 게임 접근성 추가: table 구조로 시맨틱 조직, 게임 상태 설명 table heading, 시각적으로 숨겨진 h1 랜드마크, og:image:alt 속성으로 소셜 공유 이미지 설명.
  • 권장 도구: axe 브라우저 확장(자동 감사), 스크린 리더 직접 테스트, Chrome DevTools 시각 장애 에뮬레이션 + 접근성 패널.
  • 핵심 교훈: 자동화 도구는 기술적 위반만 잡고, 실제 접근성은 장애가 있는 사용자의 직접 피드백이 필요. Vordle 사례가 대표적.
왜 읽나Next.js 또는 웹 앱의 접근성을 실제로 개선하려는 프론트엔드 개발자에게 ARIA 패턴, 모션 설정, 색각 이상 대응, 에러 메시징의 구체적 구현 예시와 이유를 함께 제공한다.
vercel-blog
Vercel Blog 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 프론트엔드·LINE EngineeringLINE Engineering·

    AI로 웹 엔지니어 없이 LINE 앱 안에서 그룹 영상 통화 서비스 만들기

    LINE Planet 팀의 PM과 Android 엔지니어 두 명이 웹 전문 엔지니어 없이 LINE 앱 내에서 그룹 영상 통화 서비스를 개발한 과정을 다룬다. LIFF(LINE Front-end Framework)와 LINE Planet SDK를 활용해 React/Vite 기반 웹 앱을 구성했고, Firebase Cloud Functions로 별도 서버 인프라 없이 구현을 완료했다.

    #react#webrtc#firebase+2