포커스

상태

포커스

Focus

포커스는 지금 이 요소가 키보드 입력을 받고 있다는 사실을 눈에 보이게 나타내는 상태로, 키보드 사용자에게 현재 위치를 알려 줍니다.

Tab 키로 이동하면 포커스 링이 나타납니다.
링 강제 표시

정의

포커스는 지금 이 요소가 키보드 입력을 받고 있다는 사실을 눈에 보이게 표시하는 상태입니다. 마우스 없이 Tab 키만으로 화면을 넘나들 때, 요소 둘레에 나타나는 또렷한 테두리, 이른바 포커스 링이 지금 내가 어디에 서 있는지를 알려 줍니다. 여기서 Enter나 Space를 누르면 그 요소가 눌리고, Tab을 다시 누르면 다음 자리로 이동합니다. 마우스 사용자에게 커서가 현재 위치를 알려 주듯, 포커스 링은 키보드 사용자에게 없어서는 안 될 나침반 역할을 합니다. 버튼, 링크, 입력 칸처럼 조작할 수 있는 요소라면 무엇이든 이 포커스를 받을 수 있어야 합니다.

왜 중요한가

모든 사용자가 마우스를 쓰는 것은 아닙니다. 손이 불편한 사람, 화면 낭독기를 함께 쓰는 사람, 그리고 그냥 키보드가 빠른 개발자까지, 많은 이들이 Tab 키로 화면을 조작합니다. 이들에게 포커스 표시가 없으면 지금 커서가 어느 버튼에 있는지 전혀 알 수 없어, 눈을 감고 방 안을 더듬는 것과 다르지 않습니다. 그래서 포커스 링은 취향이 아니라 접근성의 기본 요건입니다. 또렷한 포커스 표시는 키보드 사용자가 헤매지 않고 원하는 곳까지 정확히 도달하게 해 주고, 폼처럼 순서가 중요한 화면에서 지금 어느 칸을 채우고 있는지도 분명히 보여 줍니다. 잘 갖춰진 포커스는 더 많은 사람이 이 화면을 실제로 쓸 수 있게 만드는 문입니다. 접근성은 소수만을 위한 배려가 아니라, 상황에 따라 누구나 키보드에 의존하게 되는 순간을 위한 기본기라는 점을 기억해 두면 좋습니다. 마우스가 갑자기 말을 안 들을 때나 긴 폼을 빠르게 채워야 할 때, 결국 우리 모두가 잠깐씩 키보드 사용자가 되기 때문입니다.

흔한 실수

  • 보기 싫다는 이유로 outline을 없애 버리고 대체 표시를 전혀 두지 않는 것입니다. 이러면 키보드 사용자는 커서가 어디 있는지 알 수 없어 화면 안에서 완전히 길을 잃습니다. 접근성을 가장 크게 해치는 흔한 실수입니다.
  • 포커스 링의 대비가 너무 약한 것입니다. 배경과 거의 구분되지 않는 연한 테두리는 있으나 마나 하며, 밝은 환경에서는 사실상 보이지 않습니다.
  • 마우스로 눌렀을 때까지 포커스 링이 크게 남아 어수선해 보이는 것입니다. 이걸 없애려다 링 자체를 지워 버려 키보드 사용자까지 피해를 보는 경우가 많습니다.

실무 팁

  • outline을 지우고 싶다면 반드시 다른 또렷한 표시로 대체하세요. 그냥 없애 버리면 키보드 사용자가 길을 잃으므로, 테두리나 그림자 같은 대안을 함께 마련하는 것이 원칙입니다.
  • 마우스 클릭에는 링을 숨기고 키보드 이동에만 링을 보이고 싶다면 focus-visible를 활용하세요. 두 상황을 구분해 주면 화면은 깔끔해지고 접근성은 그대로 지킬 수 있습니다.
  • 포커스 링은 배경과 대비가 충분하도록 색과 두께를 정하세요. 어떤 배경 위에서도 한눈에 들어와야 표시로서 제 역할을 합니다.

AI에게 시키기

outline을 지워서 키보드 포커스가 안 보일 때

아래에 붙여넣을 CSS/JSX에서 `outline: none`이나 `outline: 0`으로 포커스 표시를 없앤 곳을 전부 찾아줘. 버튼·링크·input처럼 조작 가능한 요소는 키보드 포커스가 반드시 보여야 하니, 지운 자리마다 `:focus-visible`로 두께 2px 이상, 배경 대비 3:1 이상인 또렷한 포커스 링을 다시 넣어줘. outline만 지우고 대체 표시가 아예 없는 곳은 접근성 위반으로 따로 표시하고, 테두리나 그림자 같은 대안을 함께 제안해줘. 수정 전/후 코드와 어떤 요소가 위반이었는지 표로 정리해줘.

새 컴포넌트에 포커스 링 스타일을 잡을 때

이 서비스는 [브랜드 성격 — 예: 차분한 금융 대시보드, 강조색은 #2563EB]야. 여기 어울리는 포커스 링 스타일을 설계해줘. 마우스 클릭엔 링이 안 뜨고 키보드 이동에만 보이도록 `:focus-visible`로 만들고, `outline`은 두께 2~3px, `outline-offset`은 2px, 색은 어떤 배경 위에서도 대비 3:1 이상 나오게 잡아줘. 버튼·링크·input·커스텀 컴포넌트에 공통으로 쓸 수 있게 `--focus-ring` 같은 CSS 변수 세트로 뽑고, 라이트/다크 배경 각각에서 대비가 충분한지 근거와 함께 알려줘.

마우스로 눌러도 링이 남아 지저분할 때

아래에 붙여넣을 코드에서 마우스 클릭 후에도 포커스 링이 계속 남아 지저분한 문제를 고쳐줘. 다만 링 자체를 지우면 키보드 사용자가 길을 잃으니 절대 `outline: none`으로 없애지 말고, `:focus`를 `:focus-visible`로 바꿔서 마우스 클릭엔 링을 숨기고 Tab 키 이동에만 링이 보이게 분리해줘. `:focus-visible`를 지원 안 하는 구형 브라우저를 위해 `:focus` 폴백도 함께 남기고, 바꾼 셀렉터를 전후로 비교해서 보여줘.

관련 개념