일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- ai로 앱 만들기
- html
- 공유 오피스
- 리더
- 느린 서버
- 테드스페이스
- React
- turborepo
- css
- JS
- typescript
- 스타트업
- PM
- 빠른 서버
- Regexp
- Domination Game
- Django
- javascript
- 동료리뷰
- python
- 2인 사무실
- XFrameOptions
- iframe
- multiprocessing
- 구로 공유 오피스
- 구로 디지털 단지 사무실
- select css
- 개발자
- 좋은 리더란
- select tag
- Today
- Total
개발하는 일상
예쁜 select 태그를 만들고 싶다면 꼭 알아야 하는 속성 tabIndex 본문
한 줄 요약
select 태그를 커스텀하게 만들고 싶다면 div 태그에 tabIndex="0"
속성을 주고, blur 이벤트리스너를 활용해보자
여러 옵션 중 하나를 선택할 수 있게 해주는 HTML 태그가 있다. select 태그인데, 내부 운영용 툴을 만들다가 이 태그를 쓰게 되었다. select 태그를 쓰게 되면 디폴트로 아래 그림1와 같은 디자인이 따라온다. 이 디자인은 css로 바꿀 수 없다는 것이 문제였다.
아무리 내부용 툴이지만 이렇게 만들고 싶진 않아서, div 태그로 직접 select 태그를 구현하기로 했다. 적절한 style과 클릭 이벤트리스너를 달아서 아래 그림2와 같은 태그를 만들었다.
div 태그로 select 태그를 흉내내면서 생긴 하나의 문제가 있었다. select 태그는 선택지를 열고나서 태그 이외의 영역을 클릭하면 선택지가 닫힌다. 내가 아는 선에서는 이걸 구현하기 위해서 window 등 전역 레벨에 클릭 이벤트리스너를 달아서 처리해야했다. 그런데 이 방법이 마음에 들지 않았다. 프로젝트가 커지면 전역에 클릭 이벤트 리스너를 다는게 나중에 어떤 사이드 이펙트를 불러올지 모르기 때문이었다. 그래서 찾다보니 tabIndex라는 개념을 알게 되었다.
mdn에서는 "tabIndex는 요소가 포커스 가능함을 나타낸다"라고 설명한다. select 태그가 클릭되면 요소가 포커스되면서 focus 이벤트가 발생한다. 그리고 다른 곳을 클릭하면 그 포커스를 잃어버리는 blur 이벤트가 발생한다. 이런일은 기본적으로 input 태그처럼 상호작용이 일어나는 태그에만 발생한다. 그런데 tabIndex를 활용하면 그렇지 않은 div 태그도 포커스되도록 설정할 수 있는 것이다. 즉 원래 그렇지 않던 div 태그에도 focus 이벤트와, blur 이벤트가 발생하도록 설정할 수 있다.
정리하면, select 태그를 흉내낸 div 태그에 tabIndex="0"으로 속성을 부여하고 blur 이벤트리스너에 열렸던 선택지를 닫아주는 콜백함수를 달아주면 원했던 동작을 깔끔하게 처리할 수 있다.
'개발 간단 팁' 카테고리의 다른 글
Next의 router.push는 사실 동기가 아닐걸요? (0) | 2024.07.17 |
---|---|
github copilot 2년동안 사용한 사람의 활용 팁 (1) | 2024.03.17 |
Typescript Function Overloading의 설명과 사용법(Function return type based on input parameter) (0) | 2022.06.22 |
history.go와 history.pushState의 실행 순서(order of history.go and history.pushState) (0) | 2022.06.21 |
javascript parseInt가 이상하다면? (0) | 2021.10.24 |