안녕하세요, 코드 챌린지 참가자 여러분! 이번 챌린지에 참여해 주셔서 진심으로 감사드립니다. 바쁜 일정 중에도 시간을 내어 과제를 제출해 주신 덕분에 의미 있는 검토 과정을 진행할 수 있었습니다.
우선 제출해 주신 과제들을 하나하나 꼼꼼히 검토하다 보니 예상보다 시간이 많이 소요되어 결과 공유가 늦어진 점 양해 부탁드립니다. 각자의 코드와 접근 방식을 세심하게 살펴보며 최대한 공정하고 건설적인 피드백을 제공하고자 노력했습니다.
이번 검토 결과는 리뷰어의 주관적인 관점이 반영된 것이므로, 정확하지 않거나 놓친 부분이 있을 수 있음을 미리 말씀드립니다. 혹시 결과에 대해 궁금한 점이나 추가 설명이 필요한 부분이 있으시면 언제든 문의해 주시기 바랍니다.
목차
아무래도 이번 과제는 접근성 이 주제였던 만큼 모달과 폼 요소의 접근성을 얼마나 잘 챙겼는지를 집중적으로 보았어요.
먼저, 모달의 경우 키보드 컨트롤 , 스크롤 처리 , 포커스 처리 와 같은 부분을 어떻게 처리했는지 리뷰했어요.
const Modal = (props) => (
<div
aria-modal="true"
aria-labelledby={props.title}
aria-describedby={props.description}
role="dialog"
{...props}
/>
);
useEffect(() => {
if (open) {
document.body.style.overflow = 'hidden';
}
return () => {
document.body.style.overflow = '';
};
}, [open]);
useEffect(() => {
const handleKeyDown = (event: KeyboardEvent) => {
if (event.key === "Escape" && isOpen) {
onClose();
}
};
if (isOpen) {
document.addEventListener("keydown", handleKeyDown);
}
return () => {
document.removeEventListener("keydown", handleKeyDown);
};
}, [isOpen, onClose]);
const handleOverlayClick = (event: React.MouseEvent<HTMLDivElement>) => {
if (event.target === event.currentTarget) {
onClose();
}
};
다음으로, 폼도 모달과 마찬가지로 필드와 에러 항목에 대한 전체적인 접근성 속성 , 시멘틱 요소와 타입 속성 활용 , 논리적 탭 을 얼마나 잘 구현했는지를 중점적으로 확인해보았어요.
<label htmlFor={inputId}>
{labelText}
</label>
<input
ref={ref}
id={inputId}
aria-invalid={error ? 'true' : 'false'}
aria-describedby={describedBy}
aria-required={required}
{...props}
/>