AD JB Toolbox 01

HTML 강좌 / 양식에 안내 문구 추가하기

HTML 양식의 빈 입력칸 안에 짧은 안내 문구를 표시하려면 placeholder 속성을 사용합니다. 항목의 이름은 label로 표시하고, 미리 채워 둘 실제 입력값은 value로 지정합니다. 안내 문구와 입력값을 구분하면 예시 문장이 사용자 데이터로 제출되는 실수를 피할 수 있습니다.

label, placeholder, value의 차이

label은 “이메일”, “문의 내용”처럼 입력 항목의 이름을 알려 주는 요소입니다. placeholder는 값이 비어 있을 때 입력칸 안에 보이는 짧은 힌트이며, input의 value 속성은 처음 표시할 입력값을 정합니다.

구분 용도 입력 후 표시 제출되는 값과의 관계
label 입력 항목의 이름 계속 표시 label 문구 자체는 입력값이 아닙니다.
placeholder 짧은 예시나 형식 안내 값이 있으면 사라짐 안내 문구 자체는 제출되지 않습니다.
value input의 초기 입력값 편집할 수 있는 값으로 표시 사용자가 바꾸지 않으면 그 값이 제출될 수 있습니다.

예를 들어 “이메일”은 항목 이름으로, “예: hong@example.com”은 입력 예시로 적합합니다. 빈 문의 양식에 예시 주소를 value로 넣으면 실제 주소로 오해할 수 있으므로 placeholder에 넣는 편이 알맞습니다. 기존 회원 정보를 수정하는 화면처럼 저장된 주소를 미리 보여 줄 때는 value가 필요합니다.

input에 placeholder 추가하기

입력칸의 여는 태그에 placeholder="안내 문구"를 추가합니다. 다음 예제는 이메일 입력칸이 비어 있을 때 예시 주소를 보여 줍니다.

<label for="email">이메일</label>
<input type="email" id="email" name="email"
       placeholder="예: hong@example.com">

label의 for 값과 입력칸의 id 값을 같게 지정하면 둘이 연결됩니다. name은 제출 데이터에서 항목을 식별하는 이름입니다. 세 속성의 역할은 다르므로 id만 지정하고 name을 빠뜨리지 않도록 합니다. 연결 방법은 label과 input으로 입력 필드 만들기에서 더 자세히 확인할 수 있습니다.

HTML 표준에서 input의 placeholder를 지원하는 유형은 text, search, tel, url, email, password입니다. 날짜나 숫자 입력칸에 같은 표시를 기대하지 말고, 입력칸 밖에 설명을 배치하세요. HTML 표준의 placeholder 정의와 input 유형별 속성 적용 표에서 범위를 확인할 수 있습니다.

textarea에 안내 문구 넣기

여러 줄을 입력하는 textarea에도 placeholder를 사용할 수 있습니다. 안내만 보여 주려면 여는 태그와 닫는 태그 사이에 기본 내용을 넣지 않습니다.

<label for="message">문의 내용</label>
<textarea id="message" name="message" rows="4"
          placeholder="예: 배송 예정일을 알고 싶습니다."></textarea>

textarea의 초기 값은 value 속성이 아니라 태그 사이의 텍스트로 지정합니다. 다음처럼 작성하면 “배송 예정일을 알려 주세요.”가 힌트가 아닌 실제 입력값으로 표시됩니다.

<textarea name="message">배송 예정일을 알려 주세요.</textarea>

코드를 보기 좋게 정리하려고 textarea 태그 사이에 들여쓰기나 공백을 넣어도 입력값의 일부가 될 수 있습니다. 빈 입력칸의 안내가 보이지 않는다면 태그 사이에 남은 텍스트부터 확인하세요. 초기 값과 placeholder의 정의는 HTML 표준의 textarea 설명에 나와 있습니다.

입력 중에도 필요한 설명은 밖에 표시하기

placeholder는 입력을 시작하면 사라지므로 항목 이름이나 중요한 조건을 대신할 수 없습니다. “이메일” 같은 이름은 보이는 label로 유지하고, 입력 중에도 확인해야 할 설명은 별도 문장으로 둡니다.

<label for="email">이메일 (필수)</label>
<input type="email" id="email" name="email"
       placeholder="예: hong@example.com"
       aria-describedby="email-help" required>
<p id="email-help">답변을 받을 이메일 주소를 입력하세요.</p>

aria-describedby는 입력칸과 추가 설명을 연결하는 접근성 속성입니다. 값으로 설명 요소의 id를 지정하면 화면 낭독기 같은 보조 기술이 그 설명을 이용할 수 있습니다. 연결만 해 두고 설명을 숨기기보다는, 이 예제처럼 화면에서도 읽을 수 있게 배치합니다. W3C의 입력 양식 설명 연결 예제도 같은 방식을 안내합니다.

전체 예제: 필수 이메일과 선택 문의 내용

아래 코드를 UTF-8로 저장한 form-guide.html 파일에 넣고 브라우저로 열면 동작을 확인할 수 있습니다. 이메일은 필수로, 문의 내용은 선택으로 지정했습니다. 안내 문구의 색은 흰 배경에서 읽기 쉽도록 정하고, 작은 화면에서는 입력칸이 양식 너비에 맞춰 줄어들게 했습니다.

<!doctype html>
<html lang="ko">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>양식 안내 문구 예제</title>
  <style>
    body {
      margin: 24px;
      color: #222;
      font-family: sans-serif;
      line-height: 1.6;
    }
    form { max-width: 440px; }
    label { display: block; font-weight: bold; }
    input, textarea {
      box-sizing: border-box;
      width: 100%;
      padding: 10px;
      border: 1px solid #777;
      border-radius: 4px;
      font: inherit;
    }
    input::placeholder, textarea::placeholder {
      color: #666;
      opacity: 1;
    }
    .help { margin-top: 4px; }
    button { padding: 8px 20px; font: inherit; }
  </style>
</head>
<body>
  <h1>문의하기</h1>
  <form method="get">
    <p>
      <label for="email">이메일 (필수)</label>
      <input type="email" id="email" name="email"
             placeholder="예: hong@example.com"
             aria-describedby="email-help" required>
    </p>
    <p id="email-help" class="help">답변을 받을 이메일 주소를 입력하세요.</p>
    <p>
      <label for="message">문의 내용 (선택)</label>
      <textarea id="message" name="message" rows="4"
                placeholder="예: 배송 예정일을 알고 싶습니다."></textarea>
    </p>
    <button type="submit">제출</button>
  </form>
</body>
</html>

필수 이메일과 선택 문의 내용 입력칸 안에 예시 문구가 표시되고, 이메일 설명은 입력칸 밖에 유지되는 양식

처음에는 두 입력칸에 안내 문구가 보입니다. 이메일을 입력하면 예시 주소는 사라지지만 “이메일 (필수)”와 입력칸 아래 설명은 남습니다. 값을 모두 지우면 안내 문구가 다시 보입니다.

  1. 이메일을 비워 둔 상태로 제출 버튼을 누릅니다. 일반적인 브라우저 제출에서는 required 검사로 제출이 막힙니다.
  2. 이메일 칸에 abc를 넣고 다시 제출합니다. type="email"의 형식 검사로 제출이 막힙니다.
  3. hong@example.com처럼 형식에 맞는 주소를 입력하고 문의 내용은 비워 둡니다. 선택 항목이 비어 있어도 제출할 수 있습니다.

required는 빈 값을 검사하고, type="email"은 이메일 형식을 검사합니다. 형식이 맞는다고 실제로 존재하는 주소까지 확인되는 것은 아닙니다. 오류 메시지의 문구와 모양은 브라우저 및 언어 설정에 따라 달라집니다.

이 예제는 서버에 문의를 저장하는 기능을 포함하지 않습니다. action을 생략한 GET 양식이므로 브라우저의 일반 제출은 현재 문서 주소를 대상으로 합니다. 서버에서 제공되는 파일로 실행하면 주소의 쿼리 문자열로 제출 값을 확인할 수 있지만, 로컬 파일로 열었을 때의 처리는 환경에 따라 다를 수 있습니다. 실제 서비스에서는 처리할 서버 주소와 제출 방식을 정해야 합니다.

placeholder와 value는 어떻게 제출되나요?

placeholder 문구는 입력값으로 제출되지 않지만, 해당 항목의 빈 값은 제출 데이터에 포함될 수 있습니다. 예를 들어 name="email"이 있는 활성화된 입력칸을 비워 두고 필수 검사를 하지 않는 양식을 GET으로 제출하면 email=처럼 이름과 빈 값이 전달될 수 있습니다. name이 없거나 disabled인 입력칸은 일반적인 제출 항목에서 제외됩니다. 이 차이는 HTML 표준의 제출 데이터 구성 규칙에 따른 것입니다.

<form id="compare-form">
  <input type="text" name="default_name" value="홍길동">
  <input type="text" name="hint_name" placeholder="예: 홍길동">
</form>

위 코드를 별도의 HTML 파일에서 연 뒤 브라우저 개발자 도구의 콘솔에 다음 코드를 실행해 보세요. FormData는 양식의 이름과 현재 값으로 데이터 목록을 만드는 기능입니다. 여기서는 서버로 전송하지 않고 목록만 확인합니다.

Array.from(new FormData(document.getElementById("compare-form")).entries())

아무 값도 바꾸지 않았다면 결과는 다음과 같습니다. value로 넣은 “홍길동”은 값에 포함되고, placeholder의 “예: 홍길동”은 포함되지 않습니다.

[["default_name", "홍길동"], ["hint_name", ""]]

두 번째 입력칸에 “김민수”를 입력하고 같은 코드를 다시 실행하면 hint_name의 값이 “김민수”로 바뀝니다. 첫 번째 입력칸도 사용자가 수정하면 현재 값이 목록에 포함됩니다.

required를 넣어도 value로 실제 값이 미리 채워져 있으면 단순한 빈 값 검사를 통과할 수 있습니다. 또한 FormData 생성 자체는 필수 입력 검사를 수행하지 않습니다. 사용자 제출 시 검사와 데이터 목록 생성을 구분하고, 실제 서비스에서는 서버에서도 입력값을 검증하세요.

안내 문구가 안 보이거나 잘 읽히지 않을 때

  • 입력칸에 값이 있는지 확인합니다. value, textarea 내부 텍스트, 브라우저 자동 완성이나 스크립트가 채운 값이 있으면 placeholder는 표시되지 않습니다.
  • 지원하는 input 유형인지 확인합니다. 날짜처럼 별도 UI가 있는 입력칸은 짧은 안내를 입력칸 밖에 두는 편이 확실합니다.
  • 문구가 너무 길지 않은지 확인합니다. 입력칸 안에는 짧은 예시를 넣고, 상세 조건은 보이는 설명으로 분리합니다. input의 placeholder에는 줄바꿈을 넣지 않습니다.
  • 문자색과 배경색을 확인합니다. 너무 연한 색이나 낮은 불투명도 때문에 안 보일 수 있습니다. 색을 바꾼 뒤 모바일 화면에서도 읽히는지 확인합니다.

placeholder의 글자색과 모양은 CSS의 ::placeholder 가상 요소로 지정합니다. CSS는 웹페이지의 모양을 정하는 스타일 언어이며, 전체 예제에서는 안내 문구의 색과 불투명도를 조정하는 데 사용했습니다. 구체적인 꾸미기 방법은 placeholder의 색과 글자 모양을 꾸미는 방법을 참고하세요. 항목 이름은 label, 짧은 예시는 placeholder, 계속 확인해야 하는 조건은 별도 설명으로 나누면 입력 중에도 필요한 정보를 읽을 수 있습니다.

같은 카테고리의 다른 글
HTML 강좌 / input 유형 선택하기: 이메일·숫자·날짜·체크박스·라디오

HTML 강좌 / input 유형 선택하기: 이메일·숫자·날짜·체크박스·라디오

입력 목적에 맞는 input type을 고르고 체크박스와 라디오 버튼의 선택·제출 동작을 구분하는 방법을 설명합니다.

HTML 강좌 / HTML 접근성 기본: 제목·링크·이미지·키보드

HTML 강좌 / HTML 접근성 기본: 제목·링크·이미지·키보드

제목 구조, 의미 있는 링크 문구, 이미지 대체 텍스트와 키보드 조작을 점검하는 HTML 접근성의 기본을 정리합니다.

HTML 강좌 / HTML 오류 찾기와 문서 검사하기

HTML 강좌 / HTML 오류 찾기와 문서 검사하기

HTML 검사 도구로 문법 오류를 찾고 수정한 뒤 링크, 키보드 조작, 모바일 표시까지 확인하는 절차를 안내합니다.

HTML 강좌 / 문법

HTML 강좌 / 문법

HTML 요소·태그·속성·주석의 기본 문법을 예제로 설명합니다. 빈 요소, 속성값 따옴표, 태그 중첩에서 주의할 점과 문법 확인 방법도 다룹니다.

HTML 강좌 / 제목과 문단

HTML 강좌 / 제목과 문단

HTML h1~h6 제목 태그와 p 문단 태그의 역할 및 올바른 구조를 예제로 설명합니다. 제목 단계 구성, br 줄바꿈과 자주 발생하는 작성 오류도 함께 확인할 수 있습니다.

HTML 강좌 / form의 구조와 GET·POST 제출 방식

HTML 강좌 / form의 구조와 GET·POST 제출 방식

form, action, method, name의 역할을 이해하고 GET과 POST 방식으로 양식 값이 전달되는 차이를 설명합니다.

HTML / Tutorial / 연속된 공백 넣는 방법

HTML / Tutorial / 연속된 공백 넣는 방법

HTML에서 연속된 공백은 하나의 공백으로 처리합니다. 소스 코드에서 여러 칸을 띄어써도 브라우저에서는 한 칸을 띄어쓴 것으로 표현됩니다. 연속된 공백을 넣고 싶다면 특수 문자  를 사용합니다.

HTML 강좌 / audio, video, iframe으로 미디어와 외부 콘텐츠 삽입하기

HTML 강좌 / audio, video, iframe으로 미디어와 외부 콘텐츠 삽입하기

오디오·비디오 파일과 외부 콘텐츠를 HTML에 삽입할 때 필요한 기본 코드, 자막, 파일 경로, 접근성 확인 사항을 설명합니다.

HTML 강좌 / 이미지 넣기: img, alt, 크기

HTML 강좌 / 이미지 넣기: img, alt, 크기

HTML img 요소로 이미지를 넣고 alt 대체 텍스트와 width·height를 설정하는 방법을 설명합니다. 실제 예제 이미지로 경로와 크기 문제도 확인할 수 있습니다.

HTML 강좌 / div와 span은 언제 사용할까?

HTML 강좌 / div와 span은 언제 사용할까?

div와 span의 차이와 사용 기준을 설명하고, 의미 요소가 없는 경우에만 묶음 요소를 쓰는 예제를 보여 줍니다.