새로운 질서 위키

신청 폼은 질문의 순서다

신청 폼은 운영자가 필요한 정보를 묻고 방문자가 답하는 문서다. 질문의 순서와 이름도 편집의 대상이며, 입력란을 만들었다는 사실만으로 신청이 접수되는 것은 아니다.

  • 이름 붙이기: 입력란의 id와 label의 for를 맞춘다. 입력을 시작하면 사라지는 예시 문구만으로 질문을 대신하지 않는다.
  • 묶기: 관련 질문은 fieldset으로 묶고 legend로 이름을 준다. 필수와 선택 여부는 글로도 밝힌다.
  • 확인하기: required와 type="email"로 웹 브라우저의 기본 검사를 사용할 수 있다. 이메일 형식 검사는 실제 주소의 존재나 소유자를 확인하는 절차가 아니다.
  • 접수하기: 아래 예제는 입력만 검사하며 전송·저장하지 않는다. 실제 접수에는 처리할 서버, 서버 쪽 검사, 완료·실패 안내가 별도로 필요하다.

한 파일로 확인하기

아래 전체 코드를 UTF-8 형식의 example-05.html 파일로 저장해 웹 브라우저에서 연다. 예제의 전시와 행사는 가상이다.

<!doctype html>
<html lang="ko">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>신청 폼은 질문의 순서다: 제작 예제</title>
<style>
* { box-sizing: border-box; }
body { margin: 0; padding: 1rem; color: #202020;
  background: #fff; font-family: sans-serif; line-height: 1.7; }
main { max-inline-size: 44rem; margin-inline: auto; }
h1 { font-size: 1.75rem; line-height: 1.3; }
a { color: #164d91; }
:focus-visible { outline: 3px solid #164d91; outline-offset: 4px; }
form { display: grid; gap: 1rem; }
fieldset { min-inline-size: 0; padding: 1rem; }
label { display: block; margin-block-start: .75rem; }
input, select, button { font: inherit; max-inline-size: 100%; }
input, select { inline-size: 100%; padding: .35rem; }
button { justify-self: start; padding: .5rem 1rem; white-space: normal; }
</style>
<main>
  <h1>작은 책 만들기</h1>
  <p>가상의 워크숍 입력 연습입니다. 실제 개인정보 대신 가상 값을 쓰세요.</p>
  <form id="signup">
    <fieldset>
      <legend>참가 정보</legend>
      <label for="visitor-name">이름 (필수)</label>
      <input id="visitor-name" name="name" autocomplete="name" required>
      <label for="visitor-email">이메일 (필수)</label>
      <input id="visitor-email" name="email" type="email" autocomplete="email" required>
      <label for="session">관심 있는 시간 (선택)</label>
      <select id="session" name="session">
        <option value="">아직 정하지 않음</option>
        <option value="morning">오전</option>
        <option value="afternoon">오후</option>
      </select>
    </fieldset>
    <button type="button" id="check">입력 확인 (전송 안 함)</button>
    <p id="result" role="status"></p>
    <noscript>이 예제의 입력 확인에는 JavaScript가 필요합니다. 접수 기능은 없습니다.</noscript>
  </form>
</main>
<script>
const form = document.querySelector("#signup");
const result = document.querySelector("#result");
form.addEventListener("submit", event => event.preventDefault());
form.addEventListener("input", () => { result.textContent = ""; });
document.querySelector("#check").addEventListener("click", () => {
  result.textContent = "";
  if (form.reportValidity()) {
    result.textContent = "입력을 확인했습니다. 전송하거나 저장하지 않았습니다.";
  }
});
</script>
</html>

이름을 비우거나 이메일에 abc를 넣고 입력 확인을 눌러본다. 형식이 맞으면 전송하지 않았다는 안내가 나타난다. 실제 신청서의 묻지 않아도 되는 질문을 줄이는 판단은 작동하는 폼을 만든 뒤에도 남는다.

참고

#HTML #편집 #접근성

검색