폼 레이블
placeholder와 aria-label을 사용해도 레이블 문제가 남는 이유
HTML Accessible Name Computation 알고리즘 우선순위와 placeholder 비표시 한계, 명시적 <label for> 결합의 중요성을 다룹니다.
실무 검증 기록
마크업 및 접근성 트리 대조
본 기록은 공개 fixture와 재현 조건을 기준으로 정리한 기술 설명입니다. 실제 브라우저·스크린리더 조합의 동작은 별도 수동 검토가 필요합니다.
| 검증 상태 | 공개 fixture 및 공식 규격 대조 완료 |
|---|---|
| 검증 기준 | 공개 fixture 및 재현 조건 |
| 검증 범위 | 폼 레이블 for/id 연결 vs placeholder 단독 사용 비교 및 명시된 입력값에 한정 |
| 수동 확인 | 실제 브라우저·키보드·스크린리더 환경에서 별도 확인 필요 |
| fixture에서 확인한 기대 결과 | [실패 상태] 입력 후 placeholder가 사라져 지속 이름이 없음 ➔ [수정 목표] 영구 label 및 설명 연결 추가 |
검증에 사용된 실제 픽스처 / 재현 조건
placeholder-only input과 label for/id input 비교- CSS visibility:hidden 또는 display:none 처리된 숨김 레이블의 시각적 식별성 판정 한계
- 다국어 자동완성(autocomplete) 속성에 따른 브라우저 고유 레이블 덮어쓰기 현상
웹 폼 입력 필드에서 <label> 요소 없이 placeholder 속성이나 aria-label만으로 레이블을 대체할 경우, 사용자가 텍스트를 입력하는 순간 힌트가 사라져 필드 목적을 잃어버리는 문제가 발생합니다. W3C Accessible Name Computation 알고리즘 우선순위와 명시적 <label for> 결합의 필요성을 분석합니다.
Accessible Name Computation 알고리즘 산출 우선순위
브라우저 접근성 엔진이 폼 필드의 접근가능한 이름(Accessible Name)을 계산할 때 다음 우선순위를 적용합니다.
1순위: aria-labelledby 속성이 참조하는 요소 텍스트, 2순위: aria-label 속성값, 3순위: <label for='id'>로 명시적으로 연결된 텍스트, 4순위: title 속성값, 5순위: input의 placeholder 속성값. placeholder는 최하위 순위이며 입력값이 들어가는 순간 화면에서 사라져 시각적 안내 역할을 상실합니다.
placeholder 속성의 시각적·인지적 한계점
placeholder는 입력 힌트(Hint) 목적으로 설계된 속성이며 정식 레이블(Label)이 아닙니다. 사용자가 필드에 단 1글자라도 입력하면 placeholder 텍스트가 사라지므로, 재검토 시 해당 필드가 무엇을 입력받는 곳인지 파악하기 어렵습니다.
또한 대다수 브라우저의 기본 placeholder 색상은 명암비가 2.5:1 수준으로 낮아 저시력 사용자가 읽기 어려우며, 색상을 강제로 어둡게 수정하면 실제 입력값과 구분하기 힘든 부작용이 생깁니다.
올바른 명시적 HTML <label> 결합 구현 코드
입력 필드에는 항상 영구적으로 노출되는 명시적 <label> 요소를 결합해야 합니다.
- 명시적 결합: <label for='user-email'>이메일 주소</label><input type='email' id='user-email' />
- 암시적 결합: <label>이메일 주소 <input type='email' /></label>
- 시각적 숨김 레이블: 디자인상 레이블을 화면에 숨겨야 하는 경우 .sr-only 클래스를 사용하여 접근성 트리에 텍스트를 남깁니다.
흔한 마크업 안티패턴과 올바른 예방책
| 잘못된 마크업 패턴 | 올바른 접근성 구현 |
|---|---|
| <input> 태그에 label 요소 없이 placeholder='이름을 입력하세요'만 지정하고 레이블을 생략하는 것 | placeholder와 별개로 영구 노출되는 <label for='...'> 요소 또는 .sr-only 레이블을 제공합니다. |
| <label> 태그를 시각적으로 배치했으나 input id 속성과 label for 속성을 연동하지 않는 것 | label의 for 속성값과 input의 id 속성값이 1:1로 일치하도록 작성하여 포커스 이동 및 접근성 이름을 연동합니다. |
보조공학 낭독 및 브라우저 파싱 한계
- 시각적으로 보이는 레이블 텍스트와 aria-label의 문자열이 완전히 불일치하면 SC 2.5.3(Label in Name) 음성 명령 실패가 발생합니다.
- 오류 발생 시 안내 텍스트가 aria-describedby로 동적 연결되어 있는지 여부는 폼 상태 변화 시점에 별도 확인해야 합니다.