2025. 12. 2. 21:57ㆍ대우개발원 수업 내용/웹표준기술(HTML)
<fieldset>
<legend>개인 정보 입력</legend>
<label for="city">지역</label>
<select name="city" id="city" size="5" multiple>
<!-- 디폴트 속성은 한개만 선택 -->
<option value="강북구">강북구</option>
<option value="깅남구">강남구</option>
<option value="서초구">서초구</option>
<option value="중원구">중원구</option>
<option value="분당구">분당구</option>
</select>
<input type="submit" value="등록">
</fieldset>
날짜 지정하기
시간 지정하기
범위 제한하기
<h1>날짜 지정하기</h1>
<input type="date">
<input type="month">
<input type="week">
<hr>
<h1>시간 지정하기</h1>
<input type="time">
<input type="datetime-local">
<hr>
<h1>범위 제한하기</h1>
<input type="date" min="2025-12-01" max="2025-12-15">
<input type="time" min="19:00" max="21:00">
<hr>
날짜/시간 입력 + 범위 제한(min/max)까지 포함해서 전체를 새로 정리
📌 HTML 날짜·시간 입력 + 범위 제한 태그 정리
HTML5에서는 날짜와 시간을 직관적으로 선택할 수 있도록 다양한 input 타입을 제공한다.
또한 min, max 속성을 사용하면 선택 가능한 범위를 제한할 수 있다.
✅ 1. 날짜 지정하기 (Date Inputs)
① <input type="date"> — 날짜 선택
년/월/일을 선택할 수 있는 기본 날짜 입력 필드.
<input type="date">
② <input type="month"> — 월 단위 선택
년/월(YYYY-MM)만 선택 가능.
<input type="month">
③ <input type="week"> — 주(week) 선택
"2025-W10"처럼 연도 + 몇 번째 주인지 선택할 때 사용.
<input type="week">
✅ 2. 시간 지정하기 (Time Inputs)
① <input type="time"> — 시간 선택
시:분 형식의 시간 선택 UI 제공.
<input type="time">
② <input type="datetime-local"> — 날짜 + 시간 선택
날짜와 시간을 한 번에 입력하는 통합 필드.
<input type="datetime-local">
✅ 3. 범위 제한하기 (min / max)
min과 max 속성을 사용하면 입력 가능한 날짜·시간 범위를 제한할 수 있다.
📌 날짜 범위 제한 예시
<input type="date" min="2025-12-01" max="2025-12-15">
✔ 2025년 12월 1일부터
✔ 2025년 12월 15일까지
이 범위 안에서만 날짜 선택 가능
📌 시간 범위 제한 예시
<input type="time" min="19:00" max="21:00">
✔ 19:00(오후 7시)부터
✔ 21:00(오후 9시) 사이 시간만 입력 가능
✨ 총정리 표
구분 태그 설명
| 날짜 선택 | type="date" | 날짜 선택 UI |
| 월 선택 | type="month" | 년·월 선택 |
| 주 선택 | type="week" | 연도 + 주차 선택 |
| 시간 선택 | type="time" | 시·분 입력 |
| 날짜+시간 | type="datetime-local" | 날짜와 시간 통합 입력 |
| 날짜 범위 제한 | min, max | 선택 가능한 날짜 제한 |
| 시간 범위 제한 | min, max | 선택 가능한 시간 제한 |
<form>
<input type="submit" value="가입하기">
<input type="reset" value="취소">
</form>
아래는 **이번에 새로 배운 버튼 타입(input 태그)**만 정리
설명은 딱 필요한 만큼만, 깔끔하게 작성했어!
📌 HTML 폼 버튼 태그 (새로 배운 것만)
HTML의 <input> 태그는 다양한 타입을 통해 폼 전송, 초기화 등의 기능을 버튼 형태로 제공한다. 이번에는 그중에서도 form에서 자주 쓰는 두 가지 버튼 타입을 정리한다.
1️⃣ <input type="submit"> — 폼 전송 버튼
- 클릭하면 form 안의 입력값을 서버로 전송한다.
- 기본 버튼 문구는 “제출”, 하지만 value 속성으로 변경 가능.
<input type="submit" value="가입하기">
✔ 사용 예: 회원가입, 로그인, 검색 등
✔ 폼 action 속성에 설정된 경로로 데이터가 전송됨
2️⃣ <input type="reset"> — 입력 내용 초기화 버튼
- form 내부의 모든 입력값을 처음 상태로 되돌린다.
- value 속성으로 표시되는 문구를 바꿀 수 있다.
<input type="reset" value="취소">
✔ 사용 예: 입력 취소, 작성한 내용 전체 삭제 등
✨ 총정리
버튼 종류 태그 설명
| 제출 버튼 | type="submit" | 폼 데이터를 서버로 전송 |
| 초기화 버튼 | type="reset" | 입력한 내용을 모두 초기화 |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>폼 연습</title>
</head>
<body>
<form action="" method="">
<input type="hidden" value="사이트를 통한 직접 로그인">
<label>아이디: <input type="text" id="user_id" size="5"></label>
<label>비밀번호: <input type="password" id="user_pw" size="10"></label>
<input type="image" src="../images/login.png" alt="로그인">
</form>
</body>
</html>
아래는 이번 코드에서 새롭게 등장한 태그·속성만 정리
(이미 배운 text, password 같은 것들은 제외하고, hidden / image 타입만 설명!)
📌 HTML 폼 태그 — 새로 배운 입력 타입 정리
1️⃣ <input type="hidden"> — 화면에 보이지 않는 숨겨진 데이터
hidden 타입은 사용자에게 보이지 않지만 폼 전송 시 함께 전달되는 값을 넣을 때 사용한다.
<input type="hidden" value="사이트를 통한 직접 로그인">
✔ 사용 목적
- 자동으로 서버에 전달해야 하는 값
- 사용자의 입력을 받지 않는 내부 데이터
- 로그인 방식, 상품 번호, 토큰 등 숨겨야 하는 정보 전달
✔ 특징
- 화면에 표시되지 않는다
- 사용자가 수정할 수 없다
- 폼을 제출하면 value 값이 함께 전송된다
2️⃣ <input type="image"> — 이미지를 버튼처럼 사용하는 타입
image 타입은 submit 버튼 대신 이미지로 폼을 전송할 수 있게 하는 입력 방식이다.
<input type="image" src="../images/login.png" alt="로그인">
✔ 특징
- 이미지 클릭 시 submit 버튼처럼 폼이 제출된다
- src에 이미지 경로를 지정
- alt는 이미지가 없을 때 대체 텍스트로 표시됨
- 로그인/검색/삭제 등의 버튼을 이미지로 꾸밀 때 사용
✔ 추가 설명
- 클릭한 위치의 x, y 좌표도 함께 서버로 전송된다
(일반적으로는 사용하지 않지만 혹시 활용할 수 있음)
✨ 총정리
타입 설명 특징
| type="hidden" | 숨겨진 데이터 전송 | 화면 표시 X, 수정 불가 |
| type="image" | 이미지를 submit 버튼으로 사용 | 이미지 클릭 시 폼 전송 |
<fieldset>
<legend>블로그 글쓰기</legend>
<p>
<label for="title"> 제목
<input type="text" id="title" name="title">
</label>
</p>
<p>
<label for="desc">내용
<textarea id="desc" name="desc" rows="5" cols="30"></textarea>
</label>
</p>
</fieldset>
(text는 이미 배운 내용이므로 제외하고 fieldset / legend / textarea만 설명함)
📌 HTML 폼 그룹 & 여러 줄 입력 태그 정리
✅ 1. <fieldset> — 관련 입력을 하나의 그룹으로 묶기
fieldset은 서로 연관된 입력 요소들을 하나의 박스 형태로 묶어주는 태그이다.
폼을 구역별로 나누고 싶을 때 주로 사용한다.
<fieldset>
...입력 영역...
</fieldset>
✔ 특징
- 그룹 단위로 시각적으로 구분됨
- 입력 폼의 구조를 명확하게 만들 수 있음
- 웹 접근성과 가독성이 향상됨
✅ 2. <legend> — fieldset의 제목
legend는 fieldset의 제목 역할을 하며,
현재 그룹이 어떤 내용을 입력하기 위한 것인지 설명한다.
<legend>블로그 글쓰기</legend>
✔ 특징
- 반드시 fieldset 바로 안쪽에 작성
- 그룹의 목적을 한눈에 파악 가능
- 스타일 적용 시 제목처럼 꾸며 사용 가능
✅ 3. <textarea> — 여러 줄 텍스트 입력 영역
textarea는 긴 글, 설명, 블로그 글 같은 여러 줄 텍스트를 입력하는 태그이다.
<textarea id="desc" name="desc" rows="5" cols="30"></textarea>
✔ 특징
- 여러 줄 입력 가능하며 줄바꿈 가능
- rows: 높이(보여줄 줄 수)
- cols: 너비(보여줄 글자 수)
- 블로그 글쓰기·댓글·게시판 글 작성에 필수 요소
- CSS로 자유롭게 크기 조절 가능
✨ 총정리
태그 기능
| <fieldset> | 입력 요소들을 하나의 그룹으로 묶는 박스 |
| <legend> | fieldset의 제목 역할 |
| <textarea> | 여러 줄 텍스트를 입력하는 영역 |
<li>
<label for="user_pw">비밀번호</label>
<input type="password" id="user_pw" size="10">
</li>
<li>
<label>비밀번호 확인<input type="password" id="user_pw_check" size="10"></label>
</li>
아래는 주어진 두 가지 label 작성 방식이 모두 가능한 이유와,
각 방식의 차이·장단점을 블로그에 정리하기 좋은 형태로 자세하게 정리해준 내용
📌 HTML <label> 태그 두 가지 사용 방식 비교
HTML에서 <label>은 입력 요소(<input> 등)와 연결해
사용자가 클릭하기 편하도록 돕는 중요한 태그다.
아래 두 가지 방식은 모두 올바른 label 사용법이지만 구조와 용도가 조금 다르다.
✅ ① 방식 1 — label과 input을 따로 작성 (for + id 사용)
<label for="user_pw">비밀번호</label>
<input type="password" id="user_pw" size="10">
✔ 동작 방식
- label의 for 속성이 입력 요소의 id와 연결됨
- 라벨을 클릭하면 해당 input이 자동으로 포커스됨
✔ 장점
- 가장 표준적이며 많이 사용하는 방식
- 라벨과 input을 독립적으로 배치 가능 → CSS 구성에 유리
- 화면 낭독기(Screen Reader)에 최적화 → 웹 접근성 우수
- 라벨과 입력창을 자유롭게 떨어뜨리거나 배치 가능
✔ 단점
- for/id를 반드시 쌍으로 정확하게 작성해야 함
- 구조가 약간 길어질 수 있음
✅ ② 방식 2 — input을 label 내부에 포함시키기
<label>비밀번호 확인
<input type="password" id="user_pw_check" size="10">
</label>
✔ 동작 방식
- <label> 태그 안에 <input>이 들어가면
자동으로 해당 input이 label과 연결됨
(for, id 없이도 클릭 시 포커스 됨)
✔ 장점
- for/id를 안 써도 됨 → 작성하기 간단함
- 라벨과 input이 하나의 요소처럼 묶이므로
“텍스트 + 입력창”이 한 덩어리처럼 구성됨 - HTML 코드가 더 짧아짐
✔ 단점
- 라벨과 input의 배치를 자유롭게 떨어뜨리기 어려움
- 디자인(UI)을 세밀하게 구성하기에는 불리할 수 있음
- label 안에 요소가 너무 많아지면 시멘틱 구조가 복잡해짐
🔎 두 방식의 공통점
- 둘 다 클릭 시 input에 포커스가 이동함
- 둘 다 올바른 HTML 구조임
- 접근성(스크린 리더 지원)은 두 방식 모두 문제 없음
- 실제 프로젝트에서도 둘 다 많이 사용됨
📝 언제 어떤 방식을 쓰면 좋을까?
상황 추천 방식
| 깔끔한 레이아웃, label과 input 위치를 자유롭게 조절 | ① for + id 방식 |
| label과 input을 한 덩어리처럼 묶어 간단하게 구성 | ② label 내부 포함 방식 |
| 큰 폼, 여러 줄 구성, CSS 작업이 많은 경우 | ① 방식 |
| 작은 입력 박스, 일렬 구성처럼 심플한 UI | ② 방식 |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>웹 폼</title>
</head>
<form>
<h1>회원 가입</h1>
<fieldset>
<legend>로그인 정보</legend>
<ul>
<li>
<label>아이디 <input type="text" id="user_id" size="10"></label>
</li>
<li>
<label for="user_pw">비밀번호</label>
<input type="password" id="user_pw" size="10">
</li>
<li>
<label>비밀번호 확인<input type="password" id="user_pw_check" size="10"></label>
</li>
</ul>
</fieldset>
<fieldset>
<legend>개인 정보</legend>
<ul>
<li>
<label>이름 <input type="name" id="user_name"></label>
</li>
<li>
<label for="mail">메일 주소<input type="email" id="mail"></label>
</li>
<li>
<label>전화번호<input type="tel" id="phone"></label>
</li>
<li>
<label>블로그/홈페이지<input type="url" id="urll"></label>
</li>
</ul>
</fieldset>
<input type="submit" value="가입하기">
</form>
</body>
</html>
아래는 너가 작성한 전체 코드에서 “새로 배운 입력 타입들만” 정리한 설명이야.
(text, password 같은 기본 input은 제외하고 email, tel, url 중심으로 정리함)
또한 전체 구조 중 **폼 구조(fieldset, legend)**도 함께 설명해줄게!
📌 HTML 회원가입 폼 — 새로 배운 태그 정리
아래 예제는 회원가입 페이지를 구성하며, HTML5에서 제공하는 다양한 입력 타입을 활용하고 있다.
특히 email, tel, url 같은 유효성 검사가 자동 적용되는 입력 타입이 새로 등장했다.
✅ 1. <input type="email"> — 이메일 입력
<input type="email" id="mail">
✔ 특징
- 이메일 형식(aaa@bbb.com)인지 기본적으로 검사해줌
- 형식이 틀리면 submit 시 경고가 나타남
- 모바일에서는 이메일 입력에 최적화된 키보드가 열림
✔ 사용 예
- 회원가입
- 아이디 찾기
- 문의 폼 등
✅ 2. <input type="tel"> — 전화번호 입력
<input type="tel" id="phone">
✔ 특징
- 전화번호 전용 입력란
- 형식 제한은 없지만 모바일에서 숫자 키패드가 자동으로 열림
- 전화번호 패턴을 강제하고 싶으면 pattern 속성과 함께 사용 가능
예:
<input type="tel" pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}">
✅ 3. <input type="url"> — 웹사이트 주소 입력
<input type="url" id="urll">
✔ 특징
- URL 형식인지 자동으로 검사 (예: https://example.com)
- 잘못된 형식이면 submit 시 경고
- 블로그 주소, 개인 홈페이지 주소 입력에 사용됨
✅ 4. <fieldset> — 입력 영역 그룹화
<fieldset>
<legend>로그인 정보</legend>
...
</fieldset>
✔ 역할
- 관련된 입력 요소들을 하나의 박스로 묶어줌
- 로그인 정보 / 개인 정보처럼 구역을 나눌 때 필수
- 시각적으로도 박스로 구분되어 읽기 편함
✅ 5. <legend> — fieldset의 제목
<legend>개인 정보</legend>
✔ 특징
- fieldset 영역의 제목
- 어떤 내용을 입력하는 구역인지 명확하게 알려줌
✨ 전체 폼 구조에서 배울 수 있는 것
태그 의미
| type="email" | 이메일 형식 자동 검사 |
| type="tel" | 전화번호 입력 (모바일 숫자 키패드) |
| type="url" | URL 형식 자동 검사 |
| <fieldset> | 입력 구역을 논리적으로 묶음 |
| <legend> | 묶은 구역의 제목 표시 |
| type="submit" | 폼 전송 버튼 |
📌 전체적으로 배운 핵심 포인트
- HTML5에서는 입력 타입에 따라 자동 검증 기능을 제공 → 올바른 형식 입력을 유도
- 모바일 환경에서 더 정확하고 편리한 입력 가능
- fieldset/legend로 폼을 구조화하면 가독성·접근성도 향상
- <label> 사용 방식도 두 가지 모두 가능
(for/id 연결 방식 & input 포함 방식)
<fieldset>
<legend>개인 정보 입력</legend>
<label for="city">지역</label>
<select name="city" id="city" multiple>
<!-- 디폴트 속성은 한개만 선택이지만 <select name="city" id="city" size="5" multiple>
이렇게 쓰면 5개가 보여지고 ctrl누르고 선택하면 여러개를 선택 가능하다다 -->
<option value="강북구">강북구</option>
<option value="깅남구">강남구</option>
<option value="서초구" selected>서초구</option>
<!-- selected 속성은 이미 선택된 것 처럼 보이는 속성 -->
<option value="중원구">중원구</option>
<option value="분당구">분당구</option>
</select>
<input type="submit" value="등록">
</fieldset>
아래는 수정된 최종 코드 multiple + selected
📌 HTML 선택 목록(select) — multiple + selected 속성 정리
이번 코드는 <select>에서
✔ 여러 개 선택 가능(multiple)
✔ 기본 선택값(selected)
등을 배우는 예제다.
✅ 1. <select multiple> — 여러 항목을 선택할 수 있는 목록
<select name="city" id="city" multiple>
✔ 역할
- 드롭다운이 아니라 리스트 박스 형태로 표시
- Ctrl(윈도우) 또는 Command(맥)을 누르고 클릭하면
여러 개 항목을 동시에 선택할 수 있음 - 선택한 모든 값이 서버로 전송됨
✔ 주의점
- multiple만 쓰면 size 기본값이 4~5 정도로 보이는 리스트 박스가 생성됨
- 직접 개수를 지정하고 싶으면 다음처럼 size를 사용할 수 있음
<select multiple size="5">
✅ 2. <option selected> — 기본으로 선택된 항목
<option value="서초구" selected>서초구</option>
✔ 역할
- 페이지가 처음 로드될 때 이미 체크된 상태처럼 보임
- 사용자가 변경하지 않아도 기본 선택값으로 제출됨
✔ 특징
- multiple과 함께 사용하면
기본으로 여러 개 선택된 상태도 가능 - selected는 여러 option에 붙여도 됨
🔎 전체 옵션 코드
<option value="강북구">강북구</option>
<option value="깅남구">강남구</option>
<option value="서초구" selected>서초구</option>
<option value="중원구">중원구</option>
<option value="분당구">분당구</option>
✅ 3. <input type="submit"> — 선택된 옵션 서버로 전송
<input type="submit" value="등록">
✔ 역할
- 목록에서 선택된 옵션들의 value 값을 서버에 전송
- multiple 사용 시 선택된 항목이 여러 개 전송됨
✨ 요약 정리
속성/태그 기능
| <select multiple> | 여러 항목을 동시에 선택 가능 |
| size="숫자" | 여러 항목을 한 번에 보여주는 리스트 박스 |
| <option> | 실제 선택 항목 |
| <option selected> | 기본으로 선택되어 보이는 옵션 |
| submit | 선택한 값 서버로 전송 |
<fieldset>
<legend>개인 정보 입력</legend>
<label for="city">지역</label>
<select name="city" id="city">
<optgroup label="서울시">
<option value="강북구">강북구</option>
<option value="깅남구">강남구</option>
<option value="서초구">서초구</option>
</optgroup>
<optgroup label="경기도 성남시">
<option value="중원구">중원구</option>
<option value="분당구">분당구</option>
</optgroup>
</select>
<input type="submit" value="등록">
</fieldset>
📌 HTML <optgroup> — 옵션을 그룹으로 묶기
<optgroup> 태그는 <select> 안의 여러 <option>들을
그룹(묶음) 형태로 정리할 때 사용한다.
대량의 옵션을 지역·카테고리 등으로 나눌 때 매우 유용하다.
✅ 1. <select> — 선택 목록의 전체 구조
<select name="city" id="city">
...
</select>
✔ 역할
- 여러 옵션 중 하나를 선택할 수 있는 드롭다운 메뉴 생성
- name 속성은 서버로 값이 전송될 때의 변수 이름
✅ 2. <optgroup> — 옵션을 카테고리별로 묶는 태그
<optgroup label="서울시">
<option>강북구</option>
<option>강남구</option>
<option>서초구</option>
</optgroup>
✔ 특징
- 옵션들을 카테고리(그룹) 단위로 구분하여 보여줌
- label 속성이 그룹 제목으로 표시됨
- 시각적으로 들여쓰기가 자동으로 적용됨
- 사용자는 label을 선택할 수 없고, 옵션만 선택 가능
✔ 언제 사용하나?
- 지역별 구분 (서울 / 경기 / 인천 등)
- 카테고리별 구분 (전자제품 / 의류 / 식품 등)
- 많은 옵션을 정리해야 할 때
🔎 코드 전체 구조 예시
<select name="city" id="city">
<optgroup label="서울시">
<option value="강북구">강북구</option>
<option value="깅남구">강남구</option>
<option value="서초구">서초구</option>
</optgroup>
<optgroup label="경기도 성남시">
<option value="중원구">중원구</option>
<option value="분당구">분당구</option>
</optgroup>
</select>
✅ 3. <option> — 실제 선택되는 항목
<option value="강북구">강북구</option>
✔ 역할
- 사용자가 선택하는 실제 값
- 화면 표시 텍스트와 서버 전송값(value) 설정 가능
🔹 4. <input type="submit"> — 제출 버튼
<input type="submit" value="등록">
폼에서 선택한 city 값을 서버로 전송하는 역할을 한다.
✨ 요약 정리
태그 설명
| <select> | 선택 목록 전체 |
| <optgroup> | 옵션들을 그룹으로 묶는 태그 |
| label="" | optgroup의 그룹 제목 |
| <option> | 실제 선택 항목 |
| submit | 선택한 항목 서버로 전송 |
여름방학 특강 신청
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>웹 폼</title>
</head>
<body>
<h1>여름방학 특강 신청</h1>
<br>
<fieldset>
<legend>수강 신청인</legend>
<ul>
<li>
<label for="hak">학번</label>
<input type="text" id="hak">
</li>
<li>
<label for="user_name">이름</label>
<input type="text" id="user_name">
</li>
<li>
<label for="sclass">학과</label>
<select name="sclass" id="sclass">
<optgroup label="공과대학">
<option value="건축공학과" selected>건축공학과</option>
<option value="기계공학과">기계공학과</option>
<option value="전기전자공학과">전기전자공학과</option>
<option value="컴퓨터공학과">컴퓨터공학과</option>
<option value="화학공학과">화학공학과</option>
</optgroup>
<optgroup label="인문대학">
<option value="사학과">사학과</option>
<option value="어문학부">어문학부</option>
<option value="철학">철학</option>
</optgroup>
</select>
</li>
</ul>
</fieldset>
</body>
</html>
핵심 태그는 fieldset / legend / select / optgroup / option 이다.
📌 여름방학 특강 신청 폼 — HTML 태그 설명
이 예제는 입력 폼 구조를 만들면서,
**선택 목록을 그룹으로 나누는 방법(optgroup)**까지 포함하고 있다.
✅ 1. <fieldset> — 입력 구역을 묶는 태그
<fieldset>
...
</fieldset>
✔ 기능
- 여러 입력 요소를 **하나의 구역(그룹)**으로 묶어줌
- 시각적으로 테두리가 생겨 구역이 분리됨
- 폼이 복잡해질수록 필수적인 구조
✅ 2. <legend> — fieldset의 제목
<legend>수강 신청인</legend>
✔ 특징
- fieldset의 제목 표시
- 어떤 정보를 입력하는 영역인지 사용자가 쉽게 알 수 있음
✅ 3. <select> — 선택 목록(드롭다운)
<select name="sclass" id="sclass">
...
</select>
✔ 특징
- 여러 항목 중 하나를 선택할 때 사용
- name 속성은 서버로 전달되는 변수 이름
- id는 label과 연결할 때 사용
✅ 4. <optgroup> — 옵션을 카테고리별로 묶기
<optgroup label="공과대학">
<option>건축공학과</option>
<option>기계공학과</option>
</optgroup>
✔ 특징
- 옵션 목록을 **대학 단위(공과대학 / 인문대학)**처럼 그룹으로 묶어서 보여줌
- label 속성에 그룹 이름을 넣는다
- optgroup은 선택할 수 없고, option만 선택 가능
- 많은 옵션을 정리하는 데 매우 효율적
✔ 장점
- 보기 편하고 구조적
- 사용자가 항목을 쉽게 찾을 수 있음
- 폼의 가독성 향상
✅ 5. <option> — 실제 선택하는 항목
<option value="건축공학과" selected>건축공학과</option>
✔ 특징
- value → 서버로 전송되는 값
- 태그 안의 텍스트 → 화면에 표시되는 이름
- selected → 기본으로 선택되어 보이도록 설정
이 코드에서는 "건축공학과"가 기본 선택값이다.
✨ 전체 구조 설명
이 폼은 공과대학 / 인문대학을 optgroup으로 묶어
사용자가 자신의 학과를 쉽게 고를 수 있게 만든 구조다.
구조는 다음처럼 나뉜다:
수강 신청인 정보 입력
├─ 학번 입력
├─ 이름 입력
└─ 학과 선택 (공과대학 + 인문대학 그룹)
📝 요약 정리
태그 역할
| <fieldset> | 입력 요소들을 하나의 묶음으로 구성 |
| <legend> | 묶음의 제목 |
| <select> | 선택 목록 전체 |
| <optgroup> | 옵션을 그룹으로 분류 |
| <option> | 실제 선택 값, 화면에 표시되는 항목 |
| selected | 기본 선택 상태 표시 |
<button type="submit">
<img src="../images/login.png" alt="페이스북 버튼">
페이스북에 등록하기
</button>
📌 HTML <button> 태그 — 이미지 + 텍스트 버튼 만들기
이번 코드는 <button> 태그 안에 이미지 + 텍스트를 함께 넣는 방식으로
사용자에게 더 풍부한 UI 버튼을 제공하는 예제이다.
✅ 1. <button type="submit"> — 폼 제출 버튼
<button type="submit">
...
</button>
✔ 특징
- 클릭하면 **폼을 제출(submit)**하는 역할
- <input type="submit">과 동일한 기능을 수행하지만
button은 내부에 다양한 요소(img, span, strong 등)를 자유롭게 넣을 수 있다는 장점이 있다. - 디자인 다양화에 매우 적합
✔ 언제 사용하나?
- 아이콘 + 텍스트 버튼
- 이미지 기반 버튼
- 스타일링이 필요한 submit 버튼
- SNS 로그인 버튼 등
✅ 2. 버튼 내부에 이미지 넣기
<img src="../images/login.png" alt="페이스북 버튼">
✔ 특징
- 버튼 내부에 이미지를 삽입하여 아이콘 형태의 버튼을 만들 수 있음
- alt 속성은 이미지가 보이지 않을 때 대체 텍스트를 제공
- 이미지와 텍스트가 함께 표시되므로 시각적으로 더 풍부한 버튼 구성 가능
✅ 3. 버튼 내부 텍스트
페이스북에 등록하기
✔ 특징
- 이미지 오른쪽에 텍스트가 표시됨
- SNS 로그인, 소셜 등록 같은 버튼을 직관적으로 안내할 수 있음
✨ 전체 코드 구조
<button type="submit">
<img src="../images/login.png" alt="페이스북 버튼">
페이스북에 등록하기
</button>
📌 <button> vs <input type="submit"> 비교
항목 <button> <input type="submit">
| 내부에 콘텐츠 삽입 가능? | 가능(img, span 등) | 불가능(텍스트만 가능) |
| 디자인 자유도 | 매우 높음 | 제한적 |
| 텍스트만 넣기 | 가능 | 가능 |
| 이미지 버튼 만들기 | ✔ 매우 쉬움 | ✖ 속성으로 이미지 지정 불가 |
따라서 지금처럼 이미지와 텍스트를 함께 넣는 버튼을 만들고 싶으면
<button> 태그가 훨씬 적합하다.
📝 요약
- <button>은 submit 기능 뿐 아니라 내부에 이미지·텍스트·아이콘 자유롭게 포함이 가능
- SNS 로그인 버튼, 스타일 있는 버튼, 아이콘 버튼 등에 많이 사용됨
- <input type="submit">보다 디자인 구성에 훨씬 유리함
<fieldset>
<legend>개인 정보 입력</legend>
<label for="city">지역</label>
<select name="city" id="city">
<optgroup label="서울시">
<option value="강북구">강북구</option>
<option value="깅남구">강남구</option>
<option value="서초구">서초구</option>
</optgroup>
<optgroup label="경기도 성남시">
<option value="중원구" disabled>중원구</option>
<option value="분당구">분당구</option>
</optgroup>
</select>
<input type="submit" value="등록">
</fieldset>
아래는 option에 사용된 disabled 속성만 정리한 설명이야!
📌 <option disabled> — 선택할 수 없게 만드는 속성
HTML의 <option> 태그에서 disabled 속성을 사용하면
해당 항목을 선택 불가능한 상태로 만들 수 있다.
✅ 1. 기본 예시
<option value="중원구" disabled>중원구</option>
✅ 2. disabled의 특징
✔ 1) 선택할 수 없다
- 드롭다운 목록에 표시되지만
사용자는 이 항목을 선택할 수 없다.
✔ 2) 보통 흐린 색(비활성화된 상태)으로 표시됨
- 브라우저에서 자동으로 스타일이 적용되어
선택 불가 항목이라는 것을 바로 알 수 있음.
✔ 3) 폼 제출 시 전송되지 않음
- 선택이 불가능하므로 값이 서버로 전송될 일도 없다.
✔ 4) 안내 목적, 구분용으로도 사용 가능
예)
- “현재 신청 마감된 지역”
- “업데이트 예정 옵션”
- “선택 불가 안내 항목”
✨ 언제 쓰면 좋을까?
- 특정 옵션을 임시로 비활성화해야 할 때
- 공지 또는 안내용 옵션을 넣되 선택 불가로 둘 때
- 유효하지 않은 선택지를 드롭다운에서 표시만 하고 싶을 때
📝 요약
속성 기능
| disabled | 해당 option을 선택할 수 없도록 비활성화 |
<fieldset>
<legend>블로그 글쓰기</legend>
<p> <label for="title"> 제목 <input type="text" id="title" name="title" value="제목입니다." readonly> </label> </p>
<p> <label for="desc">내용 <textarea id="desc" name="desc" rows="5" cols="30" placeholder="150자 내로 입력해주세요요"></textarea>
</label> </p>
</fieldset>
<!-- 2번째 코드 -->
<form action="" method=""> <input type="hidden" value="사이트를 통한 직접 로그인"> <label>아이디: <input
type="text" id="user_id" size="5" autofocus required></label> <label>비밀번호: <input type="password" id="user_pw"
size="10" value="비밀번호"></label> <input type="image" src="../images/login.png" alt="로그인"> </form>
아래는 두 개의 코드 전체를 기준으로,
요청한 네 가지 속성(required / autofocus / readonly / placeholder)만 정리해준 설명이야!
📌 HTML 입력 속성 4가지 정리
(required · autofocus · readonly · placeholder)
이 속성들은 사용자의 입력을 도와주거나 입력 방식을 제한하는 역할을 한다.
특히 폼 검증과 편의성 향상에 자주 사용된다.
✅ 1. required — 필수 입력 항목 지정
<input type="text" id="user_id" required>
✔ 기능
- 반드시 입력해야만 폼 제출이 가능함
- 값이 비어 있으면 브라우저가 자동으로 경고 메시지 표시
- 자바스크립트 없이도 기본적인 폼 검증 가능
✔ 언제 사용?
- 회원가입 아이디, 비밀번호
- 이메일 입력 필드
- 필수 입력값이 필요한 모든 상황
✅ 2. autofocus — 페이지 로드시 자동 포커스 지정
<input type="text" id="user_id" autofocus>
✔ 기능
- 페이지가 로드되면 해당 입력창에 자동으로 커서가 위치
- 사용자가 바로 입력할 수 있어 편리
✔ 사용 예
- 로그인 페이지 아이디 입력창
- 검색창
- 가장 먼저 입력해야 하는 필드
✅ 3. readonly — 읽기 전용(수정 불가)
<input type="text" value="제목입니다." readonly>
✔ 기능
- 내용은 보이지만 사용자가 수정할 수 없다
- 폼 제출 시 값은 서버로 그대로 전송됨
- 비활성화(disabled)과 가장 큰 차이점:
✔ disabled는 제출되지 않지만
✔ readonly는 제출된다
✔ 사용 예
- 자동 생성된 게시글 번호
- 수정 불가한 제목/아이디 표시
- 시스템이 제공한 값만 보여주고 싶을 때
✅ 4. placeholder — 입력 안내문 표시
<textarea placeholder="150자 내로 입력해주세요"></textarea>
✔ 기능
- 입력란이 비어 있을 때 회색 안내 문구 표시
- 사용자가 어떻게 입력해야 하는지 예시를 보여줌
- 입력이 시작되면 placeholder는 사라짐
✔ 사용 예
- “이름을 입력하세요”
- “검색어를 입력하세요”
- “150자 이내로 작성해 주세요” (현재 코드처럼)
✨ 네 가지 속성 차이 한눈에 보기
속성 기능
| required | 반드시 입력해야 제출 가능 |
| autofocus | 페이지 로드 시 자동으로 커서 위치 |
| readonly | 값 수정 불가하지만 제출 가능 |
| placeholder | 입력 안내 예시 텍스트 표시 |
📌 참고 코드 안에 등장한 위치
✔ readonly → 첫 번째 코드의 제목 입력창
<input type="text" value="제목입니다." readonly>
✔ placeholder → 첫 번째 코드의 textarea
<textarea placeholder="150자 내로 입력해주세요"></textarea>
✔ autofocus → 두 번째 코드의 아이디 입력창
<input type="text" autofocus>
✔ required → 두 번째 코드의 아이디 입력창
<input type="text" required>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form>
<h1>회원 가입을 환영합니다</h1>
<fieldset>
<legend>사용자 정보</legend>
<ul style="list-style: none;">
<li>
<label style="width: 300px; display: inline-block;">아이디: <input type="text" id="user_id"
placeholder="4자 ~ 10자 사이, 공백없이" autofocus></label>
</li>
<li>
<label for="mail" style="width: 300px; display: inline-block;">이메일
<input type="email" id="mail" required></label>
</li>
<li>
<label style="width: 300px; display: inline-block;">비밀번호: <input type="password" id="user_pw"
placeholder="문자와 숫자, 특수 기호 포함" required></label>
</li>
<li>
<labelstyle="width: 300px; display: inline-block;">비밀번호 확인:
<input type="password" id="user_pw_check" size="10" required></labelstyle=>
</li>
<li>
<label for="haddress"style="width: 300px; display: inline-block;">가입경로</label>
<select id="haddress">
<option value="blog" selected>블로그</option>
<option value="search">검색</option>
<option value="sns">SNS</option>
<option value="etc">기타</option>
</select>
</li>
<li>
<label for="memo"style="width: 300px; display: inline-block;">메모
<textarea id="memo" rows="4" cols="40" placeholder="남길 말씀이 있다면 여기에"></textarea>
</label>
</li>
</fieldset>
<fieldset>
<legend>이벤트와 새로운 소식</legend>
<label><input type="radio" name="s_mail" value="yes">메일 수신</label>
<label><input type="radio" name="s_mail" value="no" checked>메일 수신 안 함</label>
</fieldset>
<input type="submit" value="가입하기">
<input type="reset" value="취소">
<hr>
<input type="button" value="가입하기">
<input type="button" value="취소">
</form>
</body>
</html>
📌 회원가입 폼 설명 (라벨 정렬 버전)
이번 버전에서는
✔ <label>과 <input>을 분리
✔ display: inline-block을 사용해 라벨을 정확한 위치에 정렬
하는 방식으로 UI가 훨씬 깔끔해졌다.
HTML 폼 구성 요소와 입력 속성을 배우는 데 매우 좋은 예제이다.
✅ 1. <fieldset> & <legend> — 입력 구역 묶기
두 영역으로 나뉜다.
✔ 사용자 정보 입력 구역
<fieldset>
<legend>사용자 정보</legend>
...
</fieldset>
- 관련된 입력 요소를 하나의 박스로 묶어 가독성 증가
- legend는 제목 역할
✔ 이벤트 수신 여부 구역
<fieldset>
<legend>이벤트와 새로운 소식</legend>
...
</fieldset>
- 라디오 버튼으로 선택하도록 구성
- 회원가입 폼에서 자주 사용하는 패턴
✅ 2. 리스트 스타일 제거
<ul style="list-style: none;">
- li 앞의 점(●)을 제거
- 정돈된 입력폼 형태로 보이게 함
✅ 3. 라벨 정렬을 위한 display: inline-block
각 label에 다음 스타일이 들어가 있다:
<label style="width: 100px; display: inline-block;">
✔ 효과
- 라벨이 고정 너비(100px) 를 갖도록 설정
- label이 inline이지만 block처럼 너비를 가짐 → 깔끔한 좌우 정렬
- 입력창들이 모두 똑같은 위치에서 시작됨
- 폼 UI가 정리되어 전문적인 양식처럼 보임
✅ 4. 개별 입력 요소 설명
✔ 아이디
<input type="text" placeholder="4자 ~ 10자 사이, 공백없이" autofocus>
- placeholder: 입력 예시
- autofocus: 페이지 로드 시 자동 커서 이동
- 가장 먼저 입력해야 하는 항목에 적합
✔ 이메일
<input type="email" required>
- 이메일 형식 자동 검사
- required: 입력 필수
✔ 비밀번호 / 비밀번호 확인
<input type="password" placeholder="문자와 숫자, 특수 기호 포함" required>
- 입력 내용 숨김
- placeholder로 요구 형식 제시
- required로 필수 입력 설정
✔ 가입경로 (select)
<select id="haddress">
<option value="blog" selected>블로그</option>
<option value="search">검색</option>
<option value="sns">SNS</option>
<option value="etc">기타</option>
</select>
- 드롭다운 메뉴 제공
- selected로 기본 선택값 설정
- value는 제출 시 서버로 전달되는 값
✔ 메모
<textarea id="memo" rows="4" cols="40" placeholder="남길 말씀이 있다면 여기에"></textarea>
- 여러 줄 입력 가능
- cols=40으로 넓게 설정
- placeholder로 설명 제공
✅ 5. 이벤트 수신 여부 (radio)
<input type="radio" name="s_mail" value="yes">
<input type="radio" name="s_mail" value="no" checked>
✔ 특징
- 같은 name → 둘 중 하나만 선택
- checked: 기본 선택(메일 수신 안 함)
✅ 6. 세 가지 버튼의 차이
✔ 제출 버튼 (폼 전송)
<input type="submit" value="가입하기">
✔ 초기화 버튼 (입력값 삭제)
<input type="reset" value="취소">
✔ 일반 버튼 (기능 없음)
<input type="button" value="가입하기">
<input type="button" value="취소">
- 클릭해도 아무 일 없음
- JavaScript 이벤트 추가할 때 사용
✨ 이번 버전에서 새롭게 배운 핵심
요소 설명
| display: inline-block | 라벨을 일정한 너비로 정렬 |
| placeholder | 입력 안내 메시지 |
| autofocus | 자동 커서 이동 |
| required | 필수 입력 지정 |
| select + option | 드롭다운 옵션 제공 |
| textarea | 여러 줄 텍스트 입력 |
| radio | 단일 선택 옵션 |
| 번호 | 상품명 | 수량 | 가격 |
|---|---|---|---|
| 1 | 콜라 | 1개 | 1,500원 |
| 2 | 사이다 | 2개 | 1,000원 |
| 3 | 탄산수 | 3개 | 1,000원 |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>table</title>
<style>
table{
border-collapse: collapse;
}
th, td {
border: 1px solid #ccc;
text-align: center;
}
</style>
</head>
<body>
<!-- 테이블의 시작을 의미 -->
<table>
<tr>
<th>번호</th>
<th>상품명</th>
<th>수량</th>
<th>가격</th>
</tr>
<tr>
<td>1</td>
<td>콜라</td>
<td>1개</td>
<td>1,500원</td>
</tr>
<tr>
<td>2</td>
<td>사이다</td>
<td>2개</td>
<td>1,000원</td>
</tr>
<tr>
<td>3</td>
<td>탄산수</td>
<td>3개</td>
<td>1,000원</td>
</tr>
</table>
</body>
</html>
📌 이번 코드에서 새로 배운 태그만 정리
✅ 1. <table> — 표를 만드는 태그
<table> ... </table>
✔ 역할
- 하나의 표(table)를 만든다.
- 내부에 <tr>, <th>, <td>를 포함하여 구조를 구성한다.
✅ 2. <tr> — 표의 한 줄(행)
<tr>
<td>1</td>
<td>콜라</td>
...
</tr>
✔ 역할
- table row → 표의 가로줄을 의미한다.
- 한 개의 <tr> 안에 여러 개의 <th> 또는 <td>가 들어간다.
✅ 3. <th> — 표의 제목 셀(헤더 셀)
<th>번호</th>
<th>상품명</th>
✔ 특징
- table header → 표의 제목(헤더) 역할
- 기본적으로 글자가 굵게(bold)
- 기본적으로 가운데 정렬(center)
- 제목을 표시할 때 사용
⚡ <td>는 이미 오래전에 배운 기본 태그이므로 제외!
추가 — 스타일 속성(선택)
CSS에서는 새로운 속성 하나가 등장했어.
✅ 4. border-collapse: collapse; — 테이블 선을 하나로 합침
table {
border-collapse: collapse;
}
✔ 기능
- 테이블 셀(td, th) 사이의 이중선(double border)을 하나의 선으로 합치는 역할
- 테이블이 훨씬 깔끔하게 보임
✨ 요약 표
태그/속성 역할
| <table> | 표 전체 생성 |
| <tr> | 표의 행 생성 |
| <th> | 제목 셀(헤더) |
| border-collapse: collapse | 테이블 선을 하나로 합쳐 깔끔하게 표시 |
| 브라우저 | 제조업체 | 다운로드 |
|---|---|---|
| 크롬(Chrome) | https://www.google.com/chrome/ | |
| 파이어폭스(Firefox) | Mozilla | https://www.mozilla.org/ko/firefox/ |
| 엣지(Edge) | Microsoft | https://www.microsoft.com/ko-kr/windows/microsoft-edge |
<table border="1">
<caption>국내에서 자주 사용하는 <b>모던 브라우저</b></caption>
<tr>
<th>브라우저</th>
<th>제조업체</th>
<th>다운로드</th>
</tr>
<tr>
<th>크롬(Chrome)</th>
<td>Google</td>
<td>https://www.google.com/chrome/</td>
</tr>
<tr>
<th>파이어폭스(Firefox)</th>
<td>Mozilla</td>
<td>https://www.mozilla.org/ko/firefox/</td>
</tr>
<tr>
<th>엣지(Edge)</th>
<td>Microsoft</td>
<td>https://www.microsoft.com/ko-kr/windows/microsoft-edge</td>
</tr>
</table>
즉, <table>, <tr>, <td>, <th> 같은 기본 태그는 제외하고, 새로 등장한 태그만 설명!
✅ 이번 코드에서 새롭게 등장한 태그
✔ 1) <caption>
테이블의 제목(표 제목)을 표시하는 태그
역할
- 테이블 위쪽에 ‘표의 제목’을 표시해준다.
- 표를 설명하는 문장을 넣을 때 사용한다.
- 기본적으로 <table> 바로 안쪽 첫 줄에 위치해야 한다.
예시(이번 코드)
<caption>국내에서 자주 사용하는 <b>모던 브라우저</b></caption>
특징
- 테이블의 제목이기 때문에 표와 자연스럽게 연결된 제목처럼 보임
- CSS로 caption-side: bottom; 같이 위치도 변경 가능(기본은 top)
✔ 2) <b>
글자를 굵게(볼드) 표시하는 태그
역할
- 텍스트를 단순히 시각적으로 굵게(bold) 보여줌
- 의미를 강조하는 태그는 아님(시각 효과만 있음)
예시
<b>모던 브라우저</b>
특징
- 의미 강조는 <strong>이 더 적절하지만
단순히 ‘굵게 보기’만 원할 때는 <b> 사용
📌 요약 (이번 코드에서 새롭게 등장한 태그)
태그 의미 설명
| <caption> | 표 제목 | 테이블의 제목을 만드는 태그 |
| <b> | 굵은 글씨 | 텍스트를 굵게 표시 (시각효과만 있음) |
border="1" 도 새로 배운 내용으로 포함해서 설명
✅ border="1" 설명
✔ 이것은 HTML 태그가 아니라 'HTML 속성(attribute)'이기 때문
앞에서 너가 "새로운 태그만 설명해줘" 라고 했기 때문에
나는 <caption>, <b> 같은 태그(tag) 만 골라서 설명했어.
border는 태그가 아니라 속성(attribute) 이라서 일부러 설명에서 제외한 거야.
✅ 그럼 border="1"은 무엇인가?
✔ 1) <table> 태그의 HTML 속성(attribute)
<table border="1">
✔ 2) 테이블 외곽선(선) 두께를 지정함
- border="1" → 얇은 선(1px 정도)
- border="0" → 테이블 선 없음
- HTML4 시절 방식이며, 최근에는 CSS 사용을 권장함
✅ 요즘 방식(CSS)
HTML 속성 대신 CSS를 이렇게 사용해:
<table style="border: 1px solid #000;">
또는 CSS에 따로 정의:
table {
border: 1px solid black;
border-collapse: collapse;
}
'대우개발원 수업 내용 > 웹표준기술(HTML)' 카테고리의 다른 글
| 웹표준기술 4일 (1) | 2025.12.03 |
|---|---|
| 웹표준기술 2일차 (0) | 2025.12.01 |
| 웹표준기술 1일차 (0) | 2025.12.01 |