본문 바로가기
명함 만들기 캐릭터 모음 16가지 디자인 · PNG / SVG / PDF

선택 상자

정해진 목록에서 하나만 고를 때 — 선택지가 여섯 개를 넘고 화면 높이를 아껴야 할 때.

입력

실제 미리보기

출처

<div class="dc-sel">
  <label class="dc-sel__label" for="dc-sel-ship">배송 시간대</label>
  <span class="dc-sel__wrap">
    <select class="dc-sel__input" id="dc-sel-ship" name="ship" aria-describedby="dc-sel-ship-help">
      <option value="">선택해 주세요</option>
      <option value="am">오전 (09시~12시)</option>
      <option value="pm" selected>오후 (13시~18시)</option>
      <option value="night">저녁 (18시~21시)</option>
    </select>
    <svg class="dc-sel__icon" viewBox="0 0 20 20" width="18" height="18" aria-hidden="true" focusable="false"><path d="M5 8l5 5 5-5" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" /></svg>
  </span>
  <p class="dc-sel__help" id="dc-sel-ship-help">기사님 경로에 따라 30분 정도 차이가 날 수 있습니다.</p>
</div>
.dc-sel {
  display: flex; flex-direction: column; gap: var(--dc-2);
  max-width: 360px; font-family: var(--dc-font);
}
.dc-sel__label { font-size: 14px; font-weight: 600; color: var(--dc-text); }
.dc-sel__wrap { position: relative; display: block; }
.dc-sel__input {
  appearance: none; -webkit-appearance: none;
  width: 100%; min-height: 44px;
  padding: 0 calc(var(--dc-6) + var(--dc-2)) 0 var(--dc-3);
  border: 1px solid var(--dc-line-field); border-radius: var(--dc-r-sm);
  background: var(--dc-surface); color: var(--dc-text);
  font-family: inherit; font-size: 15px; line-height: 1.4;
  transition: border-color var(--dc-fast), box-shadow var(--dc-fast);
}
.dc-sel__input:hover { border-color: var(--dc-line-bold); }
.dc-sel__input:focus {
  outline: none; border-color: var(--dc-brand);
  box-shadow: 0 0 0 3px var(--dc-brand-soft);
}
.dc-sel__input[aria-invalid="true"] { border-color: var(--dc-danger); }
.dc-sel__input[disabled] {
  background: var(--dc-sunken); color: var(--dc-text-mute);
  border-color: var(--dc-line); cursor: not-allowed;
}
.dc-sel__icon {
  position: absolute; top: 50%; right: var(--dc-3);
  transform: translateY(-50%); pointer-events: none;
  color: var(--dc-text-sub);
}
.dc-sel__input[disabled] ~ .dc-sel__icon { color: var(--dc-text-mute); }
.dc-sel__help { margin: 0; font-size: 13px; line-height: 1.5; color: var(--dc-text-sub); }
.dc-sel__error {
  margin: 0; display: flex; align-items: flex-start; gap: var(--dc-1);
  font-size: 13px; font-weight: 600; line-height: 1.5; color: var(--dc-danger);
}
.dc-sel--sm .dc-sel__input { min-height: 36px; font-size: 14px; }

이렇게 씁니다

  • 선택지가 다섯 개 이하이고 서로 비교해야 하면 라디오가 낫다
  • 첫 항목은 값이 아니라 "선택해 주세요"로 두고, 기본값이 있다면 그 값을 처음부터 골라 둔다
  • 선택지가 많으면 optgroup 으로 묶어 훑어보기 쉽게 한다

주의할 점

  • 네이티브 select 를 흉내낸 목록으로 바꾸면 키보드·스크린리더 동작을 전부 다시 만들어야 한다
  • 화살표 아이콘만큼 오른쪽 여백을 주지 않으면 긴 항목 이름이 아이콘에 겹친다

다음에 볼 것