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

주소 입력 폼

검색으로 받아 오는 주소와 사람이 손으로 적는 상세 주소를 갈라 놓는 조각 — 오타 한 글자로 배송이 틀어지지 않게.

폼 · 패턴

실제 미리보기

출처

<form class="dc-addr" action="#" method="post" novalidate>
  <h2 class="dc-addr__title">받는 곳</h2>

  <div class="dc-addr__field">
    <label class="dc-addr__label" for="dc-ad-zip">우편번호</label>
    <div class="dc-addr__row">
      <input class="dc-addr__input dc-addr__input--zip" id="dc-ad-zip" name="zip" type="text" inputmode="numeric" autocomplete="postal-code" maxlength="5" value="06236" readonly>
      <button class="dc-addr__search" type="button">주소 검색</button>
    </div>
    <p class="dc-addr__hint">검색으로 고른 주소가 들어갑니다. 직접 고치지 않습니다.</p>
  </div>

  <div class="dc-addr__field">
    <label class="dc-addr__label" for="dc-ad-base">기본 주소</label>
    <input class="dc-addr__input" id="dc-ad-base" name="address1" type="text" autocomplete="address-line1" value="서울 강남구 테헤란로 123" readonly>
  </div>

  <div class="dc-addr__field">
    <label class="dc-addr__label" for="dc-ad-detail">상세 주소</label>
    <input class="dc-addr__input" id="dc-ad-detail" name="address2" type="text" autocomplete="address-line2" placeholder="동 · 호수 · 층">
  </div>

  <div class="dc-addr__field">
    <label class="dc-addr__label" for="dc-ad-memo">배송 기사에게 남길 말 <span class="dc-addr__opt">선택</span></label>
    <input class="dc-addr__input" id="dc-ad-memo" name="memo" type="text" placeholder="안 계시면 경비실에 맡겨 주세요">
  </div>

  <label class="dc-addr__check">
    <input class="dc-addr__checkbox" type="checkbox" checked>
    <span>기본 배송지로 저장</span>
  </label>

  <button class="dc-addr__submit" type="submit">이 주소로 저장</button>
</form>
.dc-addr { display:flex; flex-direction:column; gap:var(--dc-4); width:100%; max-width:460px; margin-inline:auto; padding:var(--dc-6); border:1px solid var(--dc-line); border-radius:var(--dc-r-lg); background:var(--dc-surface); box-shadow:var(--dc-sh-1); font-family:var(--dc-font); }
.dc-addr__title { font-size:18px; font-weight:700; color:var(--dc-text); }
.dc-addr__field { display:flex; flex-direction:column; gap:var(--dc-2); }
.dc-addr__label { font-size:13px; font-weight:600; color:var(--dc-text); }
.dc-addr__opt { margin-left:var(--dc-1); padding:1px var(--dc-2); border-radius:var(--dc-r-full); background:var(--dc-sunken); color:var(--dc-text-mute); font-size:11px; font-weight:600; }
.dc-addr__row { display:flex; gap:var(--dc-2); align-items:center; }
.dc-addr__input { width:100%; min-height:44px; padding: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-size:15px; transition:border-color var(--dc-fast), box-shadow var(--dc-fast); }
.dc-addr__input::placeholder { color:var(--dc-text-mute); }
.dc-addr__input:focus { border-color:var(--dc-brand); box-shadow:0 0 0 3px var(--dc-brand-soft); }
.dc-addr__input[readonly] { background:var(--dc-sunken); color:var(--dc-text-sub); }
.dc-addr__input--zip { flex:0 0 120px; width:120px; letter-spacing:.06em; }
.dc-addr__input--bad { border-color:var(--dc-danger); }
.dc-addr__search { flex:0 0 auto; min-height:44px; padding:0 var(--dc-4); border:1px solid var(--dc-line-field); border-radius:var(--dc-r-sm); background:var(--dc-sunken); color:var(--dc-text); font-size:13px; font-weight:600; cursor:pointer; }
.dc-addr__search:hover { background:var(--dc-brand-soft); color:var(--dc-brand-text); }
.dc-addr__select { width:100%; min-height:44px; padding: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-size:15px; }
.dc-addr__grid { display:grid; grid-template-columns:1fr 1fr; gap:var(--dc-3); }
.dc-addr__hint { font-size:12px; color:var(--dc-text-mute); }
.dc-addr__error { font-size:12px; color:var(--dc-danger); }
.dc-addr__check { display:flex; align-items:center; gap:var(--dc-2); min-height:44px; font-size:13px; color:var(--dc-text-sub); cursor:pointer; }
.dc-addr__checkbox { width:20px; height:20px; accent-color:var(--dc-brand); }
.dc-addr__submit { min-height:48px; padding:0 var(--dc-4); border:1px solid transparent; border-radius:var(--dc-r-sm); background:var(--dc-brand); color:var(--dc-text-on); font-size:15px; font-weight:700; cursor:pointer; transition:background var(--dc-fast); }
.dc-addr__submit:hover { background:var(--dc-brand-hi); }
@media (max-width:420px) {
  .dc-addr { padding:var(--dc-4); }
  .dc-addr__grid { grid-template-columns:1fr; }
}

이렇게 씁니다

  • 우편번호와 기본 주소는 검색으로 채우고 고치지 못하게 둔다 — 손으로 적는 순간 배송이 틀어진다
  • 사람이 적는 칸은 상세 주소와 기사에게 남길 말 둘로 줄인다
  • 해외 주소는 칸의 순서와 이름이 나라마다 다르다 — 국가를 먼저 고르게 하고 그 뒤 칸을 바꾼다

주의할 점

  • 읽기 전용 칸을 disabled 로 만들지 않는다 — 값이 서버로 가지 않고 스크린 리더도 건너뛴다. readonly 를 쓴다
  • 우편번호 칸에 inputmode=numeric 을 넣어 휴대폰에서 숫자판이 뜨게 한다

다음에 볼 것