김사람 블로그
thumbnail
커스텀 셀렉트 박스(Custom Select Box)
React / CSS
2022.08.19.

select 태그 이용

  • select 태그를 사용하지 않고, div 태그나 ul, li 태그를 이용하여 custom select box를 만들 수 있습니다.

  • 하지만 그렇게 만든 select box는 모바일과 같은 작은 화면에서 이용하기 불편할 수 있습니다.

  • select 태그는 모바일에서 적절하게 바뀌어 동작하기에, select 태그를 이용한 custom select box를 공유합니다.


Select Box
테스트

  • 박스를 클릭했을 때 보이는 옵션의 개수를 제한하기 위해 select 태그의 동작을 이벤트마다 직접 코딩하였습니다.

  • 스크롤바가 없기 때문에, scroll down이 가능하다는 의미로 가장 밑의 옵션을 절반만 보이게 디자인하였습니다.

  • 선택된 옵션이 파란 배경이 되는 것은 변경할 방법이 없는 것 같습니다. (select 태그의 디자인 한계..)


React
// JSX in React

<select
  onFocus={(e) => {
    if (e.target.childElementCount > 7) e.target.size = 7;
    else e.target.size = e.target.childElementCount;
  }}
  onBlur={(e) => {
    e.target.size = 1;
  }}
  onChange={(e) => {
    e.target.blur();
  }}
  ...
>
  <option>...</option>
  ...
</select>
/* CSS */

select::-ms-expand {
  display: none;
}
select {
  -o-appearance: none;
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;

  position: absolute; /* 상대위치 X / 절대위치 O */
  padding: 0.3em 0.5em;
  border-radius: 0.3em;
  background-color: #f0f0f0;
  border: none;
  font-family: inherit; /* 이미 font-family가 있거나 reset css 적용시 필요 X */
  font-size: 1.5rem;
  cursor: pointer;
}
select::-webkit-scrollbar {
  display: none;
}
select:hover {
  font-weight: 600; /* font-weight에 따라 너비가 달라질 수 있으니 주의 */
}
select:focus {
  outline: none;
  font-weight: 600;
}
select option {
  margin-bottom: 0.15em;
}
select option:checked,
select option:hover {
  font-weight: 600;
}

참고 링크

웹워커 타이머(Web Worker Timer)
← 다음 글
TimeLog
이전 글 →
We can love completely without complete understanding.
- Norman Maclean, A River Runs Through it.