이번 편의 결과물: contact.html 폼의 입력이 새 타입과 모바일 최적화 속성으로 바뀌고, 자동완성이 채워집니다. 다루는 개념: email/url/tel/date/range 등 입력 타입의 실전 UX, inputmode로 모바일 키보드 제어, enterkeyhint, autocomplete 토큰 체계
이 편에서 만드는 파일
web-practice/portfolio/
└─ contact.html ~ (폼 입력에 새 타입·inputmode·autocomplete 적용, 필드 2개 추가)개념 정리
입력 타입
전통 폼(html_fundamentals)에서는 대부분 text를 썼습니다. HTML5 이후 입력 목적에 맞는 타입을 쓰면 브라우저가 자체 검증과 UI를 대신해 줍니다.
| 타입 | 용도 | 브라우저가 해 주는 것 |
|---|---|---|
email | 이메일 주소 | @ 포함 여부 등 형식 검증 |
tel | 전화번호 | 형식 검증은 없음(국가마다 달라서), 모바일에서 숫자 키패드만 도움 |
url | 웹 주소 | http(s):// 형식 검증 |
date | 날짜 | 달력 UI 제공, 값은 YYYY-MM-DD |
range | 좁은 범위의 수치 | 슬라이더 UI, min/max/step 필요 |
color | 색상 선택 | 색상 선택기 UI, 값은 #rrggbb |
tel은 형식이 나라마다 달라 브라우저가 강제로 검증하지 않습니다. 자릿수·형식을 검사하려면 pattern 속성을 직접 지정해야 합니다.
inputmode와 enterkeyhint
type이 키보드 종류까지 항상 바꿔주지는 않습니다(text에 숫자만 받고 싶을 때 등). inputmode는 모바일 가상 키보드의 종류만 따로 지정합니다.
| inputmode 값 | 키보드 |
|---|---|
numeric | 숫자만 |
tel | 전화번호 키패드 |
email | @가 강조된 키보드 |
url | /가 강조된 키보드 |
enterkeyhint는 가상 키보드의 엔터 키 라벨을 바꿉니다(send, search, next, done 등). 폼의 마지막 입력에 enterkeyhint="send"를 주면 키보드 엔터 키에 “전송”이 표시됩니다.
autocomplete 토큰
autocomplete는 브라우저가 저장해 둔 값을 채워 넣을 필드를 알려줍니다. 값은 정해진 토큰을 씁니다.
| 토큰 | 채우는 값 |
|---|---|
name | 이름 |
email | 이메일 |
tel | 전화번호 |
url | 웹 주소 |
off | 자동완성 끄기(민감한 값 등) |
토큰을 정확히 쓰면 사용자가 이전에 입력한 값을 다시 타이핑하지 않아도 됩니다.
실습
1. 파일 열기
web-practice/portfolio/contact.html의 폼을 엽니다.
2. 코드 작성
기존 이름·이메일·문의 유형·메시지·동의 필드에 속성을 추가하고, tel·url 타입 필드 2개를 새로 추가합니다.
<!-- web-practice/portfolio/contact.html의 연락 폼 -->
<form class="contact-form" novalidate>
<div class="field">
<label for="name">이름</label>
<input type="text" id="name" name="name" autocomplete="name" required />
</div>
<div class="field">
<label for="email">이메일</label>
<input
type="email"
id="email"
name="email"
inputmode="email"
autocomplete="email"
required />
<p class="help">답장을 받을 주소를 적어 주세요.</p>
</div>
<div class="field">
<label for="phone">전화번호(선택)</label>
<input
type="tel"
id="phone"
name="phone"
inputmode="tel"
autocomplete="tel"
pattern="[0-9\-]{9,13}"
placeholder="010-1234-5678" />
</div>
<div class="field">
<label for="portfolio-url">참고 링크(선택)</label>
<input
type="url"
id="portfolio-url"
name="portfolioUrl"
inputmode="url"
autocomplete="url"
placeholder="https://example.com" />
</div>
<div class="field">
<label for="topic">문의 유형</label>
<select id="topic" name="topic" autocomplete="off">
<option value="collab">협업 제안</option>
<option value="hire">채용 제안</option>
<option value="etc">기타</option>
</select>
</div>
<div class="field">
<label for="message">메시지</label>
<textarea
id="message"
name="message"
minlength="10"
enterkeyhint="send"
required></textarea>
<p class="help">프로젝트 내용이나 일정을 간단히 적어 주세요.</p>
</div>
<div class="field field-checkbox">
<input type="checkbox" id="agree" name="agree" required />
<label for="agree">개인정보 수집·이용에 동의합니다</label>
</div>
<button type="submit">보내기</button>
</form>novalidate를 폼에 추가했습니다. 다음 편에서 Constraint Validation API로 오류 메시지를 직접 그리기 전까지는 브라우저 기본 말풍선이 그대로 뜹니다. 지금 단계에서는 novalidate를 빼고 브라우저 기본 검증이 동작하는 상태로 먼저 확인합니다.
3. 실행
VS Code Live Server로 contact.html을 엽니다.
4. 확인
- 스마트폰(또는 브라우저 개발자 도구의 기기 툴바)으로 열어 이메일·전화번호·URL 필드를 탭했을 때 각각 다른 키보드가 뜨는지 확인합니다.
- 이름 필드에 이전에 입력한 값이 있으면 자동완성 목록에 뜨는지 확인합니다.
novalidate를 잠깐 지우고 이메일 필드에abc처럼@가 없는 값을 넣은 뒤 제출을 눌러 브라우저 기본 오류 말풍선이 뜨는지 확인합니다. 확인 후novalidate는 다시 남겨 둡니다(다음 편에서 사용).
직접 해보기
- 문의 유형을
select대신 라디오 버튼 3개로 바꾸면autocomplete값을 어떻게 지정해야 할지 생각해 보세요.
답 보기
문의 유형처럼 사이트마다 의미가 다른 값에는 표준 토큰이 없으므로 autocomplete="off"를 유지합니다. 라디오 버튼으로 바꿔도 각 input[type=radio]에 name="topic"을 공유시키고 autocomplete는 그대로 off를 둡니다.
- 전화번호 필드에 하이픈 없이 숫자만 11자리로 입력하게 강제하려면
pattern을 어떻게 바꿀지 써 보세요.
답 보기
pattern="[0-9]{11}"로 바꾸면 숫자만 정확히 11자리일 때만 유효합니다. 사용자에게 placeholder="01012345678"로 형식을 미리 알려주면 혼란이 줄어듭니다.
자주 하는 실수
| 증상 | 원인 | 고치는 법 |
|---|---|---|
| 모바일에서 이메일 입력에 일반 키보드가 뜸 | type="email"만 믿고 inputmode를 안 씀(구형 브라우저) | inputmode="email"을 함께 지정 |
| 전화번호에 자유 형식이 그대로 통과됨 | tel은 브라우저가 형식을 검증하지 않음 | pattern으로 직접 형식 지정 |
| 이전에 입력한 값이 자동으로 안 채워짐 | autocomplete 토큰 오타 또는 off | 표준 토큰(name, email, tel 등) 정확히 입력 |
| 제출 시 브라우저 말풍선이 안 뜸(의도치 않게) | novalidate를 실습 확인 없이 그대로 둠 | 기본 검증 동작을 먼저 확인한 뒤 다음 편에서 커스텀 메시지로 교체 |