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

라디오

서로 배타적인 선택 하나 — 고른 뒤에도 나머지 선택지가 계속 보여야 할 때.

입력

실제 미리보기

출처

<fieldset class="dc-rd">
  <legend class="dc-rd__legend">배송 방법</legend>
  <div class="dc-rd__list">
    <label class="dc-rd__item">
      <input class="dc-rd__input" type="radio" name="ship-method" value="normal" checked>
      <span class="dc-rd__text">일반 배송
        <span class="dc-rd__sub">2~3일 안에 도착, 무료</span>
      </span>
    </label>
    <label class="dc-rd__item">
      <input class="dc-rd__input" type="radio" name="ship-method" value="fast">
      <span class="dc-rd__text">빠른 배송
        <span class="dc-rd__sub">다음 날 도착, 3,000원</span>
      </span>
    </label>
    <label class="dc-rd__item">
      <input class="dc-rd__input" type="radio" name="ship-method" value="pickup" disabled>
      <span class="dc-rd__text">매장 수령
        <span class="dc-rd__sub">가까운 매장에 재고가 없습니다</span>
      </span>
    </label>
  </div>
</fieldset>
.dc-rd {
  border: 0; margin: 0; padding: 0;
  max-width: 420px; font-family: var(--dc-font);
}
.dc-rd__legend {
  padding: 0; margin-bottom: var(--dc-2);
  font-size: 14px; font-weight: 600; color: var(--dc-text);
}
.dc-rd__list { display: flex; flex-direction: column; gap: var(--dc-1); }
.dc-rd__item {
  display: flex; align-items: flex-start; gap: var(--dc-3);
  min-height: 44px; padding: var(--dc-2) 0; cursor: pointer;
}
.dc-rd__input {
  appearance: none; -webkit-appearance: none;
  flex: none; width: 22px; height: 22px; margin: 0;
  position: relative; top: 1px;
  border: 1px solid var(--dc-line-field); border-radius: var(--dc-r-full);
  background: var(--dc-surface); cursor: inherit;
  transition: border-color var(--dc-fast), border-width var(--dc-fast);
}
.dc-rd__input:hover { border-color: var(--dc-line-bold); }
.dc-rd__input:checked { border: 7px solid var(--dc-brand); }
.dc-rd__input:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--dc-brand-soft); }
.dc-rd__input[disabled] { background: var(--dc-sunken); border-color: var(--dc-line); cursor: not-allowed; }
.dc-rd__input[disabled]:checked { border-color: var(--dc-text-mute); }
.dc-rd__text {
  display: flex; flex-direction: column; gap: 2px;
  font-size: 15px; line-height: 1.5; color: var(--dc-text);
}
.dc-rd__sub { font-size: 13px; line-height: 1.5; color: var(--dc-text-sub); }
.dc-rd__input[disabled] ~ .dc-rd__text { color: var(--dc-text-mute); }
.dc-rd--inline .dc-rd__list { flex-direction: row; flex-wrap: wrap; gap: var(--dc-5); }
.dc-rd--card .dc-rd__item {
  padding: var(--dc-3); align-items: center;
  border: 1px solid var(--dc-line-field); border-radius: var(--dc-r-md);
  background: var(--dc-surface);
  transition: border-color var(--dc-fast), background var(--dc-fast);
}
.dc-rd--card .dc-rd__item:hover { border-color: var(--dc-line-bold); }
.dc-rd--card .dc-rd__item:has(.dc-rd__input:checked) {
  border-color: var(--dc-brand); background: var(--dc-brand-soft);
}

이렇게 씁니다

  • 하나는 반드시 기본으로 골라 둔다. 아무것도 고르지 않은 상태가 답이 되면 체크박스를 쓸 자리다
  • fieldset·legend 로 질문을 붙인다 — 스크린리더가 "배송 방법, 1/3"처럼 읽어 준다
  • 선택지마다 값·기간 같은 설명이 필요하면 카드형으로 넓힌다

주의할 점

  • 같은 묶음의 radio 는 name 이 같아야 한다 — 다르면 여러 개가 동시에 켜진다
  • 고를 수 없는 선택지는 지우지 말고 비활성으로 남겨 이유를 적어 둔다

다음에 볼 것