※ 본 포스팅은 책 <실전 프로젝트 반응형 웹 퍼블리싱>을 참고하여 작성함
<form>
_b웹 사이트에서 특정 콘텐츠에 대한 정보를 제공받기 위해서는 회원가입을 해야 하는 경우가 많다.
회원가입 양식을 보면 약관 동의에서부터 이름, 아이디, 패스워드, 주소 등을 입력해야 하며 성별 체크 등 다양한 항목을 선택하기도 해야 한다.
회원가입뿐만 아니라 온라인 쇼핑몰에서 상품을 구입하거나 게시판에 글을 쓸 때에도 이러한 정보입력 양식을 많이 접하게 되는데 웹에서의 이러한 정보입력 양식을 '온라인 서식'이라고 한다.
<form>
_b<form>
요소는 스크린에 보이지는 않지만 input 태그들을 담는 일종의 컨테이너 역할을 수행하며 온라인 서식에서 작성한 값들을 서버 프로그램(서식값 처리)으로 전송하는 역할을 담당함.
<form action="서버 프로그램 URL" method="get이나 post방식">
서식 내용
</form>
<fieldset>
_b<fieldset>
요소는 <form>
요소 안에 있는 여러 요소를 그룹화할 때 사용하며, 그룹 제목 <legend>
요소를 포함한다.
<form action="join.php" method="post">
<fieldset>
<legend>그룹 제목</legend>
서식내용
</fieldset>
</form>
<input>
_i<input>
은 inline요소이며 type속성 변경으로 다양한 폼 컨트롤을 생성할 수 있다.
<form action="join.php" method"post">
<fieldset>
<legend>회원가입</legend>
<p>아이디 : <input type="text" size="12" maxlength="8" /></p>
<p>비밀번호 : <input type="password" size="12" maxlength="8" /></p>
<p>메일 수신여부 :
<input type="radio" value="y" name="receive" />예
<input type="radio" value="n" name="receive" />아니오
</p>
<p>관심분야 :
<input type="checkbox" value="HTML" name="chk1" />HTML
<input type="checkbox" value="CSS" name="chk2" />CSS
<input type="checkbox" value="Javascript" name="chk3" />Javascript
</p>
<p>
<input type="submit" value="전송" />
<input type="reset" value="취소" />
<input type="button" value="확인" />
<input type="image" src="images/search.gif" alt="검색" />
</p>
<p>파일 올리기 : <input type="file" /></p>
<p><input type="hidden" /></p>
</fieldset>
</form>
이를 출력하면 다음과 같다.
회원가입아이디 :
비밀번호 :
메일 수신여부 : 예 아니오
관심분야 : HTML CSS Javascript
파일 올리기 :
<fieldset>
요소는 사각형 border로 나오게 되며 <legend>
요소는 사각형 border 상단에 제목으로 출력된다.<input>
의 type의 종류를 정리하면 다음과 같다.type | 설명 |
---|---|
text |
|
password |
|
radio |
|
checkbox |
|
submit |
|
reset |
|
button |
|
image |
|
file |
|
hidden |
|
아직 모든 브라우저에서 새로 추가된 input type들을 지원하고 있지는 않다.
http://miketaylr.com/code/input-type-attr.html 사이트에서 현재 브라우저들에서 HTML5 input type과 속성을 어느 정도 지원해 주는 지 알 수 있다.
search :
검색 박스로 텍스트 입력시 지우기(X) 버튼이 나타남.
email :
email입력 양식에 맞지 않을 경우 오류 메시지를 제공하며 아이폰에선느 입력하기 편리한 키패드로 변함.
url :
url입력 양식에 맞지 않을 경우 오류 메시지를 제공하며 아이폰에서는 입력하기 편리한 키패드로 변함.
tel :
전화번호 입력 박스
number :
숫자 입력 박스에 직접 입력하거나 상하 화살표를 눌러 선택할 수 있다.
min과 max 속성은 선택할 수 있는 숫자의 최소값과 최대값을 나타내며 step속성은 숫자의 단계를 의미한다.
value 속성은 숫자의 기본 값이다. 예를 들어 value="1"을 놓고 step="2"로 하면 위 화살표를 한 번 누를 때마다 2씩 증가되어 1,3,5,7...과 같이 나오게 된다.
rage :
숫자 범위가 '슬라이드 바'로 나타난다.
date :
연, 월, 일을 선택할 수 있는 박스가 나온다.
datetime :
연, 월, 일과 시, 분을 선택할 수 있는 박스가 나온다.(UTC, 국제표준시간)
datetime-local :
연, 월, 일, 시, 분을 선택할 수 있는 박스가 나온다.
month :
연과 월만 선택할 수 있는 박스가 나온다.
week :
연과 주를 선택할 수 있는 박스가 나온다.
time :
시, 분을 선택할 수 있는 박스가 나온다.
color :
색상 선택 박스로 나타난다.
<input>
요소에 값을 입력하지 않거나 유효하지 않은 상태로 [전송] 버튼을 누르면 오류 메시지가 나타납니다.<p><strong>*</strong> 표시는 필수입력 항목입니다.</p>
<form>
<fieldset>
<legend>필드 유효성 검사</legend>
<ul>
<li>
<label><strong>*<strong>이름</label>
<input type="text" id="name" required="required" />
</li>
<li>
<label><strong>*<strong>아이디</label>
<input type="text" id="id" required="required" />
</li>
<li>
<label><strong>*<strong>비밀번호</label>
<input type="password" id="pw" required="required" />
</li>
<li>
<label><strong>*<strong>전화번호</label>
<input type="tel" id="phone" required="required" />
</li>
<li>
<label><strong>*<strong>이메일</label>
<input type="email" id="email" />
</li>
</ul>
<p><input type="submit" value="전송"></p>
</fieldset>
</form>
*표시는 필수입력 항목입니다.
필드 유효성 검사<form>
<fieldset>
<legend>필드에 입력형식 힌트주기</legend>
<ul>
<li>
<label for="phone">핸드폰 번호</label>
<input type="tel" id="phone" placeholder="01011112222" />
</li>
<li>
<label for="phone">이메일</label>
<input type="email" id="email" placeholder="id@domain.com" />
</li>
</ul>
</fieldset>
</form>
이를 출력하면 다음과 같다.
필드에 입력형식 힌트주기<form>
<fieldset>
<legend>자동완성 기능</legend>
<ul>
<li>
<label for="phone">전화번호</label>
<input type="tel" id="phone" autocomplete="off" />
</li>
<li>
<label for="email">이메일</label>
<input type="email" id="email" autocomplete="on" />
</li>
</ul>
</fieldset>
</form>
이를 출력하면 다음과 같다.
자동완성 기능<datalist>
요소로 만들어 준다.<form>
<fieldset>
<legend>datalist</legend>
<p>
<label for="course">수강과목 : </label><input type="text" id="course" list="subjects" />
<datalist id="subjects">
<option value="html5">
<option value="css3">
<option value="javascript">
<option value="jquery">
</datalist>
</p>
</fieldset>
</form>
이를 출력하면 다음과 같다.
datalist수강과목 :
<input>
요소에만 적용할 수 있다.<form>
<fieldset>
<legend>포커스 자동이동</legend>
<ul>
<li>
<label for="name">이름</label>
<input type="text" id="name" autofocus="autofocus" />
</li>
<li>
<label for="id">아이디</label>
<input type="text" id="id" />
</li>
<li>
<label for="pw">비밀번호</label>
<input type="password" id="pw" />
</li>
<li>
<label for="phone">전화번호</label>
<input type="tel" id="phone" />
</li>
<li>
<label for="email">이메일</label>
<input type="email" id="email" />
</li>
</ul>
<p><input type="submit" value="전송" /></p>
</fieldset>
<form>
이를 출력하면 다음과 같다.
포커스 자동이동disabled 속성과 readonly 속성
disabled 속성과 readonly 속성은 적용된 input 요소의 내용을 수정하거나 선택할 수 없도록 비활성화 상태로 만든다.
예를 들어 프로그램을 설치 시 시링얼 번호를 입력하지 않으면 '다음'으로 넘어가는 버튼이 비활성화되어 있는 것을 볼 수 있다. 이렇게 disabled 속성은 어떤 조건에 만족하지 않았을 때 input 요소를 비활성화시키는데 주로 사용되며 readonly 속input 요소의 값이 변경되지 않은 채 폼 전송이 되어야 하는 곳에 사용된다.
<form>
<fieldset>
<legend>disabled속성과 readonly속성</legend>
<ul>
<li>
<label for="serialNum">시리얼 번호 입력 : </label>
<input type="text" id="serialNum" />
<input type="button" value="이전" />
<input type="button" value="다음" disabled="disabled" />
</li>
<li>
<label for="book">선택한 책 : </label>
<input type="text" id="book" value="안드로이드로 용돈 벌기" readonly="readonly" />
<label for="number">수량 : </label><ipnut type="number" id="number" value="1" />
</li>
</ul>
</fieldset>
</form>
이를 출력하면 다음과 같다.
코드를 넣으면 게시물 전체가 보이지 않는 알 수 없는 오류로 인해 해당 코드는 예시를 보이지 않겠다.
pattern 속성
pattern 속성은 required 속성처럼 필드의 값을 체크해 주는 폼 유효성 검사 속성이라고 보면 된다. 다만, required 속성은 일반적인 input type 형식에 대한 유효성을 체크하지만 pattern 속성은 '정규 표현식' 방법으로 입력값과 정규식이 일치해야만 유효성에 통과할 수 있다.
<form>
<fieldset>
<legend>pattern 속성</legend>
<p><label for="tel">휴대폰 번호 : </label><input type="tel" id="tel" pattern="\d{3}-\d{3,4}-\d{4}" title="휴대폰 번호는 3자리 숫자 - 3자리에서 4자리 숫자 - 4자리 숫자로 입력하셔야 합니다." /></p>
<p><input type="submit" value="전송" /></p>
</fieldset>
</form>
이를 출력하면 다음과 같다.
pattern 속성휴대폰 번호 :
pattern="₩d{3}-₩d{3,4}-₩d{4}"의 의미를 살펴보면 '₩d'는 숫자, '{3}'은 3자리를 의미합니다. 조금 더 쉽게 풀이하자면, "입력되는 값은 '숫자 3자리-숫자 3~4자리-숫자 4자리' 와 일치해야 합니다."라는 뜻이 된다. pattern 속성을 사용할 때는 해당 input 요소에 정해놓은 정규 표현식과 일치하게 입력할 수 있도록 title 속성을 이용하여 입력 형식에 대한 툴티을 제공해 주어야 한다.
<label for="email">이메일 : </label><input type="email" id="email" multiple="multiple" />
<label for="file">파일 찾기:</label><input type="file" id="file" multiiple="multiple" />
<textarea>
_i & <select>
_i<textarea>
: 게시판의 내용 입력이나 약관 등 여러 줄로 된 텍스트 상자를 생성하는 요소
<select>
: 선택 목록 상자를 생성하는 요소
<form action="board.php" method="post">
<fieldset>
<legend>여러 줄 글상자와 목록상자</legend>
<p>답글<br /> <textarea cols="30" rows="3" name="reply"></textarea></p>
<p>과목 선택
<select>
<option value="html5">html5</option>
<option value="css3">css3</option>
<option value="javascript">javascript</option>
<option value="Query">jQuery</option>
</select>
</p>
<p>스터디 지역
<select>
<optgroup label="관악구">
<option value="gwanak-bcd">봉천동</option>
<option value="gwanak-sld">신림동</option>
<option value="gwanak-nhd">남현동</option>
</optgroup>
<optgroup label="동대문구">
<option value="ddm-jnd">전논동</option>
<option value="ddm-dsn">답십리</option>
<option value="ddm-ssd">신설동</option>
</optgroup>
</select>
</p>
</fieldset>
</form>
이를 출력하면 다음과 같다.
여러 줄 글상자와 목록상자답글
과목 선택 html5 css3 javascript jQuery
스터디 지역 봉천동 신림동 남현동 전논동 답십리 신설동
<textarea>
요소의 cols와 rows 속성은 텍스트 상자의 열과 행의 수를 지정한다.<select>
요소는 <option>
요소와 함께 쓰며 특히 목록이 많은 경우에는 관련 있는 것끼리 묶어주는 <optgroup>
요소를 사용한다. <option>
요소의 value는 실제 전송값을 의미하며 <optgroup>
요소의 label 속성은 그룹 지어진 <option>
요소들의 제목이다.<label>
_i테이블과 마찬가지로 폼 요소들도 환경적인 요인에 따라 접근하기 어려운 경우들이 있다.
예를 들어 마우스에 익숙하지 않은 사용자의 경우 라디오 버튼이나, 체크박스에 정확히 클릭하기란 쉽지 않을 것이다. 또한, 웹 문서가 음성만 출력되는 환경에서는 각 폼 요소들 앞에 정확한 레이블을 주지 않으면 어떤 내용을 입력하고 체크해야 하는지 알 수가 없는 상황이 발생할 수 있다.
<label>
요소를 이용하여 접근성 높은 온라인 서식을 만드는 방법에 대해 알아보자.
<form action="join.php" method="post">
<fieldset>
<legend>회원가입</legend>
<table>
<colgroup>
<col width="30%" />
<col width="70%" />
</colgroup>
<tbody>
<tr>
<th scope="row"><label for="name">이름</label></th>
<td><input type="text" id="name" /></td>
</tr>
<tr>
<th scope="row"><label for="id">아이디</label></th>
<td><input type="text" id="id" /></td>
</tr>
<tr>
<th scope="row"><label for="pw">비밀번호</label></th>
<td><input type="text" id="pw" /></td>
</tr>
<tr>
<th scope="row"><label for="r_pw">비밀번호 확인</label></th>
<td><input type="text" id="r_pw" /></td>
</tr>
<tr>
<th scope="row"><label for="jumin_num">주민번호</label></th>
<td>
<input type="text" id="jumin_num" title="주민번호 앞 6자리" />
-
<input type="text" id="jumin_num" title="주민번호 뒤 7자리" />
</td>
</tr>
<tr>
<th scope="row"><label for="e-mail">이름</label></th>
<td>
<input type="text" id="email" tilte="이메일 아이디" />
@
<input type="tsxt" title="이메일 주소" />
</td>
</tr>
<tr>
<th scope="row"><label for="hp">핸드폰</label><th>
<td><input type="text" id="hp" /></td>
</tr>
</tbody>
</table>
<p><input type="submit" value="전송" /><input type="reset" value="취소" /></p>
</fieldset>
</form>
이를 출력하면 다음과 같다.
회원가입이름 | |
---|---|
아이디 | |
비밀번호 | |
비밀번호 확인 | |
주민번호 | - |
이름 | @ |
핸드폰 |
<label>
요소의 for 속성값과 <input>
요소의 id 속성값을 같은 이름으로 연결시켜 주면 레이블 텍스트(이름, 아이디, 비밀번호 등...)에 마우스를 클릭하거나 포커스가 이동되면 우측에 연결되어 있는 input 텍스트 상자로 커서가 자동 이동된다.<label>
에 두 개의 <input>
요소가 있다. 이러한 경우 <label>
를 첫 번째 <input>
요소에 title 속성을 이용하여 추가적딩 설명을 넣어주면 음성만 출력되는 환경에서도 폼 요소들에 대한 접근성을 높일 수 있다.